大家现在都清楚了,struts.i18n.encoding既应用于请求流也应用于返回流。但通过对源码org.apache.struts2.dispatcher.FilterDispatcher的研究发现好像只对requst指定了encode啊?大家请看源码
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
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
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下:
@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的编码设置吧?怎么还会乱码?
下面是测试附件:
分享到:
相关推荐
struts.i18n.encoding The encoding to use for localization messages 国际化信息内码 struts.i18n.reload Whether the localization messages should automatically be reloaded 是否国际化信息自动加载 ...
struts2i18n.rar struts2 i18n的实例, 环境是myeclipse6. struts2.16. struts国际化。
struts处理中文乱码问题总结struts处理中文乱码问题总结struts处理中文乱码问题总结struts处理中文乱码问题总结
struts.i18n.encoding=GBK ) web.xml(仅写出中文处理部分,spring的配置不用改变) <filter-name>encodingFilter <filter-class>org.springframework.web.filter.CharacterEncodingFilter <init-param> ...
struts1中实现了国际化(i18n)的登陆界面
struts.locale=zh_CN struts.i18n.encoding=UTF-8 struts.serve.static.browserCache=false struts.url.includeParams=none 其中locale、encoding就是字符集的设定了。 3. 在web.xml加个filter <!-- zh-...
struts_I18N的包,已经用jar打包好了,直接用
META-INF/MANIFEST.MForg.springframework.web.struts.ActionServletAwareProcessor.class org.springframework.web.struts.ActionSupport.class org.springframework.web.struts.AutowiringRequestProcessor.class ...
非常清晰可用的struts2 i18n国际化实例,非常适合初学者,不会让大家失望的,有问题还请求指教,大家互相学习,谢谢
struts.xml文件配置解释,对action配置进行说明
spring-webmvc-struts.jar对Struts和Spring整合时需要用到的包
<constant name="struts.i18n.encoding" value="GBK"> <!--设置临时上传目录--> <constant name="struts.multipart.saveDir" value="d:\"></constant> <package name="default" extends="struts-default"> ...
一个超级简单的Struts2国际化demo
struts2国际化_i18n 完整实例。欢迎下载。
import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionForward;import org.apache.struts.action.ActionMapping;import org.apache.struts.actions.DispatchAction等缺少
struts2 中际化示例,加上s2sh所需的Jar就可以运行!如果不行留言,把demo发给你! 示例图:http://blog.csdn.net/liuc0317/archive/2010/12/01/6048552.aspx
NULL 博文链接:https://wellfrog.iteye.com/blog/612014
绝对可以解决这个这个问题。Struts初学者绝对可以受用的方法。
struts.xml文件详解示例代码,可以参照http://blog.csdn.net/jiajia333666/article/details/47979919 阅读。
<constant name="struts.i18n.encoding" value="UTF-8" /> <!-- 该属性指定需要Struts 2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts 2处理。 如果用户需要指定多个请求后缀,则...