zoukankan      html  css  js  c++  java
  • Servlet中Request用法和API

    1.Request概述
    --用户通过浏览器访问服务器时,Tomcat将HTTP请求中所有的信息都封装在Request对象中
    --作用:开发人员可以通过request对象方法,来获取浏览器发送的所有信息.

     2.Request体系结构

    ServletRequest
        |
    HttpServletRequest
        |
    org.apache.catalina.connector.RequestFacade(由tomcat厂商提供)

    3.Request获取Http请求信息

    String getMethod()  获取请求方式 GET
    String getContextPath() 获取项目网络地址(虚拟路径)
    String getRequestURI() 统一资源标识符(范围广)
    StringBuffer getRequestURL() 获取URL(统一资源定位符)
    String getProtocol() 获取协议和版本号 HTTP/1.1
    String getRemoteAddr() 获取客户端ip地址
    getLocalAddr() 获取用户ip地址
    解决post提交方式的乱码:request.setCharacterEncoding("UTF-8");
    解决get提交的方式的乱码:parameter = new String(parameter.getbytes("iso8859-1"),"utf-8");
    String getHeader(String name) 根据请求头的名称获取对应的值,注意:不区分大小写
    Enumeration<String> getHeaderNames() 获取所有请求头的名称--注意:Iterator前身迭代器
    req.setCharacterEncoding("utf-8");
    System.out.println("请求方式=" + req.getMethod());
    System.out.println("项目名=" + req.getContextPath());
    System.out.println("当前访问相对目录=" + req.getRequestURI());
    System.out.println("当前访问绝对路径=" + req.getRequestURL());
    System.out.println("http版本号=" + req.getProtocol());
    System.out.println("获取用户ip地址=" + req.getLocalAddr());
    System.out.println("获取ip地址=" + req.getRemoteAddr());
    //
    System.out.println("两个绝对路径=");
    System.out.println(this.getServletContext().getRealPath("/"));
    System.out.println(req.getSession().getServletContext().getRealPath("/"));
    String path = req.getContextPath();
    String basePath = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + path + "/";
    System.out.println("拼接获取服务器加模块名=" + basePath);
    //获取请求头
    String header = req.getHeader("Host");
    System.out.println(header);
    Enumeration<String> headerNames = req.getHeaderNames();
    while (headerNames.hasMoreElements()) {
       String sname = headerNames.nextElement();
       String header1 = req.getHeader(sname);
       System.out.print(sname + "::" + header1);
    }

    结果 (省略一堆header值)

    请求方式=GET
    项目名=/web08_servlet_anno
    当前访问相对目录=/web08_servlet_anno/indexServlet
    当前访问绝对路径=http://localhost:8080/web08_servlet_anno/indexServlet
    http版本号=HTTP/1.1
    获取用户ip地址=0:0:0:0:0:0:0:1
    获取ip地址=0:0:0:0:0:0:0:1
    两个绝对路径=
    G:ouClassartifactsweb08_servlet_anno_war_exploded
    G:ouClassartifactsweb08_servlet_anno_war_exploded
    拼接获取服务器加模块名=http://localhost:8080/web08_servlet_anno/
    localhost:8080
    //header....

    注意:在jsp中获取静态路径使用的是 

    req.getContextPath()

    对应jsp

    ${pageContext.request.contextPath}或<%=request.getContextPath()%>

    详情查看  https://www.cnblogs.com/xiaozhang666/p/13355474.html

    4.获取请求参数

    --不论get还是post请求方式,都可以使用下列方法来获取请求参数
    --在web阶段,get和post方法处理的业务逻辑是一样的...

    --根据参数名获取参数值
    String getParameter(String name) --根据参数名获取参数值数组 例如 hobby=somke&hobby=drink String[] getParameterValues(String name) --获取所有的参数名和参数值,封装map集合(key参数名,value参数值) Map<String,String[]> getParameterMap()
    --前端传值为数组时
    String[] likeList = request.getParameterValues("likearr[]");
    --get:在tomcat8及以上版本,内部url编码(UTF-8)
    post:编码和解码格式不统一,产生乱码...
    浏览器  编码:UTF-8
    服务器默认 解码:ISO-8859-1 西欧(拉丁文)
    指定服务器解码方式
    void setCharacterEncoding(String env)
    注意:这哥们必须在post方法的行首
    //中文乱码
    request.setCharacterEncoding("utf-8");
    //获取参数
    String name = request.getParameter("name");
    String pwd = request.getParameter("pwd");
    String[] likes = request.getParameterValues("like");
    String[] likeList = request.getParameterValues("likearr[]");

    5.请求转发

    * API
      1.通过reuqest对象获取转发器对象
      RequestDispatcher getRequestDispatcher(String path)
      2.通过转发器对象,实现请求转发
      void forward(ServletRequest request, ServletResponse response) 
    * 请求转发特点
      浏览器地址栏没有发生改变
      浏览器只发送了一次请求(request、response只创建一次,多个转发的servlet共享)
      只能转发服务器内部资源
    * 链式编程
      request.getRequestDispatcher("/BServlet").forward(request, response); 

    6.域对象(共享数据)

    --域对象:一个有作用范围的对象,可以在范围内共享数据
    --request域:代表一次请求的范围,一般用于一次请求中转发的多个资源中共享数据

    * API
      1.存数据
      void setAttribute(String name,Object o);
      2.取数据
      Object getAttribute(String name);
      3.删数据
      void removeAttribute(String name);
    * 生命周期
      1.创建?
      用户发送请求时,创建request
      2.销毁?
      服务器做出响应,销毁request
      3.范围?
      一次请求,多次转发

    7.获取ServletContext对象

    public  ServletContext getServletContext();

    此对象为Servlet上下文对象,只会创建一个

    补充案例和api

    视频防盗链

    /*
      视频播放源,判断...
    */
    @WebServlet("/RefererRequest")
    public class RefererRequest extends HttpServlet {
      @Override
      protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws
    ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        // 1.获取请求来源信息(注意:如果浏览器直接访问,这个头返回的值为null)
        String referer = req.getHeader("referer");
        // 2.判断是否为家族体系访问源
        if (referer != null &&
    referer.startsWith("http://localhost:8080/web09_request")) {
          resp.getWriter().write("<h3>正常播放视频...</h3>");
       } else {
          resp.getWriter().write("<h3>想看吗?来腾讯把...</h3>");
       }
     }
      @Override
      protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws
    ServletException, IOException {
     }
    }

    浏览器兼容性
    user-agent:获取浏览器版本信息

    /*
      浏览器兼容性
    */
    @WebServlet("/UserAgentRequest")
    public class UserAgentRequest extends HttpServlet {
      @Override
      protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws
    ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        // 1.获取浏览器信息
        String userAgent = req.getHeader("user-agent");
        // 2.判断
        if (userAgent.contains("Chrome")) {
          resp.getWriter().write("谷歌体系浏览器");
       } else if (userAgent.contains("Firefox")) {
          resp.getWriter().write("火狐体系浏览器");
       } else {
          resp.getWriter().write("其他体系浏览器");
       }
     }
      @Override
      protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws
    ServletException, IOException {
     }
    }
    request.getServletPath()    获取客户端请求的路径名如:/object/delObject
    request.getServerName()  获取服务器地址,如:localhost
    request.getServerPort()    获取服务器端口,如8080
    request.getLocalName()    获取本地IP映射名,如:localhost
    request.getLocalPort()    获取本地端口,如:8090
    request.getRealPath("/")    获取项目所在服务器的全路径,如:D:Program Filesapache-tomcat-7.0.25webappsTestSytem
    request.getRemoteAddr()    获取远程主机地址,如:127.0.0.1
    request.getRemoteHost()    获取远程主机,如:127.0.0.1
    request.getRemotePort()    获取远程客户端端口,如:3623
    request.getRequestedSessionId()    获取会话session的ID,如:823A6BACAC64FB114235CBFE85A46CAA
    request.getRequestURI()    获取包含项目名称的请求路径,如:/TestSytem/object/delObject
    request.getRequestURL().toString()    获取请求的全路径,如:http://localhost:8090/TestSytem/object/delObject
  • 相关阅读:
    sharepoint的webpart开发
    触发器-插入不重复数据2
    触发器-插入不重复数据
    InfoPath本地发布及部署
    从30岁到35岁:为你的生命多积累一些厚度
    js中的forin
    js中的prototye
    无法绑定由多个部分组成的标示符
    Spring注入方式及用到的注解
    ( 转)mappingResource属性和mappingDirectoryLocations属性的使用
  • 原文地址:https://www.cnblogs.com/xiaozhang666/p/13356690.html
Copyright © 2011-2022 走看看