`
kiki1120
  • 浏览: 314602 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

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

阅读更多

1. 静态页面的乱码问题
  文件的编码和浏览器要显示的编码不一致。
  1) 检查文件原始的编码, 可以用记事本打开, 然后选择另存为来看;
  2) 给当前页面加入一个指令来建议浏览器用指定的编码来显示文件字符内容。
    <meta http-equiv="content-type" content="text/html; charset=GBK">
  3) 如果系统是英文XP,没装东亚字符集支持, 也会显示乱码。

2. JSP 页面的乱码问题
  1) page 指令有个 pageEncoding="GBK" 这个会指定当前页面保存的编码, 如果写成ISO8859-1 就不能保存汉字;
  2) page 指令的 contentType="text/html; charset=ISO8859-1" 也会像静态页面一样让浏览器来优先选择一种编码。

  如果JSP 乱码的话,一般就显示成?,而且不管你给浏览器选什么样的编码,它都不能正确显示。

3. 表单提交的乱码问题(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

<filter>
  <filter-name>Set Character Encoding</filter-name>
  <filter-class>filters.SetCharacterEncodingFilter</filter-class>
  <init-param>
    <param-name>encoding</param-name>
    <param-value>GBK</param-value>
  </init-param>
</filter>

<filter-mapping>
  <filter-name>Set Character Encoding</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

   2) GET 方式的乱码
    用 setCharacterEncoding() 不能解决. TOMCAT 的一个BUG, GET 方式传送的表单参数总是用的 ISO8859-1 编码. 我们要把它转成 GBK 方式.
    String username = request.getParameter("username");
    System.out.println(username);
    // 转码, 先取得原始的二进制字节数组
    byte[] data = username.getBytes("ISO8859-1");
    // 根据新的字符集再构造新的字符串
    username = new String(data, "GBK");

小结:

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

 

4. 用过滤器来一次编码彻底解决表单参数的乱码问题,即:
  选择菜单File > New > Class,来创建一个名为TomcatFormFilter 的类,包名为filters。然后把类的代码修改为如下所示:

package example.util;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public class TomcatFormFilter implements Filter {

	public void destroy() {
		
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		HttpServletRequest httpreq = (HttpServletRequest) request;
		if (httpreq.getMethod().equals("POST")) {
			request.setCharacterEncoding("GBK");
		} else {
			request = new Request(httpreq);
		}
		chain.doFilter(request, response);
	}

	public void init(FilterConfig arg0) throws ServletException {
		
	}
	
	/**
	 * Request.java 对 HttpServletRequestWrapper 进行扩充, 不影响原来的功能并能提供所有的
	 * HttpServletRequest 接口中的功能. 它可以统一的对 Tomcat 默认设置下的中文问题进行解决而只需要用新的 Request
	 * 对象替换页面中的 request 对象即可.
	 */
	class Request extends HttpServletRequestWrapper {
		
		public Request(HttpServletRequest request) {
			super(request);
		}

		/**
		 * 转换由表单读取的数据的内码.
		 * 从 ISO 字符转到 GBK.
		 */
		public String toChi(String input) {
			try {
				byte[] bytes = input.getBytes("ISO-8859-1");
				String str = new String(bytes, "GBK");
				return str;
			}catch (Exception ex) {
			}
			return null;
		}

		/**
		 * Return the HttpServletRequest holded by this object.
		 */
		private HttpServletRequest getHttpServletRequest() {
			return (HttpServletRequest) super.getRequest();
		}

		/**
		 * 读取参数 -- 修正了中文问题.
		 */
		public String getParameter(String name) {
			return toChi(getHttpServletRequest().getParameter(name));
		}

		/**
		 * 读取参数列表 - 修正了中文问题.
		 */
		public String[] getParameterValues(String name) {
			String values[] = getHttpServletRequest().getParameterValues(name);
			if (values != null) {
				for (int i = 0; i < values.length; i++) {
					values[i] = toChi(values[i]);
				}
			}
			return values;
		}
	}

}

 

然后修改web.xml 加入Servlet 定义:

<filter>
  <filter-name>myFilter</filter-name>
  <filter-class>example.util.TomcatFormFilter</filter-class>
</filter>

<filter-mapping>
  <filter-name>myFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

 

分享到:
评论

相关推荐

    jsp中文乱码问题小结

    JSP中文乱码问题是一个常见的开发难题,主要涉及客户端、服务器端以及数据库等多个环节。本文将深入探讨这个问题,并提供相应的解决方案。 首先,我们要理解中文乱码的根源。在Java(包括JSP)中,中文字符可能出现...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    JSP网站开发典型模块与实例精讲

    书名:JSP网站开发典型模块与实例精讲 图书编号:1656674 出版社:电子工业 定价:50.0 ISBN:712102874 作者:李振捷 出版日期:2006-08-09 版次: 开本:26cm 简介: 本书讲解了使用JSP开发网站系统的经典模块和工程实例。...

    java web开发技术大全

    提供典型应用案例,剖析JSP/Servret技术与Struts 2技术在Web开发中的不同 提供完整的应用案例,使读者可以深入体会SSH开发模式的精髓 所有开发工具和框架均使用目前的最新版本,紧跟技术发展的趋势 提供230个实例...

    java web技术开发大全(最全最新)

    提供典型应用案例,剖析JSP/Servret技术与Struts 2技术在Web开发中的不同 提供完整的应用案例,使读者可以深入体会SSH开发模式的精髓 所有开发工具和框架均使用目前的最新版本,紧跟技术发展的趋势 提供230个实例和4...

    jsp中影响编码的属性及其设置小结

    在JavaServer Pages (JSP) 开发中,正确设置编码属性对于确保文本数据在不同环节间的正确处理至关重要。本文将详细解析JSP中影响编码的属性及其设置,并探讨它们之间的相互影响和作用顺序。 首先,我们需要理解几个...

    《MyEclipse 6 Java 开发中文教程》前10章

    Tomcat JSP Web 开发中的乱码问题小结 164 第九章 开发Struts 1.x应用 166 9.1 介绍 166 9.2 创建Struts项目 168 9.2.1 创建Web项目 169 9.2.2 加入 Struts开发功能 169 9.3 使用Struts工具 171 9.3.1 Struts配置...

    超杰软件系列(JSP进销存).

    - 在JSP文件中设置正确的字符集编码,避免中文乱码问题。 - 示例代码:`;charset=UTF-8" language="java" %&gt;`。 #### 五、小结 通过以上步骤,我们不仅完成了开发环境的搭建,还实现了进销存系统的基本功能。需要...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    一共四个,其中pdf 三个包,源码一个包 第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 ...15.13 小结

    《程序天下:J2EE整合详解与典型案例》光盘源码

    第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 1.2.3 业务逻辑组件 1.3 J2EE容器 1.3.1 容器服务 ...15.13 小结

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    一共四个,其中pdf 三个包,源码一个包 第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 ...15.13 小结

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    一共四个,其中pdf 三个包,源码一个包 第一章 J2EE快速入门 1.1 J2EE概述 1.1.1 J2EE的来源 1.1.2 J2EE整体框架 1.1.3 从J2EE到JavaEE 1.2 J2EE组件 1.2.1 客户端组件 1.2.2 Web组件 ...15.13 小结

Global site tag (gtag.js) - Google Analytics