关于 HttpServletRequest

HttpServletRequest 的作用

  1. 封装信息。服务器收到 http 请求后将请求信息解析然后分别保存到 HttpServletRequest 的各个字段中供 Servlet 使用。
  2. 请求转发。HttpServletRequest 的 getRequestDispatche(String path) 方法可以获得一个 RequestDispatcher 对象,调用这个方法的 forward 方法可以实现请求转发。
    request.getRequestDispatche("/test.jsp").forward(request,response)`
    
    PS:另外一种方法是使用 ServletContext 的 getRequestDispatcher 方法。
    //this 是 Servlet
    this.getServletConfig().getSevletContext().getRequestDispatcher("/test.jsp").forward(request,response);
    

获取请求信息

获取客户端信息

获取 Http 请求头

获取客户端请求参数

String getParameter(String name)
返回指定参数的值。
String[] getParameterValues(String name)
如果一个参数名对应多个参数,像这样 param=val1&param=val2&param=val3,则可以使用该方法获取多个值。
Map<String, String[]> getParameterMap()
key 为参数名,value 为参数值。

编码问题

Post 请求

Post 请求有几个地方涉及到编码,首先是客户端,比如浏览器,Http 请求有一个 Header 为 Accept-Charset,这里可以设置浏览器发送数据的编码。同时在 HttpServletRequest 接受请求参数的时候也可以设置一个编码,HttpServletRequest 有一个 setCharacterEncoding(String s)方法,可以设置解析时使用的编码类型,这两处如果设置统一的话,解析请求参数就没有问题了。(比如在获取数据之前使用该方法设置数据才有效)

假如后端没有设置编码类型,那么会 HttpServletRequest 的默认编码根据 Servlet 容器默认设置决定,比如 Tomcat,配置文件 server.xml 中有一个 Connector 节点,它的 URIEncoding 属性就是 HttpServletRequest 选择的默认编码。在 Tomcat7 及以前的版本中,这个属性值默认为 ISO-8859-1,Tomcat8 开始,这个默认值为 UTF-8,可以参看这篇文章

Get 请求

Get 方式请求的数据是放在请求数据包请求行的 URI 字段中,这里的字段不由 web 容器处理,而是由 Http 服务器处理,所以 setCharacterEncoding(String s) 方法就对它没有作用了。这个时候 getParameter(String name) 方法只会使用 web 容器默认的编码方式获取数据。
所以了可以使用修改 web 容器的默认编码来解决这个问题。比如前面提到的 tomcat 配置文件的 URIEncoding 属性。
另外,可以把获得的乱码值重新编码解决,如

// 这里假设 value 是从 Request 获取的乱码数据
// ISO8859-1 是 request 解析请求时使用的编码,这里就是 wb 容器的默认编码。
// UTF-8 是需要的正确的编码类型
byte[] arr = value.getBytes("ISO8859-1");
String newValue = new String(arr,"UTF-8");

另外,很多时候都会使用 URL 编码来将传输的参数做一次加密,这样传输过程中都是拉丁字符就没有乱码的问题了。获得参数之后再用 URL 编码方式解码即可。

输出

获取请求信息会出现乱码,当然输出信息到浏览器也有可能因编码不同而出现乱码。所以首先是 response 的 setCharacterEncoding(String s) 方法,设置 HttpServletResponse 方法的变量。同时还有一个方法 respnse.setHeader("content-type","text/html;charset=UTF-8"); 可以设置浏览器解析时的编码。这两个就是处理输出到客户端乱码的解决方案。

其他

这篇博客中关于 HttpServletRequest 类讲解的很详细。http://www.cnblogs.com/xdp-gacl/p/3798347.html