Filter(四)常见应用一----解决乱码问题

在之前学习servlet时,当输入中文时,显示有时候会出现乱码问题,其原因是,中文输入时编码方式和显示时解码方式不一致导致的。因此在解决乱码问题时,需要同一编码和解码方式。

在Servlet中,在默认情况下,request和response的characterCode是ISO-8859,因此当通过response在网页显示中文时,将会出现乱码现象,要想解决此乱码,需要将response的charsetEncoding设置为GBK或UTF-8,同时request的也需要设置成一致。同时将head的编码集设为GBK或UTF-8;如下:

request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		response.getWriter().write("你好中国");
通过此方式便可解决页面乱码问题,但是当存在很多servlet或web资源都有可能涉及乱码问题时,在每个servlet向web浏览器回显数据前,都需要向上面一样设置一下。修改地方之多,而且也比较容易出错。很不方便,在学完Filter过滤器后,由于在访问web资源之前,程序都会先进入到Filter过滤器的doFilter中,然后在根据情况去访问指定web资源,访问完web资源后,又会进入到到该Filter中。同时doFilter中的request和response参数也将会作为参数传递给FilterChain的request和resposne参数,因此只需要在doFilter方法内,像上面一样设置request和resposne的编解码方式及设置ContentType,且只需要设置一次即可实现解决全web资源的乱码问题,非常方便

public void doFilter(ServletRequest req, ServletResponse resp,
			FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		System.out.println("do Filter....");
		req.setCharacterEncoding("UTF-8");
		resp.setCharacterEncoding("UTF-8");
		resp.setContentType("text/html;charset=UTF-8");
		chain.doFilter(req, resp);
	}
值的注意的是,这种解决乱码问题只对post方法提交有效,对get方法提交无效。

public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		response.getWriter().write("你好中国");
	}
若只像上面这样进行设置还不行,不灵活,最好是通过在配置Filter时,通过参数配置<init-param>指定编码方式,这样web服务器创建Filter实体对象时,调用init方法来获取已封装在FilterConfig对象中的初始化参数(编码方式),这样在执行doFilter方法时,可以用此编码方式进行设置。没有写死,灵活,修改web.xml配置,无须重新发布web应用,新的编码方式即可生效。

<filter>	
  	<filter-name>FilterUtils</filter-name>
  	<filter-class>cn.itcast.utils.FilterUtils</filter-class>
  	<init-param>
  		<param-name>encoding</param-name>
  		<param-value>UTF-8</param-value>
  	</init-param>
  </filter>
  <filter-mapping>
  	<filter-name>FilterUtils</filter-name>
  	<url-pattern>/*</url-pattern>
  	<dispatcher>REQUEST</dispatcher>
  </filter-mapping>
//Filter

public class EncodeFilter implements Filter {
	private String encode;
	@Override
	public void destroy() {
		// TODO Auto-generated method stub

	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse resp,
			FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		req.setCharacterEncoding(encode);
		resp.setCharacterEncoding(encode);
		resp.setContentType("text/html;charset="+encode+"");
		chain.doFilter(req, resp);
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		encode = filterConfig.getInitParameter("encoding");
	}

}


public class FilterServlet extends HttpServlet {

	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		response.getWriter().write("你好中国");
	}

	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doGet(request, response);
	}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值