JavaEE 请求响应

HttpServletRequest

API文档:http://tomcat.apache.org/tomcat-7.0-doc/servletapi/index.html

1、请求参数编码处理

在说明参数编码处理之前,让我们先了解下编码

 pageEncoding是jsp文件本身的编码

 contentType的charset是指服务器发送给客户端时的内容编码

   contentType的"text/html"等MIME码表明服务器发给客户端的类型

JSP要经过两次的“编码”,第一阶段会用pageEncoding,第二阶段会用utf-8至utf-8,第三阶段就是由Tomcat出来的网页, 用的是contentType。

  第一阶段是jsp编译成.java,它会根据pageEncoding的设定读取jsp,结果是由指定的编码方案翻译成统一的UTF-8 JAVA源码(即.java)

  第二阶段是由JAVAC的JAVA源码至java byteCode的编译,不论JSP编写时候用的是什么编码方案,经过这个阶段的结果全部是UTF-8的encoding的java源码。

  第三阶段是Tomcat载入和执行阶段二的来的JAVA二进制码,输出的结果,也就是在客户端见到的,这时隐藏在阶段一和阶段二的参数contentType就发挥了功效

请求参数的编码处理,基本上必须分POST和GET两种情况说明。

POST请求参数编码处理

例如客户端在Content-Type标头中设置字符编码信息(如下图),此时我们向服务器请求此JSP页面,该JSP使用的就是charset表明的UTF-8,当然我们在输入框的输入的参数也是UTF编码了,这时如果我们想要在Servlet取得请求参数,容器若使用默认的编码(可能部位UTF-8)来处理请求参数,这时候就有可能乱码。

解决方法:在取得任何请求值之前,执行以下语句:

req.setCharacterEncoding("UTF-8");

注意在取得请求参数之后,再调用是没有作用的。

GET请求参数编码处理

在HttpServletRequest的API文件中,对setCharacterEncoding()的说明清楚提到:

Override the name of the character encoding userd in the body of this request.

也就是说,这个方法对于请求Body中的字符编码才有作用,也就是这个方法只对POST产生作用,而GET则无法使用。那么我们如何使用GET请求进行参数处理呢?

可以通过String的getByte()指定编码来取得该字符串的字节数组,然后再重新构造为正确的编码字符串。例如,若浏览器使用UTF-8处理字符,假设Web容器默认使用ISO-8859-1编码,则正确处理编码的方式为:

String name = req.getParameter("name");

String name2 = new String(name.getBytes("ISO-8859-1"),"UTF-8");

事实上这个方法也适用于post请求  。。

补充:

再Servlet中直接进行编码设置或转换,并不是最好的地方,我们可以使用过滤器进行编码处理。

2、RequestDispatcher

在Web应用程序中,经常需要多个Servlet来完成请求。例如、将另一个Servlet的请求处理流程包含(include)进来,或将请求转发(forward)给别的Servlet处理,这时可以使用HttpServletRequest的getRequestDispatcher()方法。

HttpServletResponse

   可以使用HttpServletResponse来对浏览器进行响应。大部分的情况下,会使用setContentType()设置响应类型,使用getWrite()取得PrintWrite对象,而后使用PrintWrite的println等方法输出HTML内容。

   还可以进一步使用setHeader()、addHeader()等方法进行响应标头的设置,或者是使用sendRedirect()、sendError()方法,对客户端要求进行重定向网页,或是传递错误信息。

API文档:http://tomcat.apache.org/tomcat-7.0-doc/servletapi/index.html

响应字符编码问题

可以调用HttpServletResponse的setCharacterEncoding()设置字符编码:

resp.setCharacterEncoding("UTF-8");

也可以调用HttpServletResponse的setContentType()时指定charset,charset的值会自动用来调用setCharacterEncoding().例如,以下不仅设置内容类型为text/html,也会自动调用setCharacterEncoding(),设置编码为UTF-8:

resp.setContentType("text/html;charset=UTF-8");

因为浏览器需要知道如何处理你的响应,所以必须给支内容类型。setContentType()的方法在响应中设置content-type响应标头,你只要指定MIME类型就可以了。由于编码设置与内容类型通常都要设置,所以调用setContentType()设置内容时,同时指定charset属性是个方便且常见的作法。

注意:如果要接收中文请求并再响应时通过浏览器正确显示中文,必须同时设置HttpServletRequest的setCharacterEncoding()以及HttpServletResponse的setCharacterEncoding()或setContentType()位正确的编码。

待续。。。。。

参考:JSP&Servlet学习笔记

猜你喜欢

转载自my.oschina.net/lin546/blog/1797600