本文的目的是解决 jsp<->jsp jsp<->servlet 跳转过程 中文乱码问题, 暂时只分析 表单提交的 post 和 get 两种方式。
本文只讲方法,不讲原理。 同时鄙视网络上哪些所以的“专家”对知识一知半解,连基本的测试都没做,就发表言论,误人误国。
本人只是初学,如果还有其他方法,敬请指教。谢谢
环境 myeclips+ tomcat +jdk1.6
myeclips系统默认 utf-8
jsp文件
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
tomcat\conf\server.xml
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="utf-8" /> <!-- URIEncoding="utf-8" -->
工程中的web.xml
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>com.common.filtertest</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
filter代码
在 doFilter 函数中
if (ignore || (request.getCharacterEncoding() == null)) {
String encoding = selectEncoding(request);
if (encoding != null) {
request.setCharacterEncoding(encoding);
response.setContentType("text/html; charset=" + encoding);
}
}
chain.doFilter(httpServletRequest, httpServletResponse);
第一种情况--------------------------------------无URIEncoding="utf-8" 无filter
jsp(post) -> servlet
方法一 dopost
String name = new String (request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8"); //显示正常
response.setContentType("text/html"); //下面3句话是为了返回正常
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
方法二 dopost
request.setCharacterEncoding("UTF-8"); //必须写在request.getParameter前
String name = request.getParameter("username");
response.setContentType("text/html"); //下面3句话是为了返回正常
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
jsp(post) -> jsp
方法一
<% String name = new String (request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8"); %>//显示正常
方法二
request.setCharacterEncoding("UTF-8"); //必须写在request.getParameter前
String name = request.getParameter("username");
jsp(get) -> servlet
方法一 doget
String name = new String (request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8"); //显示正常
response.setContentType("text/html"); //下面3句话是为了返回正常
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
jsp(get) -> jsp
方法一
String name = new String (request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8"); //显示正常
第二种情况--------------------------------------无URIEncoding="utf-8" 有filter
jsp(post) -> servlet + filter
方法一 dopost
直接取值即可,同时response也不用设置字符集
String name = request.getParameter("username");
jsp(post) -> jsp + filter
方法一
直接取值即可
String name = request.getParameter("username");
jsp(get) -> servlet + filter
方法一 doget
String name = new String (request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8");
response.setContentType("text/html"); //下面3句话是为了返回正常
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
jsp(get) -> jsp + filter
方法一
String name = new String (request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8");
第三种情况--------------------------------------有URIEncoding="utf-8" 有filter
方法一 dopost
直接取值即可,同时response也不用设置字符集
String name = request.getParameter("username");
jsp(post) -> jsp
方法一
直接取值即可
String name = request.getParameter("username");
jsp(get) -> servlet
方法一 doget
直接取值即可,同时response也不用设置字符集
String name = request.getParameter("username");
jsp(get) -> jsp
方法一
直接取值即可
String name = request.getParameter("username");
第四种情况--------------------------------------有URIEncoding="utf-8" 无filter
jsp(post) -> servlet
方法一 dopost
String name = new String (request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8"); //显示正常
response.setContentType("text/html"); //下面3句话是为了返回正常
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
方法二 dopost
request.setCharacterEncoding("UTF-8"); //必须写在request.getParameter前
String name = request.getParameter("username");
response.setContentType("text/html"); //下面3句话是为了返回正常
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
jsp(post) -> jsp
方法一
<% String name = new String (request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8"); %>//显示正常
方法二
request.setCharacterEncoding("UTF-8"); //必须写在request.getParameter前
String name = request.getParameter("username");
jsp(get) -> servlet
方法一 doget
直接取值即可,同时response也不用设置字符集
String name = request.getParameter("username");
jsp(get) -> jsp
方法一
直接取值即可
String name = request.getParameter("username");
结论如下
1、 有fileter情况下 post方式 jsp <->servlet jsp<->jsp不用初始化字符集
2、 有URIEncoding="utf-8" 情况下 get方式 jsp<->servlet jsp<->jsp 不用初始化字符集
3、 没有fileter情况下 post方式 jsp <->servlet jsp<->jsp 为了达到无乱码 有两种方法。 见第一,四种情况
4、 没有URIEncoding="utf-8" 情况下 get方式 jsp<->servlet jsp<->jsp 为了达到无乱码 有两种方法。 见第一,二种情况
总之,为了达到不初始化字符集做到没有乱码无敌配置如下
1、jsp 配置utf-8
2、工程web.xml 配置过滤器
3、tomcat\conf\server.xml 配置URIEncoding="utf-8"
4、myeclips系统默认 utf-8