zoukankan      html  css  js  c++  java
  • 四:HttpServletRequest对象

    一、HttpServletRequest介绍

      HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。

    二、Request常用方法

    2.1、获得客户机信息

      getRequestURL方法返回客户端发出请求时的完整URL。
      getRequestURI方法返回请求行中的资源名部分。
      getQueryString 方法返回请求行中的参数部分。
      getPathInfo方法返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头。
      getRemoteAddr方法返回发出请求的客户机的IP地址。
      getRemoteHost方法返回发出请求的客户机的完整主机名。
      getRemotePort方法返回客户机所使用的网络端口号。
      getLocalAddr方法返回WEB服务器的IP地址。
      getLocalName方法返回WEB服务器的主机名。

    范例:通过request对象获取客户端请求信息

    package gacl.request.study;
    import java.io.IOException;
    import java.io.PrintWriter;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    /**
     * @author gacl
     * 通过request对象获取客户端请求信息
     */
    public class RequestDemo01 extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            /**
             * 1.获得客户机信息
             */
            String requestUrl = request.getRequestURL().toString();//得到请求的URL地址
            String requestUri = request.getRequestURI();//得到请求的资源
            String queryString = request.getQueryString();//得到请求的URL地址中附带的参数
            String remoteAddr = request.getRemoteAddr();//得到来访者的IP地址
            String remoteHost = request.getRemoteHost();
            int remotePort = request.getRemotePort();
            String remoteUser = request.getRemoteUser();
            String method = request.getMethod();//得到请求URL地址时使用的方法
            String pathInfo = request.getPathInfo();
            String localAddr = request.getLocalAddr();//获取WEB服务器的IP地址
            String localName = request.getLocalName();//获取WEB服务器的主机名
            response.setCharacterEncoding("UTF-8");//设置将字符以"UTF-8"编码输出到客户端浏览器
            //通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码
            response.setHeader("content-type", "text/html;charset=UTF-8");
            PrintWriter out = response.getWriter();
            out.write("获取到的客户机信息如下:");
            out.write("<hr/>");
            out.write("请求的URL地址:"+requestUrl);
            out.write("<br/>");
            out.write("请求的资源:"+requestUri);
            out.write("<br/>");
            out.write("请求的URL地址中附带的参数:"+queryString);
            out.write("<br/>");
            out.write("来访者的IP地址:"+remoteAddr);
            out.write("<br/>");
            out.write("来访者的主机名:"+remoteHost);
            out.write("<br/>");
            out.write("使用的端口号:"+remotePort);
            out.write("<br/>");
            out.write("remoteUser:"+remoteUser);
            out.write("<br/>");
            out.write("请求使用的方法:"+method);
            out.write("<br/>");
            out.write("pathInfo:"+pathInfo);
            out.write("<br/>");
            out.write("localAddr:"+localAddr);
            out.write("<br/>");
            out.write("localName:"+localName);
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
        }
    
    }

    运行结果:

    2.2、获得客户机请求头

      getHeader(string name)方法:String 
      getHeaders(String name)方法:Enumeration 
      getHeaderNames()方法

    范例:通过request对象获取客户端请求头信息

    package gacl.request.study;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Enumeration;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    /**
     * @author gacl
     * 获取客户端请求头信息
     * 客户端请求头:
     * 
     */
    public class RequestDemo02 extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            response.setCharacterEncoding("UTF-8");//设置将字符以"UTF-8"编码输出到客户端浏览器
            //通过设置响应头控制浏览器以UTF-8的编码显示数据
            response.setHeader("content-type", "text/html;charset=UTF-8");
            PrintWriter out = response.getWriter();
            Enumeration<String> reqHeadInfos = request.getHeaderNames();//获取所有的请求头
            out.write("获取到的客户端所有的请求头信息如下:");
            out.write("<hr/>");
            while (reqHeadInfos.hasMoreElements()) {
                String headName = (String) reqHeadInfos.nextElement();
                String headValue = request.getHeader(headName);//根据请求头的名字获取对应的请求头的值
                out.write(headName+":"+headValue);
                out.write("<br/>");
            }
            out.write("<br/>");
            out.write("获取到的客户端Accept-Encoding请求头的值:");
            out.write("<hr/>");
            String value = request.getHeader("Accept-Encoding");//获取Accept-Encoding请求头对应的值
            out.write(value);
            
            Enumeration<String> e = request.getHeaders("Accept-Encoding");
            while (e.hasMoreElements()) {
                String string = (String) e.nextElement();
                System.out.println(string);
            }
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
        }
    
    }

    运行结果如下:

    2.3、获得客户机请求参数(客户端提交的数据)

    • getParameter(String)方法(常用)
    • getParameterValues(String name)方法(常用)
    • getParameterNames()方法(不常用)
    • getParameterMap()方法(编写框架时常用)
    package gacl.request.study;
    import java.io.IOException;
    import java.text.MessageFormat;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    /**
     * @author gacl
     * 获取客户端通过Form表单提交上来的参数
     */
    public class RequestDemo03 extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            //客户端是以UTF-8编码提交表单数据的,所以需要设置服务器端以UTF-8的编码进行接收,否则对于中文数据就会产生乱码
            request.setCharacterEncoding("UTF-8");
            /**
             * 编&nbsp;&nbsp;号(文本框):
               <input type="text" name="userid" value="NO." size="2" maxlength="2">
             */
            String userid = request.getParameter("userid");//获取填写的编号,userid是文本框的名字,<input type="text" name="userid">
            /**
             * 用户名(文本框):<input type="text" name="username" value="请输入用户名">
             */
            String username = request.getParameter("username");//获取填写的用户名
            /**
             * 密&nbsp;&nbsp;码(密码框):<input type="password" name="userpass" value="请输入密码">
             */
            String userpass = request.getParameter("userpass");//获取填写的密码
            String sex = request.getParameter("sex");//获取选中的性别
            String dept = request.getParameter("dept");//获取选中的部门
            //获取选中的兴趣,因为可以选中多个值,所以获取到的值是一个字符串数组,因此需要使用getParameterValues方法来获取
            String[] insts = request.getParameterValues("inst");
            String note = request.getParameter("note");//获取填写的说明信息
            String hiddenField = request.getParameter("hiddenField");//获取隐藏域的内容
    
    }

    在服务器端使用getParameterNames方法接收表单参数,代码如下:

     Enumeration<String> paramNames = request.getParameterNames();//获取所有的参数名
             while (paramNames.hasMoreElements()) {
                  String name = paramNames.nextElement();//得到参数名
                 String value = request.getParameter(name);//通过参数名获取对应的值
                 System.out.println(MessageFormat.format("{0}={1}", name,value));
           }

    三、request接收表单提交中文参数乱码问题

    3.1、以POST方式提交表单中文参数的乱码问题

    可以看到,之所以会产生乱码,就是因为服务器和客户端沟通的编码不一致造成的,因此解决的办法是:在客户端和服务器之间设置一个统一的编码,之后就按照此编码进行数据的传输和接收。

      由于客户端是以UTF-8字符编码将表单数据传输到服务器端的,因此服务器也需要设置以UTF-8字符编码进行接收,要想完成此操作,服务器可以直接使用从ServletRequest接口继承而来的"setCharacterEncoding(charset)"方法进行统一的编码设置。修改后的代码如下:

    public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            /**
             * 客户端是以UTF-8编码传输数据到服务器端的,所以需要设置服务器端以UTF-8的编码进行接收,否则对于中文数据就会产生乱码
             */
            request.setCharacterEncoding("UTF-8");
            String userName = request.getParameter("userName");
            System.out.println("userName:"+userName);
    }

    使用request.setCharacterEncoding("UTF-8");设置服务器以UTF-8的编码接收数据后,此时就不会产生中文乱码问题了!

    3.2、以GET方式提交表单中文参数的乱码问题

    对于以get方式传输的数据,request即使设置了以指定的编码接收数据也是无效的(至于为什么无效我也没有弄明白),默认的还是使用ISO8859-1这个字符编码来接收数据,客户端以UTF-8的编码传输数据到服务器端,而服务器端的request对象使用的是ISO8859-1这个字符编码来接收数据,服务器和客户端沟通的编码不一致因此才会产生中文乱码的。解决办法:在接收到数据后,先获取request对象以ISO8859-1字符编码接收到的原始数据的字节数组,然后通过字节数组以指定的编码构建字符串,解决乱码问题。代码如下:

    public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            /**
             *
             * 对于以get方式传输的数据,request即使设置了以指定的编码接收数据也是无效的,默认的还是使用ISO8859-1这个字符编码来接收数据
             */
            String name = request.getParameter("name");//接收数据
            name =new String(name.getBytes("ISO8859-1"), "UTF-8") ;//获取request对象以ISO8859-1字符编码接收到的原始数据的字节数组,然后通过字节数组以指定的编码构建字符串,解决乱码问题
            System.out.println("name:"+name);    
    }

    3.5、以超链接形式传递中文参数的乱码问题

      客户端想传输数据到服务器,可以通过表单提交的形式,也可以通过超链接后面加参数的形式,例如:

    1 <a href="${pageContext.request.contextPath}/servlet/RequestDemo05?userName=gacl&name=徐达沛">点击</a>

      点击超链接,数据是以get的方式传输到服务器的,所以接收中文数据时也会产生中文乱码问题,而解决中文乱码问题的方式与上述的以get方式提交表单中文数据乱码处理问题的方式一致,如下所示:

    1 String name = request.getParameter("name");
    2 name =new String(name.getBytes("ISO8859-1"), "UTF-8");

      另外,需要提的一点就是URL地址后面如果跟了中文数据,那么中文参数最好使用URL编码进行处理,如下所示:

    1 <a href="${pageContext.request.contextPath}/servlet/RequestDemo05?userName=gacl&name=<%=URLEncoder.encode("徐达沛", "UTF-8")%>">点击</a>

    四、Request对象实现请求转发

    4.1、请求转发的基本概念

      请求转发:指一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理。
      请求转发的应用场景:MVC设计模式

      在Servlet中实现请求转发的两种方式:

      1、通过ServletContext的getRequestDispatcher(String path)方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发。

    例如:将请求转发的test.jsp页面

    1 RequestDispatcher reqDispatcher =this.getServletContext().getRequestDispatcher("/test.jsp");
    2 reqDispatcher.forward(request, response);

      2、通过request对象提供的getRequestDispatche(String path)方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发。

    例如:将请求转发的test.jsp页面

    1 request.getRequestDispatcher("/test.jsp").forward(request, response);

      request对象同时也是一个域对象(Map容器),开发人员通过request对象在实现转发时,把数据通过request对象带给其它web资源处理。

     request对象作为一个域对象(Map容器)使用时,主要是通过以下的四个方法来操作

    • setAttribute(String name,Object o)方法,将数据作为request对象的一个属性存放到request对象中,例如:request.setAttribute("data", data);
    • getAttribute(String name)方法,获取request对象的name属性的属性值,例如:request.getAttribute("data")
    • removeAttribute(String name)方法,移除request对象的name属性,例如:request.removeAttribute("data")
    • getAttributeNames方法,获取request对象的所有属性名,返回的是一个,例如:Enumeration<String> attrNames = request.getAttributeNames();
  • 相关阅读:
    51nod乘积之和
    Dell服务器安装OpenManage(OMSA)
    Nginx反向代理PHP
    搭建haproxy
    108. Convert Sorted Array to Binary Search Tree
    60. Permutation Sequence
    142. Linked List Cycle II
    129. Sum Root to Leaf Numbers
    118. Pascal's Triangle
    26. Remove Duplicates from Sorted Array
  • 原文地址:https://www.cnblogs.com/deityjian/p/11048773.html
Copyright © 2011-2022 走看看