hailang的空间

我们一直在努力....

JSP中文乱码实例详解

标签: JSP中文乱码 实例 STRUTS

前几篇文章主要介绍了JSP中文乱码的解决方案,而这篇文章主要介绍JSP中文乱码实例,通过这个实例,大家就可以知道如何来解决JSP中文乱码问题。

JSP中文乱码实例

一、页面介绍
  我是从test.jsp(包含两个下面三个文本框) 通过下面的action跳转到success.jsp显示Name:<%= user.getUserName()%>
   <html:form action="test.do" method="GET"> 
     userName:<html:text property="user.userName"/><br/>
     passWord:<html:text property="user.passWord"/><br/>
     age:     <html:text property="user.age"/><br/>
    </html:form>
   
     1.1,发送页面编码设置
         jsp编码:<%@ page contentType="text/html;charset=gb2312" pageEncoding="GB2312" language="java" errorPage=""%>
         html编码:<meta http-equiv="Content-Type" content="text/html; charset=GB2312"/>
     1.2,接收页面编码设置同发送页面
二、web.xml配置了的过滤
  <web-app>
        <filter>
           <filter-name>Encoding Filter</filter-name>
           <filter-class>com.encode.EncodingFilter</filter-class>
          <init-param>
              <param-name>encoding</param-name>
              <param-value>gb2312</param-value>
          </init-param>
         </filter>
         <filter-mapping>
            <filter-name>Encoding Filter</filter-name>
            <url-pattern>/*</url-pattern>
         </filter-mapping>
         <servlet>
            <servlet-name>action</servlet-name>
            <servlet-class>com.myaction.MyActionServlet</servlet-class>
         </servlet>
     </web-app>
三、Struts的config配置
  <struts-config>
        <action path="/test"
                type="test.UserAction"
                name="userForm"
                scope="request"
                validate="true"
                input="/test.jsp">
        </action>
        <forward name="userCreated" path="/success.jsp">
        </forward>
        <controller processorClass="com.encode.MyRequestProcessor"/>
       </struts-config>
四、后台java类说明:
  (2 MyActionServlet是继承Struts的ActionServlet,重写process方法。
          public class MyActionServlet extends ActionServlet{
              private static final long serialVersionUID = 1L;
              protected void process(HttpServletRequest request, HttpServletResponse response)
                  throws java.io.IOException, javax.servlet.ServletException {
              /**@todo Override this org.apache.struts.action.ActionServlet method*/
                  request.setCharacterEncoding("gb2312");//就加着一行一切都解决了
                 System.out.println("Had Arive MyActionServlet !!!");
                  super.process(request, response);
             }
           }
        (2中的EncodingFilter用来设置请求时的编码,代码重要部分如下:
            public final class EncodingFilter implements Filter {
           private String targetEncoding = "gb2312";         
           protected FilterConfig filterConfig;
         
           public void init(FilterConfig config) throws ServletException {
            this.filterConfig = config;
            this.targetEncoding = config.getInitParameter("encoding");
            System.out.println("filterConfig of init:!" + filterConfig);
            System.out.println("targetEncoding of init:!" + this.targetEncoding);
            System.out.println("Arive this Filter init!");
           }         
           public void doFilter(ServletRequest srequest, ServletResponse sresponse,
             FilterChain chain) throws IOException, ServletException {
            HttpServletRequest request = (HttpServletRequest) srequest;
            request.setCharacterEncoding(targetEncoding);
            System.out.println("request.getCharacterEncoding() do:"
              + request.getCharacterEncoding());
            System.out.println("Arive this Filter doFilter!");
            chain.doFilter(srequest, sresponse); // 把处理权发送到下一个         
           }         
           public void destroy() {
            this.filterConfig = null;         
           }         
           public void setFilterConfig(final FilterConfig filterConfig) {
            this.filterConfig = filterConfig;
           }
          }
        (3中配置的UserAction类中:return  mapping.findForward("userCreated");跳转到success页面
        (3中的MyRequestProcessor类:
            public class MyRequestProcessor extends RequestProcessor {
               public MyRequestProcessor() {
               }         
               protected boolean processPreprocess(HttpServletRequest request,HttpServletResponse response) {
              try {
                   System.out.println("arivce MyRequestProcessor 字符集设置");
                   request.setCharacterEncoding("gb2312");// 在此设置字符集
              } catch (Exception ex) {
                   System.out.println("字符集设置失败");
              }
               return true;
              }
            }
  下面就是问题的经典处了:
   当页面是直接从HTML标签里输出中文的情况下(如:<h2>测试STRUTS,获得参数</h2>)是能正确显示中文的。说明我的HTML解码没问题。
  正如多数人遇到的乱码问题一样,当我在test.jsp页面输入英文或者数字的时候在success.jsp能够正常显示
  当我输入中文时候,就输出的是"?"和一些乱码,我的最终配置成为上面背景中所示的版本是我一步一步边看各大高手的回答边改的结果。
  当我通过http://localhost:8080/myWeb/test.jsp访问test.jsp页面的时候正如我期待的一样,所以java类用于调试的DEBUG一字不少的全部能够在后台清清楚楚的看到,
       Filter的初始化System.out.println("filterConfig of init:!" + filterConfig);
       真正doFilter:System.out.println("Arive this Filter doFilter!");
       struts的controller:System.out.println("arivce MyRequestProcessor 字符集设置");
  以上三个DEBUG已经能够充分检证到我页面提交数据的时候确实已经把请求时编码设置为gb2312了,但是我的页面为什么还是不能正常显示中文了,我都快疯了。
   
   我看了很多类似问题的回答,看啊看,想啊想,但是我所期待的结果并没有跟我的付出成正比。
  1)我看到:页面向服务器发送数据时好象都是以UTF-8编码发送的,由于UTF-8和gb2312互相转换的时候会出现好多意想不到的问题,所以乱码了。
  2)我看到最多的是:改吧!request.setCharacterEncoding("gb2312")绝对可以让你的页面正常显示中文。
  3)我也看到:做个Filter吧,Filter的配置<url-pattern>/*</url-pattern>会让你访问任何页面时候把请求编码设置为gb2312
  4)我还看到:给Struts的Action做个<controller processorClass="com.encode.MyRequestProcessor"/>吧,这样应该就OK了
  5)最后看到:做个自己的ActionServlet覆盖Struts的ActionServlet
  
  我就是按照上面的步骤完成我在背景中所描述的那写配置的,第三步和第四步本来曾让我觉得100%能够解决掉我的乱码的,要不可能是我的人品有问题!
  第五步更是曾让我一度欣慰,于是就有了背景[(2,web.xml配置]中的servlet了。
  但是事与愿违,我开始思索:
  是不是本就不应该request.setCharacterEncoding("gb2312"),是不是应该换种编码(比如GBK,UTF-8),也许你已经开始笑我了。
  我还没那么傻,不是说默认就是以UTF-8编码方式发送数据的吗,所以我没有试过setCharacterEncoding("UTF-8"),但是我试过setCharacterEncoding("GBK"),
  可想而知,问题肯定是没能解决的。
  我不太明白编码原理,我只是大概知道什么UNICODE拉,gb2312拉一点点,反正我是不知道深一点的原理的。
  今天晚上太幸运了,突然看到 一个回复method="GET"换成method="POST"试试,理由是:POST是以ISO-8859-1编码发送数据的(但是为什么ISO-8859-1行而UTF-8就不行呢)。
  我抱着怀疑的态度改了,居然成功了,原来解决JSP中文乱码问题是这么简单!

  希望JSP中文乱码实例详解这篇文章对大家有点帮助,也希望每一个爱技术的人多多收获!


    分享: 收藏到CSDN 收藏到javaeye 收藏到博客园 收藏&分享
  • 浏览 (687)
  • 评论 (0)
  • 发表于 2009-09-17 11:28
    评分: 请先登录再投票,同一篇博客一月只能投票一次!
    无人投票

评论


发表评论

关注此文的人们还关注