分析Tomcat中JSPWeb开发中的乱码问题小结

Tomcat JSP Web 开发中的乱码问题小结

目前创新互联建站已为上千的企业提供了网站建设、域名、雅安服务器托管、网站托管、服务器租用、企业网站设计、遂宁网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

1. 静态页面的乱码问题

文件的编码和浏览器要显示的编码不一致。

1) 检查文件原始的编码, 可以用记事本打开, 然后选择另存为来看;

2) 给当前页面加入一个指令来建议浏览器用指定的编码来显示文件字符内容.

 
 
 
  1.  http-equiv="content-type" content="text/html; charset=GBK">  

3) 如果系统是英文 XP,没装东亚字符集支持, 也会显示乱码.

2. JSP Web开发中JSP页面的乱码问题

1) page 指令有个 pageEncoding="GBK" 这个会指定当前页面保存的编码, 如果写成ISO8859-1 就不能保存汉字;

2) page 指令的 contentType="text/html; charset=ISO8859-1" 也会像静态页面一样让浏览器来优先选择一种编码.
如果 JSP 乱码的话,一般就显示成?,而且不管你给浏览器选什么样的编码,它都不能确显示

3. JSP Web开发中表单提交的乱码问题(Tomcat 特有)

1). POST 的乱码

a. 首先浏览器提交表单的编码是根据表单所在页面来决定的, 而不是根据提交后的JSP 页面的编码来决定的. 把所有的页面的编码都设置成一样的,例如 GBK.

b. 处理方式就是在获取参数之前设置编码:

request.setCharacterEncoding("GBK");

c. 可以用过滤器的方式来解决, Tomcat 已经带了一个现成的:

apache-tomcat-5.5.23\webapps\jsp-examples\WEB-INF\classes\filters\SetCharacterEncodingFilter.java
web.xml

 
 
 
  1.    
  2. Set Character Encoding   
  3. filters.SetCharacterEncodingFilter   
  4.    
  5. encoding   
  6. GBK   
  7.    
  8.    
  9.    
  10. Set Character Encoding   
  11. /*   
  12.   

2) GET 方式的乱码

用 setCharacterEncoding() 不能解决. TOMCAT 的一个BUG, GET 方式传送的表单参数总是用的 ISO8859-1 编码. 我们要把它转成 GBK 方式.

 
 
 
  1. String username = request.getParameter("username");   
  2. System.out.println(username);   
  3. // 转码, 先取得原始的二进制字节数组   
  4. byte[] data = username.getBytes("ISO8859-1");   
  5. // 根据新的字符集再构造新的字符串   
  6. username = new String(data, "GBK");  

Tomcat中JSP Web开发中的乱码问题小结:

所有的页面(除了最后的 GET 的乱码问题)都用统一的编码(GBK或者UTF-8), 就不会出现乱码问题.

4. 用过滤器来一次编码彻底解决表单参数的乱码问题,即本章内容中提及的那个过滤器。

一个不错的过滤器

 
 
 
  1. package filters;  
  2.  
  3. import java.io.IOException;  
  4. import javax.servlet.Filter;  
  5. import javax.servlet.FilterChain;  
  6. import javax.servlet.FilterConfig;  
  7. import javax.servlet.ServletException;  
  8. import javax.servlet.ServletRequest;  
  9. import javax.servlet.ServletResponse;  
  10. import javax.servlet.http.HttpServletRequest;  
  11. import javax.servlet.http.HttpServletRequestWrapper;  
  12.  
  13. public class TomcatFormFilter implements Filter {  
  14. /**  
  15. * Request.java 对 HttpServletRequestWrapper 进行扩充, 不影响原来的功能并能提供所 有的  
  16. * HttpServletRequest 接口中的功能. 它可以统一的对 Tomcat 默认设置下的中文问题进行解决而只 需要用新的 Request  
  17. * 对象替换页面中的 request 对象即可.  
  18. */  
  19. class Request extends HttpServletRequestWrapper {  
  20.  
  21. public Request(HttpServletRequest request) {  
  22. super(request);  
  23. }  
  24.  
  25. /**  
  26. * 转换由表单读取的数据的内码. 从 ISO 字符转到 GBK.  
  27. */  
  28. public String toChi(String input) {  
  29. try {  
  30. byte[] bytes = input.getBytes("ISO8859-1");  
  31. return new String(bytes, "UTF-8");  
  32. } catch (Exception ex) {  
  33. }  
  34. return null;  
  35. }  
  36.  
  37. /**  
  38. * Return the HttpServletRequest holded by this object.  
  39. */  
  40. private HttpServletRequest getHttpServletRequest() {  
  41. return (HttpServletRequest) super.getRequest();  
  42. }  
  43.  
  44. /**  
  45. * 读取参数 -- 修正了中文问题.  
  46. */  
  47. public String getParameter(String name) {  
  48. return toChi(getHttpServletRequest().getParameter(name));  
  49. }  
  50.  
  51. /**  
  52. * 读取参数列表 - 修正了中文问题.  
  53. */  
  54. public String[] getParameterValues(String name) {  
  55. String values[] = getHttpServletRequest().getParameterValues(name);  
  56. if (values != null) {  
  57. for (int i = 0; i < values.length; i++) {  
  58. values[i] = toChi(values[i]);  
  59. }  
  60. }  
  61. return values;  
  62. }  
  63. }  
  64.  
  65. public void destroy() {  
  66.  
  67. }  
  68.  
  69. public void doFilter(ServletRequest request, ServletResponse response,  
  70. FilterChain chain) throws IOException, ServletException {  
  71. HttpServletRequest httpreq = (HttpServletRequest) request;  
  72. if (httpreq.getMethod().equals("POST")) {  
  73. request.setCharacterEncoding("UTF-8");  
  74. } else {  
  75. request = new Request(httpreq);  
  76. }  
  77.  
  78. chain.doFilter(request, response);  
  79. }  
  80.  
  81. public void init(FilterConfig filterConfig) throws ServletException {  
  82. }  

web.xml配置

 
 
 
  1.  
  2. TomcatFormFilter 
  3. filters.TomcatFormFilter 
  4.  
  5.  
  6. TomcatFormFilter 
  7. /* 
  8.  

【编辑推荐】

  1. JSP留言板的JSP源码操作实施
  2. 详解JSP指令和脚本元素
  3. 如何加快JSP访问速度
  4. ASP.NET、JSP和PHP究竟哪个好
  5. JSP相关软件介绍

当前标题:分析Tomcat中JSPWeb开发中的乱码问题小结
文章来源:http://www.hantingmc.com/qtweb/news49/45549.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联