jsp servlet 中编码问题主要发生在——中文请求和响应过程出现编码、解码不一致而导致的乱码!
好纠结的一句话! = =!
不过真的要理清楚还是不容易的。
首先先看看jsp和servlet中那些地方设计到编码的设置,共有4个地方:
1.jsp中设置的pageEncoding="***"
2.jsp中设置的contentType="text/html; charset=***"
3.servlet或jsp中设置的request.setCharacterEncoding("***");
4.servlet或jsp中设置的response.setCharacterEncoding("***");
1是设置jsp转换到servlet的编码方式;
3是服务器接收数据的编码凡是;
其中2和4效果是一致的,是对服务器的响应的编码。
下面就举几个例子,逐步说明这个纠结的编码问题:
第一步:form以post方式提交中文,提交到自身页面进行响应。
说明:这里并未给出完整的代码,而是给出关键代码。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8" contentType="text/html; charset=utf-8"%>
...
<form action="servletEncoding/jsp2jsp.jsp" method="post">
//提交到自身页面
param:<input type="text" name="p1">
<br>
<input type="submit" value="submit">
</form>
...
数据处理:
<%
String p1 = request.getParameter("p1");
%>
<%=p1 %>
运行,结果乱码!
=.=!
为什么?应该是服务器默认接收参数的编码不是utf-8导致的,此处我们可以指定服务器接收参数的编码方式:
在所有的request.getParameter("***")之前加上一句
request.setCharacterEncoding("utf-8");就ok了!
总结:form以post方式提交参数,设置contentType和request.setCharacterEncoding相同的编码就好了!
第二步:form以get方式提交中文。
还是之前的代码,将form中的method改为post,再运行一次!
omg! = =! 乱码又出现了~
为什么?这是因为默认情况下tomcat等服务器是使用iso-8859-1对url或者get方式提交的数据进行编码的,即使设置了request.setCharacterEncoding也是无济于事的。
那么该怎么办?
<Connector port="8080" ... useBodyEncodingForURI="true" />
useBodyEncodingForURI 告诉服务器解码URL时候需要采用request指定的编码(即:request.setCharacterEncoding();)
总结:服务器接收参数一般就三种方式:url、get、post。post可以通过request.setCharacterEncoding即可,get和url通过修改tomcal的server.xml配置文件(useBodyEncodingForURI="true"),也可利用request.setCharacterEncoding()的方式指定接收参数的编码方式。
对于url和get方式提交参数还可以通过修改:URIEncoding属性。URIEncoding参数指定对所有GET方式请求(包括URL提交的数据和表单中GET方式提交的数据)进行统一的重新编码(解码)的编码。 URIEncoding和useBodyEncodingForURI区别是,URIEncoding是对所有GET方式的请求的数据进行统一的重新编码 (解码),而useBodyEncodingForURI则是根据响应该请求的页面的request.setCharacterEncoding参数对数 据进行的重新编码(解码),不同的页面可以有不同的重新编码(解码)的编码。所以对于URL提交的数据和表单中GET方式提交的数据,可以修改 URIEncoding参数为浏览器编码或者修改useBodyEncodingForURI为true,并且在获得数据的JSP页面中 request.setCharacterEncoding参数设置成浏览器编码。
这里个人喜欢将useBodyEncodingForURI设置成true,这样对于三种参数提交方式在编码上就得到了统一,都必须使用request.setCharacterEncoding。
好了~
网上还有总结的比较精辟的:
下面总结下,以Tomcat5.0为WEB服务器时(tomcat6.0也是一样的哇 = =!),如何防止中文乱码。
1、对于同一个应用,最好统一编码,推荐为UTF-8,当然GBK也可以。
2、正确设置JSP的pageEncoding参数
3、在所有的JSP/Servlet中设置contentType="text/html; charset=UTF-8"或response.setCharacterEncoding("UTF-8"),从而间接实现对浏览器编码的设置。
4、对于请求,可以使用过滤器或者在每个JSP/Servlet中设置 request.setCharacterEncoding("UTF-8")。同时,要修改Tomcat的默认配置,推荐将 useBodyEncodingForURI参数设置为true,也可以将URIEncoding参数设置为UTF-8(有可能影响其他应用,所以不推荐)。