JSP页面出现的中文乱码显示问题

1 篇文章 0 订阅

今天在JSP编码的时候中文出现了乱码,所以想深入搞懂,就开始在网上和书本查资料,稍微整理了下,以便以后再次遇到可以查看,有些东西还是记下来比较好。

先看一下JSP的编码过程:

1.客户端首先发送请求给web容器
2.web容器将JSP首先转译成servlet源代码
3.web容器将servlet源代码编译成.class 文件
4.web容器执行.class 文件
5.web容器将结果响应给客户端

在JSP文件中第一行代码为

 <%@ page language="java" contentType="text/html; charset=iso-8859-1" pageEncoding="iso-8859-1"%>

其中首先区分下charset和pageEncoding的区别:

pageEncoding 是本JSP文件的保存编码方式,就是在本JSP页面编码最后存储的时候会根据pageEncoding的编码方式来存储,如果在本JSP编码中出现了中文,那么在存储的时候如果还是使用ISO-8859-1的编码方式就会提示错误。需要使用支持中文的GBK或者utf-8编码方式。

charset 是指服务器发送给客户端时的内容编码,也就是浏览器在得到此文件时以什么方式解码。如果文件中有中文,那么就需要指定为中文编码,不指定则浏览器在解码的时候不能正常对中文解码就出现乱码现象。

如果pageEncoding 不指定,则会根据charset 来决定文件的存储编码,如果两个都不指定,则会默认使用ISO-8859-1,即不支持中文。

需要注意的是我们的浏览器默认使用编码是utf-8。所以如果使用charset 为GBK则浏览器访问的时候还是乱码。

JSP的编码流程为,第一阶段会用pageEncoding,第二阶段会用utf-8至utf-8,第三阶段就是由Tomcat返回来的网页,用的是charset。


form表单提交中文显示乱码

在JSP页面中使用表单提交中文,在接收页面中文乱码显示,如一个表单页面和一个接收页面

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<html>
<head>
</head>
<body>
     <form method="post" action="test3.jsp" name="zhongwen">
        <div align="center">
                  姓名<input type="text" name="username"/>
                 <input type="submit" value="提交"/>
        </div>
     </form>
</body>
</html>

在接收页面

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%
String username = request.getParameter("username");
%>
<html>
<head>
</head>
<body>
<%=username %>
</body>
</html>

此时在form表单中输入中文提交则会在接受页面出现乱码

解决方法一:

可以在接收页面接受参数前设置request编码,只要把request设置成浏览器使用编码即可

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%
request.setCharacterEncoding("utf-8");  // 设置request编码
String username = request.getParameter("username");
%>

解决方法二:

可以对接收到的参数重新编码,先把接收到的根据ISO9959-1进行编码成字节序列数组,然后再根据浏览器编码转换成utf-8编码字符串

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%
String username = request.getParameter("username");
username = new String(username.getBytes("ISO-8859-1"),"utf-8");
%>
<html>
<head>
</head>
<body>
<%=username %>
</body>
</html>

使用这种方法就必须每接收一个参数使用以下这种转码方法。

解决方法三:

由于方法二需要在每次从request获取参数后都需要使用一遍会比较烦,所以还有使用过滤器比较方便,原理就是在每次表单提交之后都需要经过这个过滤器,而在过滤器中则每次都设置request的编码,这样就不需要在JSP接收页面中设置了。

关于正文乱码的过滤器使用网上有很多,测试还是上面的test1.jsp和test2.jsp。

参考:http://blog.csdn.net/wkupaochuan/article/details/7461208

首先过滤器类创建和代码如下:

package com.filter;//包名

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;

public class Filter_charset implements Filter{

	protected String encoding = null;          // 接收字符编码
	public void destroy() {
		// TODO Auto-generated method stub
		this.encoding = null;
		System.out.println("destroy ...");
	}
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		/*如果从web.xml中读取的编码格式不为空,则对request设置编码格式*/
		if (this.encoding != null)
		{
			request.setCharacterEncoding(this.encoding);//设置编码格式
			/*这里只是在控制台输出验证是否加载了过滤器,并从web.xml中读取到了正确的编码格式*/
			System.out.println("doFilter ......" + this.encoding);//
		}
		/*继续执行程序*/
		chain.doFilter(request, response);
	}
	
	/*初始化函数*/
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		/*从web.xml中读取编码格式*/
		this.encoding = filterConfig.getInitParameter("encoding");
		System.out.println("init ...");
	}
}

接下来就是对web.xml的配置,主要就是在当前工程目录下的所有文件都需要经过该过滤器,从而不会出现乱码现象。配置如下:

 
  <!--中文乱码处理过滤-->
   <filter>
   <filter-name>EncodingFilter</filter-name><!--过滤器名称,自己起-->
   <filter-class>com.filter.Filter_charset</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> 
 
   <!--中文乱码处理过滤-->  
   


以上几种解决乱码问题的方法比较容易懂,记下来以后遇到可以看看。


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值