知识大全 开源技术—struts2中i18n的设置

Posted 文件

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 开源技术—struts2中i18n的设置相关的知识,希望对你有一定的参考价值。

针对xxx class 建立xxx properties文件 可以对class中的Output设置本地化输出 更常用的方法是正对package 建立packageName properties 在其中设置ActionClass StringName=XXX 创建action都是 ……ApplicationAction extends ActionSupport…… 继承了ActionSupport类 ActionSupport中有method getText()可以通过key获得properties中的设置 jsp文件使用properties文件中的设置 首先需要AppActionSupport extends ActionSupport类 在struts xml中设置Action过滤 让jsp页面通过该Action(class= yourPackage AppActionSupport )拦截 这样在jsp页面可以使用标签<s:text name= ssage />  

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

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

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

国际化Hello World

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

    在Eclipse创建工程配置开发和运行环境(如果对这个步骤有问题 可以参考我早前的文章《为Struts 做好准备》) 在src文件夹中加入struts properties文件 内容如下 struts custom i n resources=globalMessages > 在src文件夹中加入globalMessages_en_US properties文件 内容如下 HelloWorld=Hello World! 在src文件夹中加入globalMessages_zh_CN properties文件 内容如下 HelloWorld=你好 世界! 在此想和大家分享一个不错的编写properties文件的Eclipse插件(plugin) 有了它我们在编辑一些简体中文 繁体中文等Unicode文本时 就不必再使用native ascii编码了 您可以通过Eclipse中的软件升级(Sofare Update)安装此插件 步骤如下 展开Eclipse的Help菜单 将鼠标移到Sofare 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文件夹下加入HelloWorl jsp文件 内容如下 <%@ page  contentType= text/; charset=UTF %><%@taglib prefix= s uri= /struts tags %><><head>    <title>Hello World</title></head><body>    <h ><s:text name= HelloWorld /></h >    <h ><s:property value= %getText( HelloWorld ) /></h ></body></> 发布运行应用程序 在浏览器地址栏中输入 出现图 所示页面 图 中文输出 将浏览器的默认语言改为 英语(美国) 刷新页面 出现图 所示页面
    图 英文输出
上面的例子的做法 与Struts x的做法相似 似乎并不能体现Struts 的优势 不过 我在上面的例子用了两种方法来显示国际化字符串 其输出是相同的 其实 这就是Struts 的一个优势 因为它默认支持EL 所示我们可以用getText方法来简洁地取得国际化字符串 另外更普遍的情况——在使用UI表单标志时 getText可以用来设置label属性 例如 <s:textfield name= name label= %getText( UserName ) />

资源文件查找顺序

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

    使用全局的资源文件 方法如上例所示 这适用于遍布于整个应用程序的国际化字符串 它们在不同的包(package)中被引用 如一些比较共用的出错提示 使用包范围内的资源文件 做法是在包的根目录下新建名的package properties和package_xx_XX properties文件 这就适用于在包中不同类访问的资源 使用Action范围的资源文件 做法为Action的包下新建文件名(除文件扩展名外)与Action类名同样的资源文件 它只能在该Action中访问 如此一来 我们就可以在不同的Action里使用相同的properties名表示不同的值 例如 在ActonOne中title为 动作一 而同样用title在ActionTwo表示 动作二 节省一些命名工夫 使用<s:i n>标志访问特定路径的properties文件 使用方法请参考我早前的文章《常用的Struts 的标志(Tag)介绍》 在您使用这一方法时 请注意<s:i n>标志的范围 在<s:i n name= xxxxx >到</s:i n>之间 所有的国际化字符串都会在名为xxxxx资源文件查找 如果找不到 Struts 就会输出默认值(国际化字符串的名字)

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

图 资源文件查找顺序图

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

    查找ChildAction_xx_XX properties文件或ChildAction properties 查找ChildAction实现的接口 查找与接口同名的资源文件MyInterface properties 查找ChildAction的父类ParentAction的properties文件 文件名为ParentAction properties 判断当前ChildAction是否实现接口ModelDriven 如果是 调用getModel()获得对象 查找与其同名的资源文件 查找当前包下的package properties文件 查找当前包的父包 直到最顶层包 在值栈(Value Stack)中 查找名为user的属性 转到user类型同名的资源文件 查找键为title的资源; 查找在struts properties配置的默认的资源文件 参考例 ; 输出user title

参数化国际化字符串

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

    在资源文件的国际化字符串中使用OGNL 格式为$表达式 例如 validation require=$getText(fileName) is required 使用Java_Docs//zh_CN/api/java/text/l >java text MessageFormat中的字符串格式 格式为 参数序号(从 开始) 格式类形(number | date | time | choice) 格式样式 例如 validation beeen=Date must beeen date short and date short
在显示这些国际化字符时 同样有两种方法设置参数的值
    使用标志的value value valueN的属性 如 <s:text name= validation required value = User Name /> 使用param子元素 这些param将按先后顺序 代入到国际化字符串的参数中 例如 <s:text name= validation required >   <s:param value= User Name /></s:text>
>让用户方便地选择语言>

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

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

//img educity cn/img_ / / / gif align=top ffan= done >package tutorial;//img educity cn/img_ / / / gif align=top ffan= done >//img educity cn/img_ / / / gif align=top ffan= done >import java util Hashtable;//img educity cn/img_ / / / gif align=top ffan= done >import java util Locale;//img educity cn/img_ / / / gif align=top ffan= done >import java util Map;//img educity cn/img_ / / / gif align=top ffan= done >_ _ _Open_Image onclick= this style display= none ; Codehighlighter _ _ _Open_Text style display= none ; Codehighlighter _ _ _Closed_Image style display= inline ; Codehighlighter _ _ _Closed_Text style display= inline ; src= //img educity cn/img_ / / / gif align=top ffan= done >_ _ _Closed_Image onclick= this style display= none ; Codehighlighter _ _ _Closed_Text style display= none ; Codehighlighter _ _ _Open_Image style display= inline ; Codehighlighter _ _ _Open_Text style display= inline ; src= //img educity cn/img_ / / / gif align=top ffan= done >publicclass Locales //img educity cn/img_ / / / gif ffan= done >_ _ _Open_Image onclick= this style display= none ; Codehighlighter _ _ _Open_Text style display= none ; Codehighlighter _ _ _Closed_Image style display= inline ; Codehighlighter _ _ _Closed_Text style display= inline ; src= //img educity cn/img_ / / / gif align=top ffan= done >_ _ _Closed_Image onclick= this style display= none ; Codehighlighter _ _ _Closed_Text style display= none ; Codehighlighter _ _ _Open_Image style display= inline ; Codehighlighter _ _ _Open_Text style display= inline ; src= //img educity cn/img_ / / / gif align=top ffan= done >    public Map<String Locale> getLocales() //img educity cn/img_ / / / gif ffan= done >//img educity cn/img_ / / / gif align=top ffan= done >        Map<String Locale> locales =new Hashtable<String Locale>( );//img educity cn/img_ / / / gif align=top ffan= done >        locales put( American English Locale US);//img educity cn/img_ / / / gif align=top ffan= done >        locales put( Simplified Chinese Locale CHINA);//img educity cn/img_ / / / gif align=top ffan= done >        return locales;//img educity cn/img_ / / / gif align=top ffan= done >    //img educity cn/img_ / / / gif align=top ffan= done >tutorial/Locales java <%@taglib prefix= s uri= /struts tags %><script type= text/javascript ><!     function langSelecter_onChanged()         document langForm submit();    // ></script><s:set name= SESSION_LOCALE value= #session[ WW_TRANS_I N_LOCALE ] /><s:bean id= locales name= tutorial Locales /><form action= <s:url includeParams= get encode= true /> name= langForm      >    Language: <s:select label= Language          list= #locales locales listKey= value    listValue= key         value= #SESSION_LOCALE == null ? locale : #SESSION_LOCALE         name= request_locale id= langSelecter          onchange= langSelecter_onChanged() theme= simple /></form>LangSelector jsp

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

你可以把LangSelector jsp作为一个控件使用 方法是在JSP页面中把它包含进来 代码如下所示 <s:include value= /LangSelector jsp />在例 中的HellloWorld jsp中<body>后加入上述代码 并在struts xml中新建Action 代码如下 <action name= HelloWorld >    <result>/HelloWorld jsp</result></action>或者 如果你多个JSP需要实现上述功能 你可以使用下面的通用配置 而不是为每一个JSP页面都新建一个Action <action name= * >    <result>/ jsp</result></action>分布运行程序 在浏览器的地址栏中输入 出现图 所示页面 图 HelloWorld action src= //img educity cn/img_ / / / gif ffan= done >图 HelloWorld action在下拉列表中 选择 American English 出现图 所示页面 图 HelloWorld action src= //img educity cn/img_ / / / gif ffan= done >图 HelloWorld action cha138/Article/program/Java/ky/201311/28805

相关参考

知识大全 Spring i18n的better practice

Springi18n的betterpractice  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!因

知识大全 开源技术 Eclipse使用技巧

开源技术Eclipse使用技巧  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  热键篇  Temp

知识大全 开源技术 Eclipse使用技巧[1]

开源技术Eclipse使用技巧[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Templa

知识大全 开源数据库Sharding技术[2]

开源数据库Sharding技术[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Shardi

知识大全 开源技术 Eclipse使用技巧[2]

开源技术Eclipse使用技巧[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  修改处窗口&

知识大全 开源数据库Sharding技术[1]

开源数据库Sharding技术[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  从Shard

知识大全 开源技术分析:AOP和Spring事务处理

开源技术分析:AOP和Spring事务处理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一为什

知识大全 开源技术之Tomcat数据源配置总结

开源技术之Tomcat数据源配置总结  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  成功配置环境

膜分离技术:开源减排保障水安全

[摘要]针对水资源短缺和严峻的水污染现状,寻找能有效保障水安全的策略是亟待解决的社会发展问题之一。膜分离技术的高效、操作简单等优点使其在水安全保障方面备受关注。本文介绍了我国水安全问题的内涵和现状,对

膜分离技术:开源减排保障水安全

[摘要]针对水资源短缺和严峻的水污染现状,寻找能有效保障水安全的策略是亟待解决的社会发展问题之一。膜分离技术的高效、操作简单等优点使其在水安全保障方面备受关注。本文介绍了我国水安全问题的内涵和现状,对