大家现在都清楚了,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的编码设置吧?怎么还会乱码?
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的编码设置吧?怎么还会乱码?
解决方案 »
- JDK问题
- HtmlParser 解析html数据问题
- hibernate order by 的问题
- 大家近来看有一下, 一个包含List的JavaBean, 再把这个JavaBean加入到另外一个ArrayList中, 把这个ArrayList传递到前台页面的话该怎样实现分页?
- 网站整合
- 关于java delphi UDP通信的中文问题。希望帮忙解答,谢谢。
- 使用jstl出错
- 请告诉我J2EE,hibernate,spring的思想...请告诉我OOP的思想
- 关于学习EJB 大家进来帮帮我谢谢
- 请教在jdk1.4下开发的struts能否顺利的在jdk1.3下运行,急,在线等
- 请教:在windows/linux平台下,如何用java代码释放掉指定网络端口的IP?(只知道IP)
- 不知道出了什么错误啊 急
问题2:在struts.xml <constant name="struts.i18n.encoding" value="utf-8"/>试一下
在struts.xml <constant name="struts.i18n.encoding" value="utf-8"/>是这样设置的啊
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>
在struts.xml中将struts.i18n.encoding设置为UTF8,则response的编码是根据result的view所决定,如果是模板,比如freer,response的编码也是utf-8,但在jsp中取决于页面设置的编码。我根据他的方法测试jsp确实如此。