大家现在都清楚了,struts.i18n.encoding既应用于请求流也应用于返回流。但通过对源码org.apache.struts2.dispatcher.FilterDispatcher的研究发现好像只对requst指定了encode啊?大家请看源码
Java代码   1. public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {  
   2.     HttpServletRequest request = (HttpServletRequest) req;  
   3.         HttpServletResponse response = (HttpServletResponse) res;  
   4.         ServletContext servletContext = getServletContext();  
   5.         String timerKey = "FilterDispatcher_doFilter: ";  
   6.         try {  
   7.             UtilTimerStack.push(timerKey);  
   8.             request = prepareDispatcherAndWrapRequest(request, response);//这里是重点  
   9.         //这里省略后面的代码  
  10.         } finally {  
  11.             try {  
  12.                 ActionContextCleanUp.cleanUp(req);  
  13.             } finally {  
  14.                 UtilTimerStack.pop(timerKey);  
  15.             }  
  16.         }  
  17.     }  
  18. }  public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        ServletContext servletContext = getServletContext();
        String timerKey = "FilterDispatcher_doFilter: ";
        try {
            UtilTimerStack.push(timerKey);
            request = prepareDispatcherAndWrapRequest(request, response);//这里是重点
        //这里省略后面的代码
        } finally {
            try {
                ActionContextCleanUp.cleanUp(req);
            } finally {
                UtilTimerStack.pop(timerKey);
            }
        }
    }
}   prepareDispatcherAndWrapRequest
Java代码   1. protected HttpServletRequest prepareDispatcherAndWrapRequest(HttpServletRequest request, HttpServletResponse response) throws   
   2. ServletException {  
   3.         Dispatcher du = Dispatcher.getInstance();  
   4.         if (du == null) {  
   5.             Dispatcher.setInstance(dispatcher);  
   6.             dispatcher.prepare(request, response);//这里是重点  
   7.         } else {  
   8.             dispatcher = du;  
   9.         }  
  10.         //省略了一些代码  
  11.         return request;  
  12. }  protected HttpServletRequest prepareDispatcherAndWrapRequest(HttpServletRequest request, HttpServletResponse response) throws 
ServletException {
        Dispatcher du = Dispatcher.getInstance();
        if (du == null) {
            Dispatcher.setInstance(dispatcher);
            dispatcher.prepare(request, response);//这里是重点
        } else {
            dispatcher = du;
        }
        //省略了一些代码
        return request;
}   prepare
Java代码   1. public void prepare(HttpServletRequest request, HttpServletResponse response) {  
   2.         String encoding = null;  
   3.         if (defaultEncoding != null) {  
   4.             encoding = defaultEncoding;  
   5.         }  
   6.     //省略了一些代码  
   7.         if (encoding != null) {  
   8.             try {  
   9.                 request.setCharacterEncoding(encoding);//这里是重点  
  10.             } catch (Exception e) {  
  11.                 LOG.error("Error setting character encoding to '" + encoding + "' - ignoring.", e);  
  12.             }  
  13.         }  
  14.         //省略了一些代码  
  15. }  public void prepare(HttpServletRequest request, HttpServletResponse response) {
        String encoding = null;
        if (defaultEncoding != null) {
            encoding = defaultEncoding;
        }
    //省略了一些代码
        if (encoding != null) {
            try {
                request.setCharacterEncoding(encoding);//这里是重点
            } catch (Exception e) {
                LOG.error("Error setting character encoding to '" + encoding + "' - ignoring.", e);
            }
        }
        //省略了一些代码
}   defaultEncoding 在org.apache.struts2.dispatcher.Dispatcher下:
Java代码   1. @Inject(StrutsConstants.STRUTS_I18N_ENCODING)  
   2. public static void setDefaultEncoding(String val) {  
   3.     defaultEncoding = val;  
   4. }  @Inject(StrutsConstants.STRUTS_I18N_ENCODING)
public static void setDefaultEncoding(String val) {
    defaultEncoding = val;
}   问题1:在prepare函数中request.setCharacterEncoding(encoding);这句设置了encoding,但这里只是设置了request的字符编码吧?那response的呢? 问题2:我在项目中使用encodefilter,和struts.i18n.encoding:假设条件有三 1.encode filter中设置了request,response的编码都为UTF8                    2.struts.i18n.encoding=utf8                    3.web.xml中过滤器encode filter放在struts过滤器之前          这三者同时满足的情况下在表单中输入中文,返回正确(不是乱码)  但如果我修改(1),在encode filter仅设置response编码为utf8,其他条件不变则产生乱码!这是为什么?  如果我修改(3),将两个filter调换下顺序则发现也是乱码?就算Jsp页面设置为utf8也一样,filter执行顺序是和web.xml文件中的 filter-maping有关。这里按理应该是encode filter的编码设置覆盖struts2的编码设置吧?怎么还会乱码? 

解决方案 »

  1.   

    问题1:response也要设置一下字符编码
    问题2:在struts.xml <constant name="struts.i18n.encoding" value="utf-8"/>试一下
      

  2.   

    但问题就没发现struts2的过滤器中有response的编码设置啊
    在struts.xml  <constant name="struts.i18n.encoding" value="utf-8"/>是这样设置的啊
      

  3.   

    问题1:在prepare函数中request.setCharacterEncoding(encoding);这句设置了encoding,但这里只是设置了request的字符编码吧?那response的呢? 第一个问题:
        lz在上面已经列举了非常详尽的代码,可以看出struts2的过滤机制只对访问请求request做了设置,而并未对servlet回显数据response做设置....
        
        我翻了一下我的代码,都是用spring的filter估计弥补了这个(我没有自己测试一下)     <filter>
    <filter-name>SetCharacterEncoding</filter-name>
    <filter-class>
    org.springframework.web.filter.CharacterEncodingFilter
    </filter-class>
    <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
    </init-param>
    </filter> <filter-mapping>
    <filter-name>SetCharacterEncoding</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
      

  4.   

    根据javaeye论坛中的博友测试
    在struts.xml中将struts.i18n.encoding设置为UTF8,则response的编码是根据result的view所决定,如果是模板,比如freer,response的编码也是utf-8,但在jsp中取决于页面设置的编码。我根据他的方法测试jsp确实如此。
      

  5.   

    我遇到的问题很奇怪,JSP页面、数据库、数据库链接、filter encoding均设为UTF-8,但struts.i18n.encoding必须设为GBK才没有乱码。