WebWork2.2新特性:使用国际化拦截器

来源:互联网 发布:二次元图片下载软件 编辑:程序博客网 时间:2024/05/17 05:55
其实这个I18nInterceptor很简单,而且实际应用中根据实际需求需要进行变通,所以这个I18nInterceptor并不是很实用,当然还是提供了一定的参考作用的.

首先我们来看一下如何使用这个拦截器.

首先我们需要有一个Action,为了演示,其实最简单的Action就可以,例如

public class I18nIcAction extends ActionSupport
{
public String execute()
{
return SUCCESS;
}
}

展示的页面例子如下:

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="webwork" prefix="ww" %>
<html>
<head>
<title>Test I18n Interceptor</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
</head>

<body>
Choose: <a href="?locale=en">English Page</a> ,
<a href="?locale=zh_CN">Chinese Page</a>
<br><br>
Content:<ww:text name="desc"/>
</body>
</html>


其中我们使用"locale"作为locale的参数名,页面里面有2个选项:英文和中文.

对应的资源文件有2个(或者3个,如果包括缺省一个的话):

英文的I18nIcAction_en.properties内容为:
desc=english

中文的I18nIcAction_zh_CN.properties内容为:
desc=/u7b80/u4f53/u4e2d/u6587

接下来我们在xwork.xml里面定义我们的action和拦截器:

<package name="i18nic" extends="webwork-default" namespace="/i18nic">
<interceptors>
<interceptor name="i18n" class="com.opensymphony.xwork.interceptor.I18nInterceptor">
<param name="parameterName">locale</param>
<param name="attributeName">ww_locale</param>
</interceptor>

<interceptor-stack name="i18nStack">
<interceptor-ref name="i18n"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>

<default-interceptor-ref name="i18nStack"/>

<action name="index" class="com.jscud.ww2test.i18nic.I18nIcAction">
<result name="success" type="dispatcher">
<param name="location">/i18nic/index.jsp</param>
</result>
</action>
</package>

所有的工作都好了,发布并运行访问 /i18nic/index.action,一切和预想的一样.
通过查看I18nInterceptor的源码,我们可以看到这个拦截器的工作原理是这样的:

如果参数中指定了locale,那么拦截器分析参数,并把locale保存到session中.
在后面的action中,拦截器从session中获取这个locale,并设置action的locale,从而保持用户的设置.
在后续页面还可以继续切换locale.
从源码分析结果来看,这样做也会有一些实际的问题:

session过期后,用户不知道发生了什么,系统使用缺省的locale.
只能影响通过action操作的页面
在实际使用中,我们也要考虑如何解决后面2个问题,例如通过cookie,或者把用户的配置保存在数据库里等,这些实现就要结合实际代码进行实现了,完全可以不需要这个I18nInterceptor就可以实现,当然也很简单.