Struts2: ActionSupport类中国际化(i18N)功能的实现

Struts2中,ActionSupport类对国际化(i18N)功能的实现是通过LocaleProvider接口和TextProvider接口来完成的 — LocaleProvider接口提供查询文本所需的语言信息(Locale),而TextProvider负责根据Locale获取显示的文本:

public class ActionSupport implements Action ..., TextProvider, LocaleProvider,...{  
}

LocaleProvider接口

LocaleProvider接口很简单,其中只定义了一个方法用于提供Locale信息:

/**
 * Gets the provided locale.
 *
 * @return  the locale.
 */
Locale getLocale();  

在ActionSupport类对getLocale()方法的实现中,返回的是ActionContext中的Locale(也即客户端浏览器中的Locale设置):

ActionContext ctx = ActionContext.getContext();  
return ctx.getLocale();  

如果有需要,继承自ActionSupport的action类可以覆写该getLocale()方法,从别的地方获取Locale信息(比如,从数据库中获取用户之前所设定的Locale)。

TextProvider接口

TextProvider接口定义了一系列用于获取文本的方法(主要是对getText()方法进行overload),而ActionSupport对这些方法的实现全部都是由TextProviderFactory所生成的实例textProvider(TextProviderSupport对象)来完成的:

private TextProvider getTextProvider() {  
    TextProviderFactory tpf = new TextProviderFactory();
    textProvider = tpf.createInstance(getClass(), this);
}

在上面的例子中,ActionSupport将自身作为LocaleProvider对象(this)传给了TextProviderFactory;因此,最终生成出来的TextProviderSupport实例将使用ActionSupport中所定义的Locale。

Chuan Shao

Read more posts by this author.

Shanghai

Subscribe to Chuan's blog

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!