java struts2国际化代码下载_struts2的国际化-I18nInterceptor源码解析

众所周知,struts2中使用了大量的拦截器(即是传说中的interceptor),其中默认的拦截器可以参见struts2源码中的struts-default.xml文件,如下图

a4c26d1e5885305701be709a3d33442f.png

可以看到,其中国际化使用的拦截器为com.opensymphony.xwork2.interceptor.I18nInterceptor,那么接下来分析一下I18nInterceptor这个类。

一.属性

I18nInterceptor有三个属性,分别为parameterName,requestOnlyParameterName,attributeName。

parameterName:http

request请求中的参数名字,该参数反映了应该转向的locale,并且保存在session中,所以会话过程都有效。默认为request_locale。

requestOnlyParameterName:http

request请求中的参数名字,该参数反映了应该转向的locale,不保存在session中,所以只对当前请求有效。默认为request_only_locale。

attributeName:session中保存用户选择的locale值对应的key值。默认值为WW_TRANS_I18N_LOCALE

二.方法

拦截器中最重要的方法当属intercept方法,其他方法暂时忽略。该方法的逻辑如下:

1.获取parameters对象。Map params =

invocation.getInvocationContext().getParameters()

2.在params在取出并移除request_locale。 Object

requested_locale =

params.remove(parameterName);(parameters对象获取参数得到的是一个字符串数组)

2.1 requested_locale不为null,是Array,长度为1,取出requested_locale的值。否则,2.2

2.2

返回requested_locale

3.在step2中获取到的request_locale如果为空,则将2中的parameterName换成requestOnlyParameterName,执行step2,返回requested_locale

4.如果通过step2和step3获取到的requested_locale不为null,则将requested_locale转换成locale并保存在session中(注意:如果获取到的requested_locale.toString()为null或空字符串或者"_",此时locale=Locale.getDefault())。

5.如果通过step2和step3获取到的requested_locale为null,则判断session中key=attributeName的value值是否存在,若存在则locale=session.get(attributeName),否则locale

=

invocation.getInvocationContext().getLocale()(此处意思是没有找到重写的locale定义,则保持当前的invocation

locale,即用户在浏览器中设置的语言)。

至此,通过I18nInterceptor得到了locale,此后的处理就不言而喻了,肯定就是根据locale取值了(见struts2的国际化(二)),略。

可以看出:用户在画面设置的locale优先级高于浏览器设置语言得到的locale。

以下附例子一个

a4c26d1e5885305701be709a3d33442f.png

可以看到此处超链接处设置request_locale=en_US,这样struts2获取到的locale当然就是en_US,此时不管浏览器语言设置成什么,画面显示的都是英文的资源,并且在会话期间都有效。若设置的是request_only_locale=en_US,这样只是在当前请求下会显示英文界面,刷新页面就会显示中文了。

至此,struts2的国际化相关内容已经写完整。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值