在之前学习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);
}
}