关于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>