首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

关于struts.i18n.encoding的疑问,该如何解决

2012-02-26 
关于struts.i18n.encoding的疑问大家现在都清楚了,struts.i18n.encoding既应用于请求流也应用于返回流。但

关于struts.i18n.encoding的疑问
大家现在都清楚了,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:response也要设置一下字符编码
问题2:在struts.xml <constant name="struts.i18n.encoding" value="utf-8"/>试一下

[解决办法]

楼主研究得好深,期待高手
[解决办法]
问题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>


热点排行