`
senvon
  • 浏览: 37295 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

struts2多语言支持的问题和研究

阅读更多

最近正在打算给分析工具加上国际化的支持。原本以为国际化是一件很简单的事情,中间发生了一个问题,让我重新认识了struts2.


顺便说一下,网上关于struts2多语言支持的文章,多半都是有问题的,国际化的支持不需要新建类,甚至不需要手动设置session。


struts2国际化的支持做的实在是很牛逼,按照网上的说明能很容易的写出demo来,并且基本上能一次测试通过。

但是,我的程序发生了点意外,如果没有意外,我也不会去研究的那么深入。。。。。。
如果要看入门的,请不要往下看了,网上已经有很多了

先看我的程序

登录页面国际化代码

 

<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>
function changeLanguage(){
	$.ajax({
		url:'relogin.htm',
		type:'POST',
		data:'request_locale='+$("#request_locale").val(),
		success:function(msg){
			window.location.reload();
		}
	});
}
 

 

 

主页面框架代码

 

<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使用不规范造成的错误。

 

 

 

 

 

请关注我们的产品www.groob.net

分享到:
评论

相关推荐

    struts2jar.zip

    9. **国际化和本地化**:Struts2支持多语言,可以通过资源文件来实现。 10. **异常处理**:Struts2提供了一套完整的异常处理机制,可以自定义错误页面和异常处理器。 总的来说,"struts2jar.zip"压缩包是一个实用...

    struts2-showcase.rar

    5. **国际化(i18n)**:如何为应用添加多语言支持。 6. **异常处理**:演示了如何配置和处理应用程序中的异常。 7. **Tiles布局**:使用Tiles插件来组织和定义页面模板。 8. **Ajax支持**:展示了Struts2与...

    struts2实现自主选择页面语言

    Struts2是一个强大的Java EE框架,它为构建MVC(模型-视图-控制器)架构的应用程序提供了便利。...通过深入研究这个项目,开发者可以更好地理解如何在实际项目中实现多语言支持,提高应用的国际化程度。

    Struts2Demo2

    7. **国际化(i18n)**:Struts2支持多语言,可以通过资源包文件(.properties)管理不同语言的文本,为用户提供本地化的界面。 通过Struts2Demo2,你可以学习到如何组织和配置一个Struts2项目,理解MVC设计模式在...

    struts2-src

    8. **国际化与本地化**:Struts2支持多语言环境,通过资源包(Properties文件)实现国际化和本地化。 深入研究Struts2源码,开发者可以更清楚地理解框架的工作原理,从而优化应用性能,解决实际问题,甚至为框架...

    Struts2项目代码

    6. **国际化与主题支持**:Struts2支持多语言环境,可以通过资源文件实现应用的国际化。同时,它还提供了多种主题和样式,可以改变UI的外观和布局。 7. **插件架构**:Struts2的插件机制允许扩展其功能,例如Struts...

    传智的struts2

    8. **国际化(i18n)**: 支持多语言应用。 9. **Struts2与其他技术的集成**:如Spring、Hibernate等,实现更复杂的应用架构。 学习Struts2的过程中,你将了解MVC模式、控制器的概念,以及如何通过配置文件来组织和...

    struts2-apps

    4. **国际化与本地化**:Struts2提供了强大的I18N支持,示例可能会包含如何处理不同语言和地区的设置。 5. **表单验证**:Struts2的验证框架允许开发者在服务器端对用户输入进行验证。示例可能包含如何定义验证规则...

    Struts2实战(Struts2 In Action中文版)

    6. **国际化与本地化**:学习如何在Struts2中实现多语言支持,提供全球化用户体验。 7. **Tiles布局**:结合Tiles插件,创建复用性强、结构化的页面布局。 8. **异常处理**:理解Struts2的异常处理机制,如何...

    struts2开源代码

    6. **国际化的支持**:Struts2可以方便地处理多语言环境,通过资源包(Properties文件)实现动态切换。 7. **异常处理**:Struts2提供了全局的异常处理机制,能够统一处理应用中的错误和异常。 在"Struts2App"这个...

    struts2使用手册

    - **国际化(Internationalization, i18n)**:Struts2提供了丰富的国际化支持,可以通过配置文件轻松实现多语言切换。 - **验证与转换(Validation & Conversion)**:Struts2提供了一套完整的验证和转换机制,可以...

    struts2框架的使用

    8. **国际化与本地化**:Struts2提供对多语言的支持,你可以创建资源文件(如`messages.properties`),并根据用户的locale选择相应的消息。 9. **插件系统**:Struts2拥有丰富的插件库,如JSON插件、Freemarker...

    struts开发的多语言项目

    通过研究这些文件,开发者可以学习如何在实际项目中实现Struts2的多语言支持,理解如何将国际化和本地化技术融入到Web应用的开发流程中。这样的项目实例对于提升开发者对多语言处理和Struts框架的理解大有裨益。

    struts2学习心得

    此外,OGNL(Object-Graph Navigation Language)表达式语言被广泛应用于Struts2中,用于访问和操作对象图,提高了代码的灵活性和表达力。 6. **Action调用与结果返回**:在Struts2中,Action的调用通过配置文件中...

    struts2项目源码

    Struts2支持多语言环境,源码中可能包含了资源文件,如`Messages.properties`,用于存储不同语言的字符串。通过配置,可以根据用户浏览器的设置动态加载相应语言的资源。 **9. 错误处理与异常处理** Struts2提供了...

    struts2源码最新

    6. **国际化与本地化**:Struts2支持多语言环境,可以通过资源文件轻松实现国际化和本地化。 7. **异常处理**:Struts2提供了全局的异常处理机制,当Action执行过程中抛出异常时,可以统一处理并跳转到特定的错误...

    struts2 论坛系统

    通过对这些文件的分析和学习,开发者可以深入了解如何利用Struts2和Hibernate来构建一个功能完善的论坛系统,包括用户注册登录、发帖、回帖、搜索、权限管理等多个模块的设计与实现。此外,开发者还可以进一步研究...

    struts2案例 struts2 struts2源码

    4. **国际化与本地化**:通过资源包(properties文件)实现多语言支持。 5. **异常处理**:配置全局或Action级别的异常处理策略。 6. **插件系统**:Struts2有丰富的插件库,如Tiles、FreeMarker等,可以扩展视图层...

    struts2详细介绍

    Struts2不仅继承了Struts1的优点,如清晰的MVC分离、易于维护和扩展等,还在许多方面进行了改进和增强,例如更好的国际化支持、更高效的错误处理机制以及更强大的表单处理能力。 对于初学者来说,理解Struts2的基本...

    struts2权威指南源码

    在实际开发中,理解和研究源码可以帮助解决框架使用中的问题,定制化开发,以及避免框架的潜在风险,例如著名的Struts2的安全漏洞。 总的来说,Struts2源码的学习涵盖了Java Web开发中的许多重要概念和技术,包括...

Global site tag (gtag.js) - Google Analytics