最近正在打算给分析工具加上国际化的支持。原本以为国际化是一件很简单的事情,中间发生了一个问题,让我重新认识了struts2.
顺便说一下,网上关于struts2多语言支持的文章,多半都是有问题的,国际化的支持不需要新建类,甚至不需要手动设置session。
struts2国际化的支持做的实在是很牛逼,按照网上的说明能很容易的写出demo来,并且基本上能一次测试通过。
但是,我的程序发生了点意外,如果没有意外,我也不会去研究的那么深入。。。。。。
如果要看入门的,请不要往下看了,网上已经有很多了
先看我的程序
登录页面国际化代码
function changeLanguage(){
$.ajax({
url:'relogin.htm',
type:'POST',
data:'request_locale='+$("#request_locale").val(),
success:function(msg){
window.location.reload();
}
});
}
#----------------------------------------------------------------------------
<div id="language">
<s:text name="login.language"/>
<s:select name="request_locale" id="request_locale" value="#session['WW_TRANS_I18N_LOCALE']"
list="%{#{'zh':'中文', 'en':'English'}}" onchange="changeLanguage();">
</s:select>
</div>
主页面框架代码
<frameset cols="20%,*" border="1"> <frame src="<%=request.getContextPath()%>/page/menu.jsp" name="menu" marginHeight="0px" marginwidth="0px" scrolling="no"></frame> <frameset rows="30,*" border="0"> <frame src="<%=request.getContextPath()%>/page/top.jsp" name="top"></frame> <frame src="<%=request.getContextPath()%>/page/configure/welcome.html" name="main"></frame> </frameset> </frameset>
其中menu.jsp和left.jsp都需要用到国际化。
神奇的现象出现了,menu.jsp和left.jsp都没有使用国际化,而之前的登录页面上,国际化做的很好。。。。。。难不成是神仙显灵了???
按照一般的经验,这个是完全没理由的,之前的页面国际化做的很好,后面的页面国际化失灵了????
中间略去很多痛苦的过程,下面贴出我的研究结果
struts2在国际化上面,有两个地方存放了Locale属性,一个是ActionContext.setLocale();还有一个是session.getAttribute("WW_TRANS_I18N_LOCALE")
ActionContext中的属性是在FilterDispatcher.prepareDispatcherAndWrapRequest的时候被设置进去的,这个值一直是HTTP协议头中的Locale
session中的变量是在I18nInterceptor被调用的时候,被设置进去的,这个值是参数中通过request_locale传输进去的
国际化的输出,是调用text标签或者getText方法来实现的,这边需要使用到ActionSupport中的TextProvider对象,这个对象将会调用最终的ResourceBundle进行输出。
而TextProvider的却是在ActionSupport初始化的时候,调用ActionContext.getLocale()生成的。
换句话说,session中的Locale对象,在国际化的输出中没有发挥任何作用,session中的Locale对象,是为了保存用户输入的自定义的Locale对象,以及给ActionContext赋值用的。
而我的问题发生在,在主页面显示的请求过程中,并没有调用到I18nInterceptor。。。
FilterDispatcher是配置的所有的连接都会调用的,问题就发生在主页面在显示frame的时候,使用的是直接调用jsp的方法来实现的,在ActionContext.setLocale()一直都浏览器本身的Locale,但是并没有触发I18nInterceptor,所以,session中保存的Locale没有被覆盖出来,导致页面上一直都显示是浏览器的语言。。。。
知道原因以后,解决方法就好办很多,只要把主页面的frame稍加改变就解决了这个问题
<frameset cols="20%,*" border="1"> <frame src="<%=request.getContextPath()%>/page/menu.htm" name="menu" marginHeight="0px" marginwidth="0px" scrolling="no"></frame> <frameset rows="30,*" border="0"> <frame src="<%=request.getContextPath()%>/page/top.htm" name="top"></frame> <frame src="<%=request.getContextPath()%>/page/configure/welcome.html" name="main"></frame> </frameset> </frameset>
让本来直接请求jsp的,经过一下action的中转,尽管程序本身没有写任何东西,但是在执行过程中却会把本来没有执行的I18nInterceptor,给加进去,会用session中已经存在的Locale覆盖掉浏览器传输的Locale,问题就解决了。
引申出的问题,因为页面上使用text标签来进行浏览器国际化输出的,所有标签都是依赖于valueStack进行参数传递的。如果像我上面不规范的调用过程,会造成很多莫名其妙的错误来。
需要说明的,这边并不是struts2的BUG,是我们对struts2使用不规范造成的错误。
相关推荐
struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别...
整个工程的源码,拷过去即可运行,例子简单明了。 自己经过几日的调查开发实现的,希望对大家有帮助。
Struts2的ajax支持
struts1多国语言的实现 struts1多国语言的实现
struts2 语言国际化配置和使用、页面按钮实现改变显示语言
Struts2多语言切换示例,myeclipse源码可直接导入
struts2 资料struts2 资料struts2 资料struts2 资料
struts2 模板语言 宏定义的语法结构、实例详解
struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全...
Struts2是一套非常优秀的Java WEB应用框架,实现优雅、功能强大、使用简洁。目前已有大量的企业项目采用Struts2来...学习完本视频,你会真正理解Struts2相对于Struts1的优雅和简洁,并使你具备开发Struts2项目的能力。
关于添加Struts2支持 关键字:Struts2 文档类型;doc
NetBeans Struts2 插件 惟一一个支持Struts2的IDE
struts2源码 struts2案例 struts2使用包
Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现.
struts1 struts2 Struts1和Struts2区别
struts2-core-2.0.1.jar, struts2-core-2.0.11.1.jar, struts2-core-2.0.11.2.jar, struts2-core-2.0.11.jar, struts2-core-2.0.12.jar, struts2-core-2.0.14.jar, struts2-core-2.0.5.jar, struts2-core-2.0.6.jar,...
Struts1和Struts2的区别和对比 Struts1和Struts2的区别和对比
一个很好的关于Struts2的讲义!struts2讲义struts2讲义struts2讲义struts2讲义struts2讲义struts2讲义
struts2和servlet的共存问题
Struts2 Struts2 超好的Struts2 pdf 文档 Struts2 Struts2 超好的Struts2 pdf 文档 Struts2.pdf文档