大家现在都清楚了,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的编码设置吧?怎么还会乱码?
下面是测试附件:
分享到:
相关推荐
12. struts.i18n.encoding:这是国际化信息的内码,Struts2用于处理国际化信息。 13. struts.i18n.reload:这是一个布尔值,用于确定是否自动加载国际化信息。如果设置为true,Struts2将自动加载国际化信息。 14. ...
6. **struts.custom.i18n.resources**: 添加自定义的国际化资源文件,如`struts.custom.i18n.resources=myMessages`。 7. **struts.multipart.maxSize**: 设置上传文件的最大大小。 8. **struts.enable.Dynamic...
例如,你可以通过更改struts.locale属性来设置应用的默认区域设置,或者通过struts.i18n.encoding来设定Web应用的默认字符编码,这对于处理中文请求参数尤其重要。 struts.properties中的属性也可以在web.xml或...
<constant name="struts.i18n.encoding" value="UTF-8"/> <constant name="struts.custom.i18n.resources" value="struts/i18n/messages"/> ``` 3. 在Action或视图中使用:在Action中,你可以通过`ActionContext`...
struts.i18n.encoding The encoding to use for localization messages 国际化信息内码 struts.i18n.reload Whether the localization messages should automatically be reloaded 是否国际化信息自动加载 ...
这里,`struts.i18n.encoding`指定了资源文件的编码,`struts.action.extension`定义了动作映射的扩展名,而`struts.custom.i18n.resources`则列出了应用中所有要加载的资源包名称。 在Action类中,我们可以使用...
<constant name="struts.i18n.encoding" value="UTF-8"/> <constant name="struts.custom.i18n.resources" value="global/messages"/> ``` 这将告诉Struts2在哪里查找资源文件,并指定字符编码。 3. 使用资源键...
struts.locale 和 struts.i18n.encoding - **struts.locale**:用于指定Web应用的默认地区设置(locale)。这对于国际化应用来说非常重要。 - **struts.i18n.encoding**:指定Web应用的默认字符编码集。这在处理...
使用`<constant>`标签,设置`struts.i18n.resources`属性,值为资源文件的路径。例如: ```xml <constant name="struts.i18n.resources" value="messages"/> ``` 3. **在JSP中使用**:在JSP页面中,我们可以使用...
最后,关于 "struts_i18n_login" 这个压缩包,很可能包含了实现这样一个国际化登录界面的所有必要文件,包括 Struts 配置文件、JSP 页面、资源属性文件等。解压后,开发者可以参考这些示例代码来学习和理解 Struts 1...
- **struts.i18n.encoding** - **描述**:指定Web应用程序的默认字符编码。 - **示例**:设置默认字符编码为UTF-8。 - **配置**: ```properties struts.i18n.encoding=UTF-8 ``` - **struts.objectFactory**...
#### struts.i18n.encoding **含义**:指定用于本地化消息的编码。 **示例**:设置为`UTF-8`以确保正确处理各种字符集。 **应用场景**:确保国际化文本正确显示,避免乱码问题。 #### struts.i18n.reload **...
<constant name="struts.i18n.encoding" value="UTF-8"/> <constant name="struts.custom.i18n.resources" value="global/messages"/> ``` 这样,Struts2就会在指定的路径下查找资源文件。 4. **浏览器设置与...
struts处理中文乱码问题总结struts处理中文乱码问题总结struts处理中文乱码问题总结struts处理中文乱码问题总结
<constant name="struts.i18n.resources" value="com/yourpackage/messages"/> ``` 3. **在Action中使用**: 在Action类中,你可以通过`ValueStack`或者`ActionContext`来获取和设置国际化文本。例如: ```java ...
- **.struts.properties**:在Struts1.x中,国际化的资源文件通常命名为*.properties,例如messages.properties,其中包含了默认的语言(通常是英语)的文本。 - **多语言支持**:为了支持其他语言,可以创建如...
META-INF/MANIFEST.MForg.springframework.web.struts.ActionServletAwareProcessor.class org.springframework.web.struts.ActionSupport.class org.springframework.web.struts.AutowiringRequestProcessor.class ...
在Struts2的配置文件`struts.xml`中,我们需要添加特定的拦截器`i18n`,它负责根据用户的浏览器设置自动选择相应的语言资源包。配置如下: ```xml <interceptor name="i18n" class="org.apache.struts2....
3. `struts.i18n.encoding`: 指定请求参数的默认编码,对于处理中文字符尤其重要,如设置为`GBK`或`GB2312`。 4. `struts.objectFactory`: 该属性定义了默认的ObjectFactory,用于创建对象,如Spring集成时,默认值...