关于Struts2 国际化直接访问jsp读取Local修改
由于使用Struts2自带的国际化i18;在直接访问jsp页面时,多语言手动切换失败(如a标签链接);所以找了一些资料,发现是由于没有经过Struts2的action所以默认是获取本地Locale,而解决的方法有两种(自己猜的),一种是写一个filter和action类,在让所有直接访问都通过action;另外一种就是修改Struts2的依赖包xwork-core-2.3.34.jar的源代码。
我用的是改源码的方式:将xwork-core-2.3.34.jar中ActionContext.java中getLocale()方法修改为如下方法(参考 http://blog.csdn.net/zollty/article/details/8710718):
/* */ public Locale getLocale()
/* */ {
/* */ Locale locale = null;
/* */ Object tempObj = get(SESSION);
if (null != tempObj) {
tempObj = ((Map<String, Object>) tempObj)
.get("WW_TRABS_I18N_LOCALE");
if (null != tempObj){
locale = (Locale)tempObj;
setLocale(locale);
}
/* */ }
/* */
/* 225 */ if (locale == null) {
tempObj = (Locale)get("com.opensymphony.xwork2.ActionContext.locale");
if (null != tempObj){
locale = (Locale)tempObj;
} else {
locale = Locale.getDefault();
setLocale(locale);
}
/* 226 */
/* */ }
/* */
/* 230 */ return locale;
/* */ }
/* */ {
/* */ Locale locale = null;
/* */ Object tempObj = get(SESSION);
if (null != tempObj) {
tempObj = ((Map<String, Object>) tempObj)
.get("WW_TRABS_I18N_LOCALE");
if (null != tempObj){
locale = (Locale)tempObj;
setLocale(locale);
}
/* */ }
/* */
/* 225 */ if (locale == null) {
tempObj = (Locale)get("com.opensymphony.xwork2.ActionContext.locale");
if (null != tempObj){
locale = (Locale)tempObj;
} else {
locale = Locale.getDefault();
setLocale(locale);
}
/* 226 */
/* */ }
/* */
/* 230 */ return locale;
/* */ }
在这里顺便记一下修改源码方法:
先用反编译工具(jd-gui.exe)打开xwork-core-2.3.34.jar,找到ActionContext.class,保存其为ActionContext.java;
然后利用myeclipse创建com.opensymphony.xwork2包将ActionContext.java移入,这时候应该可以去项目路径去找class文件了
![](https://images2017.cnblogs.com/blog/1111426/201801/1111426-20180108154514707-709910531.png)
然后用解压工具打开xwork-core-2.3.34.jar替换ActionContext.class就OK了