Jsp乱码问题的基本解决方案,转码 + 过滤器 Filter

今天学习了Servlet和Jsp的使用,发现Jsp界面很容易出现乱码。
第一种乱码情况:

<body>  
    login success! 我爱学习<br/>
body>

如此简单的代码在浏览器上为什么会乱码呢?百度一下发现是由于java世界默认使用ISO-8859-1编码(西方常见编码方式).
而这种编码方式为单字节码,只支持英文俄文葡萄牙文什么乱七八糟文,不支持中文。
解决方案如下:
在Jsp文件前面加上如下代码:

<%@ page contentType="text/html; charset=UTF-8"%>

这行代码的意思是将此JSP页面的编码方式设置为UTF-8,这样浏览器就能正常显示了。
接下来说一个要注意的小问题:
在使用MyEclipse自动生成Jsp文件的时候会在第一行自动生成这样一行代码:

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>

这行代码的意思是本Jsp文件的编码格式为ISO-8859-1。于是当文件中输入输入了中文(如最上边那段代码)的时候,MyEclipse会提示你无法保存:

Jsp乱码问题的基本解决方案,转码 + 过滤器 Filter_第1张图片

解决方案:应将这句改为


<%@ page language="java" import="java.util.*"  pageEncoding="UTF-8" %> 

即可。

第二种乱码情况:
传递参数的时候发生乱码。
当在jsp页面表单中输入中文时,传递的参数会发生乱码.
jsp代码:

<body>
    <form name="form0" 
     action="/myWebTest/UserControl?actionCode=add" 
    method="post">
    <input type="text" name="id"/>
    <input type="text" name="userName"/>
    <input type="password" name="password"/>
    <button type="submit">submitbutton>
    form>
  body>

servlet中的接收代码:

public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
    {
        String s =(String) request.getParameter("actionCode");
        //System.out.println(s);
        IManager manager = new Manager();
        if(s.equals("add"))
        {

            System.out.println(request.getParameter("userId"));
            int id = Integer.decode(request.getParameter("id"));
            String name = request.getParameter("userName");
            //下面这句输出乱码
            System.out.println(name);
            String passWord = request.getParameter("password");
            User user = new User(id, name, passWord);
            //将构建好的User对象加到数据库中,当然加到数据库中的也是乱码
            manager.addUser(user);
            ArrayList userList = manager.selectAllUsers();
            request.setAttribute("userList", userList);
            request.getRequestDispatcher("/main.jsp").forward(request, response);
        }

    }

出现乱码的原因是传递参数是默认的编码方式是ISO-8859-1.
解决方案:
String name = request.getParameter("userName");
后面加入:name = new String(name.getBytes("ISO-8859-1"), "UTF-8");
利用String类的构造器将字符串转码为UTF-8.
不过此方法显得很不实用:
当参数很多&工程很大的情况下,每个参数都要如此转码显得很不美观.有没有一个一劳永逸的方法呢?
当然有!下面隆重介绍:过滤器 Filter接口.
Filter可以帮助我们解决乱码问题,当然它能实现很多强大的功能,如ip过滤等.本文中只探讨将Filter用于解决乱码问题.
同样针对上述问题,我们创建一个class WebFilter implements Filter:

package com.hj.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;

public class WebFilter implements Filter
{

    @Override
    public void destroy()
    {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException
    {
        request.setCharacterEncoding("utf-8");  
        chain.doFilter(request, response);

    }

    @Override
    public void init(FilterConfig arg0) throws ServletException
    {
        // TODO Auto-generated method stub

    }

}

核心代码在doFilter方法中,doFilter中我们将拦截到的请求转码为UTF-8,从而避免了界面之间传参造成的乱码问题.
别忘了在web.xml文件中加入如下配置(和配置servlet的方法很像):

<filter>
  <filter-name>WebFilterfilter-name>
  <filter-class>com.hj.util.WebFilterfilter-class>
  filter>
<filter-mapping>
     <filter-name>WebFilterfilter-name>
     <url-pattern>/*url-pattern>
  filter-mapping>

其中的filter-name 可以随便起,Filter-class 为要配置的filter实现类的类全名,url-pattern为要拦截的路径,此处写 /* 代表拦截所有请求.
这样,我们就不用为每一个参数痛苦的转码了,一个过滤器”滤掉”了所有的乱码.

你可能感兴趣的:(javaweb)