在本节开始之前,请读者把包级别的国际化信息删掉,仅保留全局级别的国际化信息。
在9.3.3小节中,已经学过修改、使用浏览器语言设置的方式了,这里就不赘述了。接下来看看其它的方式
还可以使用Struts2的常量设置来覆盖浏览器的语言设置。比如前面的示例,在struts.xml中加上struts.locale这个常量,值为需要使用的语言,示例如下:
这时候,会发现无论怎么修改浏览器的语言设置,Struts2都会去访问中文信息了。
以上的两种设置,还可能满足不了日常需求:
幸好Struts2提供了最灵活的、也是级别最高的方式,那就是由用户选择语言。用户只要在提交请求的时候加上request_locale这个参数,并提供对应的值就可以自由选择语言了。
这得力于Struts2的i18n内建拦截器,defaultStack拦截器栈引用了i18n拦截器,因此,能很方便的由用户来选择语言。
i18n拦截器在Action运行之前会检查请求中是否包含了一个叫做“request_locale”的参数,如果存在此参数,则会用它的值建立一个Locale对象,并用这个Locale对象去覆盖Struts2的常量设置和浏览器的语言设置。除此之外,i18n拦截器还会把这个Locale对象放到名为WW_TRANS_I18N_LOCALE的Session属性中去,而这个属性也会覆盖Struts2的常量设置和浏览器的语言设置。因此,只需要传入一次request_locale参数,session就会记住用户的选择,整个网站就会都变成用户选择的语言了。
来示例一下,第一次访问结果页面的时候,输出相关的session属性,如下:
由于当前的struts.xml设置常量struts.locale的值为zh_CN,所以,第一次访问将会使用常量设置的中文,而且session中也没有WW_TRANS_I18N_LOCALE这个属性。运行结果如下:
图9.10 使用常量配置指定国际化语言种类的结果
再次访问的时候,在请求里面加上request_locale参数,设置值为en_US,完整URL为http://localhost:9080/helloworld/i18nAction.action?request_locale=en_US。
这时候,请求中带有request_locale参数并指定为英文,因此,页面访问英文的国际化信息,并将en_US存入了session。运行结果如下:
图9.11 使用用户请求参数指定国际化语言种类的结果
再来访问一次,访问路径为:http://localhost:9080/helloworld/i18nAction.action,虽然这次请求中没有包含request_locale参数,但是session已经纪录了用户上次选择的英文,因此页面仍然访问英文信息,且session中仍然有en_US。
对于这三种指定语言种类的方式,其优先级为:
用户指定参数 > struts.xml中配置常量 > 浏览器设置
而且,用户参数指定的方式,只需要设置一次就可以了,在整个session生命周期内,都不用再次设置。
私塾在线网站原创《研磨struts2》系列
转自请注明出处:【http://sishuok.com/forum/blogPost/list/0/4088.html】
欢迎访问http://sishuok.com获取更多内容