java

位置:IT落伍者 >> java >> 浏览文章

开源技术—struts2中i18n的设置


发布日期:2023年09月11日
 
开源技术—struts2中i18n的设置
针对xxxclass建立xxxproperties文件可以对class中的Output设置本地化输出

更常用的方法是正对package建立packageNameproperties在其中设置ActionClassStringName=XXX

创建action都是……ApplicationAction extends ActionSupport{……}继承了ActionSupport类ActionSupport中有method getText()可以通过key获得properties中的设置

jsp文件使用properties文件中的设置首先需要AppActionSupport extends ActionSupport类在strutsxml中设置Action过滤让jsp页面通过该Action(class=yourPackageAppActionSupport)拦截这样在jsp页面可以使用标签<s:text name=ssage />

国际化是商业系统中不可或缺的一部分所以无论您学习的是什么Web框架它都是必须掌握的技能

其实Struts x在此部分已经做得相当不错了它极大地简化了我们程序员在做国际化时所需的工作例如如果您要输出一条国际化的信息只需在代码包中加入FILENAME_xx_XXproperties(其中FILENAME为默认资源文件的文件名)然后在strutsconfigxml中指明其路径再在页面用<bean:message>标志输出即可

不过所谓没有最好只有更好Struts 并没有在这部分止步而是在原有的简单易用的基础上将其做得更灵活更强大

国际化Hello World

下面让我们看一个例子——HelloWorld这个例子演示如何根据用户浏览器的设置输出相应的HelloWorld

    在Eclipse创建工程配置开发和运行环境(如果对这个步骤有问题可以参考我早前的文章《为Struts 做好准备》)

    在src文件夹中加入strutsproperties文件内容如下

    strutscustominresources=globalMessages

    Struts 有两个配置文件strutsxml和strutsproperties都是放在WEBINF/classes/下

    strutsxml用于应用程序相关的配置

    strutsproperties用于Struts 的运行时(Runtime)的配置

    在src文件夹中加入globalMessages_en_USproperties文件内容如下

    HelloWorld=Hello World!

    在src文件夹中加入globalMessages_zh_CNproperties文件内容如下

    HelloWorld=你好世界!在此想和大家分享一个不错的编写properties文件的Eclipse插件(plugin)有了它我们在编辑一些简体中文繁体中文等Unicode文本时就不必再使用nativeascii编码了您可以通过Eclipse中的软件升级(Software Update)安装此插件步骤如下

    展开Eclipse的Help菜单将鼠标移到Software Update子项在出现的子菜单中点击Find and Install

    在Install/Update对话框中选择Search for new features to install点击Next

    在Install对话框中点击New Remote Site

    在New Update Site对话框的Name填入PropEdit或其它任意非空字符串在URL中填入

    在Site to include to search列表中除上一步加入的site外的其它选项去掉点击Finsih

    在弹出的Updates对话框中的Select the features to install列表中将所有结尾为x的选项去掉(适用于Eclipse 版本的朋友)

    点击Finish关闭对话框

    在下载后同意安装再按提示重启Eclipse在工具条看到形似vi的按钮表示安装成功插件可用此时Eclpise中所有properties文件的文件名前有绿色的P的图标作为标识

    在WebContent文件夹下加入HelloWorljsp文件内容如下

    <%@ page contentType=text/html; charset=UTF%>

    <%@taglib prefix=s uri=/strutstags%>

    <html>

    <head>

      <title>Hello World</title>

    </head>

    <body>

      <h><s:text name=HelloWorld/></h>

      <h><s:property value=%{getText(HelloWorld)}/></h>

    </body>

    </html>

    发布运行应用程序在浏览器地址栏中输入出现图所示页面

    中文输出

    将浏览器的默认语言改为英语(美国)刷新页面出现图所示页面

    英文输出

上面的例子的做法与Struts x的做法相似似乎并不能体现Struts 的优势不过我在上面的例子用了两种方法来显示国际化字符串其输出是相同的其实这就是Struts 的一个优势因为它默认支持EL所示我们可以用getText方法来简洁地取得国际化字符串另外更普遍的情况——在使用UI表单标志时getText可以用来设置label属性例如

<s:textfield name=name label=%{getText(UserName)}/>

资源文件查找顺序

之所以说Struts 的国际化更灵活是因为它可以能根据不同需要配置和获取资源(properties)文件在Struts 中有下面几种方法

    使用全局的资源文件方法如上例所示这适用于遍布于整个应用程序的国际化字符串它们在不同的包(package)中被引用如一些比较共用的出错提示

    使用包范围内的资源文件做法是在包的根目录下新建名的packageproperties和package_xx_XXproperties文件这就适用于在包中不同类访问的资源

    使用Action范围的资源文件做法为Action的包下新建文件名(除文件扩展名外)与Action类名同样的资源文件它只能在该Action中访问如此一来我们就可以在不同的Action里使用相同的properties名表示不同的值例如在ActonOne中title为动作一而同样用title在ActionTwo表示动作二节省一些命名工夫

    使用<s:in>标志访问特定路径的properties文件使用方法请参考我早前的文章《常用的Struts 的标志(Tag)介绍》在您使用这一方法时请注意<s:in>标志的范围在<s:in name=xxxxx>到</s:in>之间所有的国际化字符串都会在名为xxxxx资源文件查找如果找不到Struts 就会输出默认值(国际化字符串的名字)

上面我列举了四种配置和访问资源的方法它们的范围分别是从大到小而Struts 在查找国际化字符串所遵循的是特定的顺序如图所示

资源文件查找顺序图

假设我们在某个ChildAction中调用了getText(usertitle)Struts 的将会执行以下的操作

    查找ChildAction_xx_XXproperties文件或ChildActionproperties

    查找ChildAction实现的接口查找与接口同名的资源文件MyInterfaceproperties

    查找ChildAction的父类ParentAction的properties文件文件名为ParentActionproperties

    判断当前ChildAction是否实现接口ModelDriven如果是调用getModel()获得对象查找与其同名的资源文件

    查找当前包下的packageproperties文件

    查找当前包的父包直到最顶层包

    在值栈(Value Stack)中查找名为user的属性转到user类型同名的资源文件查找键为title的资源;

    查找在strutsproperties配置的默认的资源文件参考例;

    输出usertitle

参数化国际化字符串

许多情况下我们都需要在动行时(runtime)为国际化字符插入一些参数例如在输入验证提示信息的时候在Struts 我们通过以下两种方法做到这点

    在资源文件的国际化字符串中使用OGNL格式为${表达式}例如

    validationrequire=${getText(fileName)} is required

    使用Java_Docs/html/zh_CN/api/java/text/l>javatextMessageFormat中的字符串格式格式为{ 参数序号(从开始) 格式类形(number | date | time | choice) 格式样式}例如

    validationbetween=Date must between { date short} and { date short}

在显示这些国际化字符时同样有两种方法设置参数的值

    使用标志的valuevaluevalueN的属性

    <s:text name=validationrequired value=User Name/>

    使用param子元素这些param将按先后顺序代入到国际化字符串的参数中例如

    <s:text name=validationrequired>

    <s:param value=User Name/>

    </s:text>

>让用户方便地选择语言>

开发国际化的应用程序时有一个功能是必不可少的——让用户快捷地选择或切换语言在Struts 通过ActionContextgetContext()setLocale(Locale arg)可以设置用户的默认语言不过由于这是一个比较普遍的应用场景(Scenario)所以Struts 为您提供了一个名in的拦截器(Interceptor)并在默认情况下将其注册到拦截器链(Interceptor chain)中它的原理为在执行Action方法前in拦截器查找请求中的一个名为request_locale的参数如果其存在拦截器就将其作为参数实例化Locale对象并将其设为用户默认的区域(Locale)最后将此Locale对象保存在session的名为WW_TRANS_IN_LOCALE的属性中

下面我将提供一完整示例演示它的使用方法

http://imgeducitycn/img_///gif align=top twffan=done>package tutorial;

http://imgeducitycn/img_///gif align=top twffan=done>

http://imgeducitycn/img_///gif align=top twffan=done>import javautilHashtable;

http://imgeducitycn/img_///gif align=top twffan=done>import javautilLocale;

http://imgeducitycn/img_///gif align=top twffan=done>import javautilMap;

http://imgeducitycn/img_///gif align=top twffan=done>

___Open_Image onclick=thisstyledisplay=none; Codehighlighter___Open_Textstyledisplay=none; Codehighlighter___Closed_Imagestyledisplay=inline; Codehighlighter___Closed_Textstyledisplay=inline; src=http://imgeducitycn/img_///gif align=top twffan=done>___Closed_Image  onclick=thisstyledisplay=none; Codehighlighter___Closed_Textstyledisplay=none; Codehighlighter___Open_Imagestyledisplay=inline; Codehighlighter___Open_Textstyledisplay=inline; src=http://imgeducitycn/img_///gif align=top twffan=done>publicclass Locales http://imgeducitycn/img_///gif twffan=done>{

___Open_Image onclick=thisstyledisplay=none; Codehighlighter___Open_Textstyledisplay=none; Codehighlighter___Closed_Imagestyledisplay=inline; Codehighlighter___Closed_Textstyledisplay=inline; src=http://imgeducitycn/img_///gif align=top twffan=done>___Closed_Image  onclick=thisstyledisplay=none; Codehighlighter___Closed_Textstyledisplay=none; Codehighlighter___Open_Imagestyledisplay=inline; Codehighlighter___Open_Textstyledisplay=inline; src=http://imgeducitycn/img_///gif align=top twffan=done>  public Map<String Locale> getLocales() http://imgeducitycn/img_///gif twffan=done>{

http://imgeducitycn/img_///gif align=top twffan=done>    Map<String Locale> locales =new Hashtable<String Locale>();

http://imgeducitycn/img_///gif align=top twffan=done>    localesput(American English LocaleUS);

http://imgeducitycn/img_///gif align=top twffan=done>    localesput(Simplified Chinese LocaleCHINA);

http://imgeducitycn/img_///gif align=top twffan=done>    return locales;

http://imgeducitycn/img_///gif align=top twffan=done>  }

http://imgeducitycn/img_///gif align=top twffan=done>}tutorial/Localesjava

<%@taglib prefix=s uri=/strutstags%>

<script type=text/javascript>

<!

  function langSelecter_onChanged() {

    documentlangFormsubmit();

  }

//>

</script>

<s:set name=SESSION_LOCALE value=#session[WW_TRANS_IN_LOCALE]/>

<s:bean id=locales name=tutorialLocales/>

<form action=<s:url includeParams=get encode=true/> name=langForm

  >

  Language: <s:select label=Language

    list=#localeslocales listKey=value  listValue=key

    value=#SESSION_LOCALE == null ? locale : #SESSION_LOCALE

    name=request_locale id=langSelecter

    onchange=langSelecter_onChanged() theme=simple/>

</form>LangSelectorjsp

上述代码的原理为LangSelectorjsp先实例化一个Locales对象并把对象的Map类型的属性locales赋予下拉列表(select) 如此一来下拉列表就获得可用语言的列表大家看到LangSelector有<s:form>标志和一段Javascript脚本它们的作用就是在用户在下拉列表中选择了后提交包含reqeust_locale变量的表单到Action在打开页面时为了下拉列表的选中的当前区域我们需要到session取得当前区域(键为WW_TRANS_IN_LOCALE的属性)而该属性在没有设置语言前是为空的所以通过值栈中locale属性来取得当前区域(用户浏览器所设置的语言)

你可以把LangSelectorjsp作为一个控件使用方法是在JSP页面中把它包含进来代码如下所示

<s:include value=/LangSelectorjsp/>

在例中的HellloWorldjsp中<body>后加入上述代码并在strutsxml中新建Action代码如下

<action name=HelloWorld>

  <result>/HelloWorldjsp</result>

</action>

或者如果你多个JSP需要实现上述功能你可以使用下面的通用配置而不是为每一个JSP页面都新建一个Action

<action name=*>

  <result>/{}jsp</result>

</action>

分布运行程序在浏览器的地址栏中输入出现图所示页面

HelloWorldaction src=http://imgeducitycn/img_///gif twffan=done>

HelloWorldaction

在下拉列表中选择American English出现图所示页面

HelloWorldaction src=http://imgeducitycn/img_///gif twffan=done>

HelloWorldaction

               

上一篇:JBoss虚拟主机安装部署指南收藏

下一篇:MyEclipse+struts+Hibernate配置开发手册