发表时间:昨天 关键字: 李刚
struts2.0里有这么一个配置,相信大家都见过.
Java代码 复制代码
  1. <constant name="struts.i18n.encoding" value="gbk" />  


首先我们来看看struts2.0权威指南中的一段话,这段话是对上面这行配置的解释:
引用
指定web应用的默认编码集,该属性对于处理中文请求参数非常有用。对于获取中文请求参数,应该将该属性设置未gbk活db2312,当该参数为gbk时,相当于调用httpservletrequest的setcharacterencoding


原文地址见<struts2.0权威指南>第79页,第21行.
http://book.csdn.net/bookfiles/479/10047916715.shtml

<constant name="struts.i18n.encoding" value="gbk" />这个参数的含义按照<struts2.0权威指南>的说法是作用在request的时候,也就是数据请求的时候.

但是有一点点常识的人都知道,一般处理请求的编码问题时,我们会加一个filter.

Java代码 复制代码
  1. <filter>  
  2.         <filter-name>CharacterEncodingFilter</filter-name>  
  3.         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
  4.         <init-param>  
  5.             <param-name>encoding</param-name>  
  6.             <param-value>UTF-8</param-value>  
  7.         </init-param>  
  8.         <init-param>  
  9.             <param-name>forceEncoding</param-name>  
  10.             <param-value>true</param-value>  
  11.         </init-param>  
  12. </filter>  


这个filter会调用request的setCharacterEncoding方法:
request.setCharacterEncoding(this.encoding);

而李刚的意思是指struts.i18n.encoding可以获得同样的效果.

只可惜的是事情不是这样的,首先放下真相,假设李刚是正确的.那么我们来说说struts2的作者这样做的目的是什么,搞这么一个这个参数,那么这个参数要起作用必须在struts的filter之后才能起作用,如果有filter的mapping定义在struts的之前,那么这个filter就不能享受struts2的优惠政策了.于是我们可以得到以下结论:
如果李刚正确,那么xwork2.0作者的水平还真是有限(因为这个参数是xwork2读取得).

那么上面这个结论是不是正确呢,那得看李刚是不是正确了.
那么李刚得描述正确吗??????????????????????????????
答案得否定的,而且错的很离谱,太离谱.

这个参数的意思是指response返回的之前,设置content-type里charset的类型,注意,这里是返回的时候,而不是请求的时候,完全不在同一个阶段.那么ahuaxuan是正确的吗,看代码,拿代码说话.

场景:ahuaxuan使用的是freemaker作为result.
我们知道struts2.0有一个freemarkermanager.里面有一段代码
Java代码 复制代码
  1. private String encoding;  
  2.       
  3.     @Inject(StrutsConstants.STRUTS_I18N_ENCODING)  
  4.     public void setEncoding(String encoding) {  
  5.         this.encoding = encoding;  
  6.     }  


这段代码的含义是吧<constant name="struts.i18n.encoding" value="gbk" />中的gbk赋值给FreemakerManager中的encoding变量.

接着.看看struts2.0如何创建freemaker的configuration

Java代码 复制代码
  1. protected freemarker.template.Configuration createConfiguration(ServletContext servletContext) throws TemplateException {  
  2.         freemarker.template.Configuration configuration = new freemarker.template.Configuration();  
  3.   
  4.         configuration.setTemplateLoader(getTemplateLoader(servletContext));  
  5.   
  6.         configuration.setTemplateExceptionHandler(TemplateExceptionHandler.HTML_DEBUG_HANDLER);  
  7.   
  8.         configuration.setObjectWrapper(getObjectWrapper());  
  9. //看看,把刚才读出来的encoding设置给freemarker的configuration对象了.  
  10.         if (encoding != null) {  
  11.             configuration.setDefaultEncoding(encoding);  
  12.         }  
  13.   
  14.         loadSettings(servletContext, configuration);  
  15.   
  16.         return configuration;  
  17.     }  


看到没有,刚才那个encoding变量被设置给freemaker的configuration了.那么在什么地方用这个encoding呢,真相来了:
template.getEncoding方法默认情况下会返回configuration中的encoding,就是我们之前的<constant name="struts.i18n.encoding" value="gbk" />
Java代码 复制代码
  1. String encoding = template.getEncoding();  
  2.   
  3.             if (encoding != null) {  
  4.                 contentType = contentType + "; charset=" + encoding;  
  5.             }  
  6.   
  7.             ServletActionContext.getResponse().setContentType(contentType);  


这说明什么?说明这个参数压根儿就不是在请求的时候用的,而是指定response中返回流的编码方式.一个天一个地啊.

由此可见俺xwork2.0作者的水平并不差,只是有些人没有理解而已.然后还误导一群人.

其实俺觉得,书写的不好也没有问题,东抄西抄问题也不大,最大的问题是自己一知半解就出来误导他人.大家自己判断吧.

  • 828b0b0e-77e4-3c81-a67f-c907d285f6e2-thumb
  • 大小: 21 KB