jsp各种乱码问题解决方案

来源:互联网 发布:ftp端口是多少 编辑:程序博客网 时间:2024/05/22 04:25

类型1、浏览器打开一个jsp页面时,页面中的中文出现乱码
    有很多IDE默认的jsp文件是iso-8859-1编码,它对中文不能识别,用<%@ pageEncoding="utf-8"%>或者"gb2312"、"gbk"都可解决这个问题,至于他们具体有什么区别,这里就不多讲了,搜百度就可以了,这里只讲方法。

类型2、浏览器调用一个servlet时,页面中出现中文乱码
    比如该servlet的一个方法是:
    public void doPost(HttpServletRequest request,HttpServletResponse response)
           throws ServletException,IOException
    {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head><title>this is a servlet</title></head>");
        out.println("<body>");
        out.println("我不帅");
        out.println("</body>");
        out.println("<html>");
        out.close();
    }
    当浏览器调用该servlet时,"我不帅"出现乱码,这时把response.setContentType("test/html")改成response.setContentType("text/html;charset=gb2312")即可解决。

类型3、对于post方法提交到另一个jsp或servlet处理并显示提交内容信息,出现文乱码
    比如有个jsp文件my.jsp核心代码如下:
    <body>
        <form  method="post" action="display.jsp">
        <input type="text" name="username">
        <input type="submit" value="提交">
        </form>
    </body>
   
    display.jsp的核心代码如下:
    <body>
        The user'name is:<%=request.getParameter("username")>
    </body>

    用浏览器打开my.jsp,在文本框中输入"锟哥哥",点击提交按钮,把它交给display.jsp处理,这时"锟哥哥"就乱码了。解决方法是在display.jsp代码第一行加一句:<%request.setCharacterEncoding("gb2312"); %>
    一般像request请求类的中文乱码问题都用过滤器来解决,也就是用一个servlet来过滤提交时出现的乱码问题。比如这个过滤器为EncodingFilter.java,代码如下:
    package ...自拟
    import ...自拟

    public class EncodingFilter implements Filter
    {
        private FilterConfig config;
        private String encoding="ISO8859-1";

        public void init(FilterConfig config) throws ServletException
        {
              this.config=config;
              String s=config.getInitParameter("encoding");
              if(s!=null)
              {
                        encoding=s;
              }
        }
        public void doFilter(ServletRequest request,ServletResponse response,FitlerChain chain) throws IOException,ServletException
        {
               request.setCharacterEncoding(encoding);
               chain.doFilter(request,response);
        }
        public void destroy()
        {
               config=null;
        }
     }
     该过滤器对应的web.xml配置如下:
     <filter>
     <fitler-name>EncodingFilter</filter-name>
     <filter-class>...自拟,为该类在工程名中的路径所在,比如package1.package2.EncodingFilter</filter-class>
     <init-param>
        <param-name>encoding</param-name>   //与代码中config.getInitParameter("encoding")中的encoding对应
        <param-value>gb2312</param-value>
     </init-param>
     </filter>

     <filter-mapping>
     <fitler-name>EncodingFilter</fitler-name>
     <url-pattern>/*</url-pattern>    //表示凡是在该项目下只要有request的中文提交都会把提交信息过滤
     </filter-mapping>

类型4、对于get提交表单即改写uri时出现的乱码问题
    前面提到了对于post方法的处理,但对于get方法,解决方案不能通过修改jsp或者servlet解决,这是只能修改服务器配置文件了。下面说一下这种get方法的中文乱码的表现形式:
    与前面那个例子相似,比如有个jsp文件my.jsp核心代码如下:
    <body>
        <form  method="get" action="display.jsp">
        <input type="text" name="username">
        <input type="submit" value="提交">
        </form>
    </body>
   
    display.jsp的核心代码如下:
    <body>
        The user'name is:<%=request.getParameter("username")>
    </body>
    当我们通过浏览器的域名地址输入:http://localhost:8080/工程名/display.jsp?username=锟哥哥。此时display.jsp页面中显示的"锟哥哥"为乱码。
    当我们通过表单以get方法提交时,若在my.jsp中输入"锟哥哥",提交给display.jsp后,页面显示的"锟哥哥"为乱码,而域名地址显示的"锟哥哥"也为乱码。

    若遇到get类型的乱码问题时,不能像处理post类型那样,比如在display.jsp代码第一行加入<%request.setCharacterEncoding("gb2312"); %>,这是没有作用的。此时,得修改%tomcat_home%/conf/server.xml的配置信息,在<Connector port="8080" protocol="HTTP/1.1" maxThreads="100" connectionTimeout="10000" redirectPort="8443" />中加入一条URIEncoding="gb2312",然后重启tomcat,这样get类型的乱码问题就解决了。