在Struts 20中国际化i18n您的应用程序.docx
- 文档编号:6140681
- 上传时间:2023-05-09
- 格式:DOCX
- 页数:35
- 大小:138.77KB
在Struts 20中国际化i18n您的应用程序.docx
《在Struts 20中国际化i18n您的应用程序.docx》由会员分享,可在线阅读,更多相关《在Struts 20中国际化i18n您的应用程序.docx(35页珍藏版)》请在冰点文库上搜索。
在Struts20中国际化i18n您的应用程序
在Struts2.0中国际化(i18n)您的应用程序
国际化是商业系统中不可或缺的一部分,所以无论您学习的是什么Web框架,它都是必须掌握的技能。
其实,Struts1.x在此部分已经做得相当不错了。
它极大地简化了我们程序员在做国际化时所需的工作,例如,如果您要输出一条国际化的信息,只需在代码包中加入FILE-NAME_xx_XX.properties(其中FILE-NAME为默认资源文件的文件名),然后在struts-config.xml中指明其路径,再在页面用 message>标志输出即可。 不过,所谓“没有最好,只有更好”。 Struts2.0并没有在这部分止步,而是在原有的简单易用的基础上,将其做得更灵活、更强大。 国际化HelloWorld 下面让我们看一个例子——HelloWorld。 这个例子演示如何根据用户浏览器的设置输出相应的HelloWorld。 1.在Eclipse创建工程配置开发和运行环境(如果对这个步骤有问题,可以参考我早前的文章《为Struts2.0做好准备》)。 2.在src文件夹中加入struts.properties文件,内容如下: struts.custom.i18n.resources=globalMessages Struts2.0有两个配置文件,struts.xml和struts.properties都是放在WEB-INF/classes/下。 ostruts.xml用于应用程序相关的配置 ostruts.properties用于Struts2.0的运行时(Runtime)的配置 3.在src文件夹中加入globalMessages_en_US.properties文件,内容如下: HelloWorld=HelloWorld! 4.在src文件夹中加入globalMessages_zh_CN.properties文件,内容如下: HelloWorld=你好,世界! 在此想和大家分享一个不错的编写properties文件的Eclipse插件(plugin),有了它我们在编辑一些简体中文、繁体中文等Unicode文本时,就不必再使用native2ascii编码了。 您可以通过Eclipse中的软件升级(SoftwareUpdate)安装此插件,步骤如下: 1、展开Eclipse的Help菜单,将鼠标移到SoftwareUpdate子项,在出现的子菜单中点击FindandInstall; 2、在Install/Update对话框中选择Searchfornewfeaturestoinstall,点击Next; 3、在Install对话框中点击NewRemoteSite; 4、在NewUpdateSite对话框的Name填入“PropEdit”或其它任意非空字符串,在URL中填入http: //propedit.sourceforge.jp/eclipse/updates/; 5、在Sitetoincludetosearch列表中,除上一步加入的site外的其它选项去掉,点击Finsih; 6、在弹出的Updates对话框中的Selectthefeaturestoinstall列表中将所有结尾为“3.1.x”的选项去掉(适用于Eclipse3.2版本的朋友); 7、点击Finish关闭对话框; 8、在下载后,同意安装,再按提示重启Eclipse,在工具条看到形似vi的按钮表示安装成功,插件可用。 此时,Eclpise中所有properties文件的文件名前有绿色的P的图标作为标识。 5.在WebContent文件夹下加入HelloWorl.jsp文件,内容如下: <%@page contentType="text/html;charset=UTF-8"%> <%@taglibprefix="s"uri="/struts-tags"%>
textname="HelloWorld"/>
textname="HelloWorld"/>
propertyvalue="%{getText('HelloWorld')}"/>
propertyvalue="%{getText('HelloWorld')}"/>
6.发布运行应用程序,在浏览器地址栏中输入http:
//localhost:
8080/Struts2_i18n/HelloWorld.jsp,出现图1所示页面。
图1中文输出
7.将浏览器的默认语言改为“英语(美国)”,刷新页面,出现图2所示页面。
图2英文输出
上面的例子的做法,与Struts1.x的做法相似,似乎并不能体现Struts2.0的优势。
不过,我在上面的例子用了两种方法来显示国际化字符串,其输出是相同的。
其实,这就是Struts2.0的一个优势,因为它默认支持EL,所示我们可以用getText方法来简洁地取得国际化字符串。
另外更普遍的情况——在使用UI表单标志时,getText可以用来设置label属性,例如:
textfieldname="name"label="%{getText('UserName')}"/> 资源文件查找顺序 之所以说Struts2.0的国际化更灵活是因为它可以能根据不同需要配置和获取资源(properties)文件。 在Struts2.0中有下面几种方法: 1.使用全局的资源文件,方法如上例所示。 这适用于遍布于整个应用程序的国际化字符串,它们在不同的包(package)中被引用,如一些比较共用的出错提示; 2.使用包范围内的资源文件。 做法是在包的根目录下新建名的package.properties和package_xx_XX.properties文件。 这就适用于在包中不同类访问的资源; 3.使用Action范围的资源文件。 做法为Action的包下新建文件名(除文件扩展名外)与Action类名同样的资源文件。 它只能在该Action中访问。 如此一来,我们就可以在不同的Action里使用相同的properties名表示不同的值。 例如,在ActonOne中title为“动作一”,而同样用title在ActionTwo表示“动作二”,节省一些命名工夫; 4.使用 i18n>标志访问特定路径的properties文件。 使用方法请参考我早前的文章《常用的Struts2.0的标志(Tag)介绍》。 在您使用这一方法时,请注意 i18n>标志的范围。 在 i18nname="xxxxx">到 i18n>之间,所有的国际化字符串都会在名为xxxxx资源文件查找,如果找不到,Struts2.0就会输出默认值(国际化字符串的名字)。 上面我列举了四种配置和访问资源的方法,它们的范围分别是从大到小,而Struts2.0在查找国际化字符串所遵循的是特定的顺序,如图3所示: 图3资源文件查找顺序图 假设我们在某个ChildAction中调用了getText("user.title"),Struts2.0的将会执行以下的操作: 1.查找ChildAction_xx_XX.properties文件或ChildAction.properties; 2.查找ChildAction实现的接口,查找与接口同名的资源文件MyInterface.properties; 3.查找ChildAction的父类ParentAction的properties文件,文件名为ParentAction.properties; 4.判断当前ChildAction是否实现接口ModelDriven。 如果是,调用getModel()获得对象,查找与其同名的资源文件; 5.查找当前包下的package.properties文件; 6.查找当前包的父包,直到最顶层包; 7.在值栈(ValueStack)中,查找名为user的属性,转到user类型同名的资源文件,查找键为title的资源; 8.查找在struts.properties配置的默认的资源文件,参考例1; 9.输出user.title。 参数化国际化字符串 许多情况下,我们都需要在动行时(runtime)为国际化字符插入一些参数,例如在输入验证提示信息的时候。 在Struts2.0中,我们通过以下两种方法做到这点: 1.在资源文件的国际化字符串中使用OGNL,格式为${表达式},例如: validation.require=${getText(fileName)}isrequired 2.使用java.text.MessageFormat中的字符串格式,格式为{参数序号(从0开始),格式类形(number|date|time|choice),格式样式},例如: validation.between=Datemustbetween{0,date,short}and{1,date,short} 在显示这些国际化字符时,同样有两种方法设置参数的值: 1.使用标志的value0、value1...valueN的属性,如: textname="validation.required"value0="UserName"/> 2.使用param子元素,这些param将按先后顺序,代入到国际化字符串的参数中,例如: textname="validation.required"> paramvalue="UserName"/> text> 让用户方便地选择语言 开发国际化的应用程序时,有一个功能是必不可少的——让用户快捷地选择或切换语言。 在Struts2.0中,通过ActionContext.getContext().setLocale(Localearg)可以设置用户的默认语言。 不过,由于这是一个比较普遍的应用场景(Scenario),所以Struts2.0为您提供了一个名i18n的拦截器(Interceptor),并在默认情况下将其注册到拦截器链(Interceptorchain)中。 它的原理为在执行Action方法前,i18n拦截器查找请求中的一个名为"request_locale"的参数。 如果其存在,拦截器就将其作为参数实例化Locale对象,并将其设为用户默认的区域(Locale),最后,将此Locale对象保存在session的名为“WW_TRANS_I18N_LOCALE”的属性中。 下面,我将提供一完整示例演示它的使用方法。 packagetutorial; importjava.util.Hashtable; importjava.util.Locale; importjava.util.Map; publicclassLocales { publicMap { Map (2); locales.put("AmericanEnglish",Locale.US); locales.put("SimplifiedChinese",Locale.CHINA); returnlocales; } } tutorial/Locales.java <%@taglibprefix="s"uri="/struts-tags"%> -- functionlangSelecter_onChanged(){ document.langForm.submit(); } //--> setname="SESSION_LOCALE"value="#session['WW_TRANS_I18N_LOCALE']"/> beanid="locales"name="tutorial.Locales"/> urlincludeParams="get"encode="true"/>"name="langForm" style="background-color: powderblue;padding-top: 4px;padding-bottom: 4px;"> Language: selectlabel="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"/> LangSelector.jsp 上述代码的原理为,LangSelector.jsp先实例化一个Locales对象,并把对象的Map类型的属性locales赋予下拉列表(select)。 如此一来,下拉列表就获得可用语言的列表。 大家看到LangSelector有 form>标志和一段Javascript脚本,它们的作用就是在用户在下拉列表中选择了后,提交包含“reqeust_locale”变量的表单到Action。 在打开页面时,为了下拉列表的选中的当前区域,我们需要到session取得当前区域(键为“WW_TRANS_I18N_LOCALE”的属性),而该属性在没有设置语言前是为空的,所以通过值栈中locale属性来取得当前区域(用户浏览器所设置的语言)。 你可以把LangSelector.jsp作为一个控件使用,方法是在JSP页面中把它包含进来,代码如下所示: includevalue="/LangSelector.jsp"/> 在例1中的HellloWorld.jsp中 或者,如果你多个JSP需要实现上述功能,你可以使用下面的通用配置,而不是为每一个JSP页面都新建一个Action。 分布运行程序,在浏览器的地址栏中输入http: //localhost: 8080/Struts2_i18n/HelloWorld.action,出现图4所示页面: 图3HelloWorld.action 在下拉列表中,选择“AmericanEnglish”,出现图5所示页面: 图4HelloWorld.action 可能大家会问为什么一定要通过Action来访问页面呢? 你可以试一下不用Action而直接用JSP的地址来访问页面,结果会是无论你在下拉列表中选择什么,语言都不会改变。 这表示不能正常运行的。 其原因为如果直接使用JSP访问页面,Struts2.0在web.xml的配置的过滤器(Filter)就不会工作,所以拦截器链也不会工作。 postedon2006-11-0119: 06Max阅读(17261)评论(86) 编辑 收藏所属分类: Struts2.0系列 评论: # re: 在Struts2.0中国际化(i18n)您的应用程序2006-11-0208: 27|坏男孩 踩个脚印 回复 更多评论 # re: 在Struts2.0中国际化(i18n)您的应用程序2006-11-0211: 22|Java菜鸟[匿名] 十分感谢你的关于Struts2的一系列文章,最近我正在学习Struts2,由于时间紧,资料少,所以很感谢你的文章! 请问你的文章来源是哪里,能不能共享一下,因为我的项目赶时间,另外请问你关于Struts2与Webwork2有什么区别和进步,有没有这方面的文章,多谢指教! 回复 更多评论 # re: 在Struts2.0中国际化(i18n)您的应用程序2006-11-0211: 57|张先生 谢谢楼上指点! 能否介绍Struts2的标签校验? 谢谢! 回复 更多评论 # re: 在Struts2.0中国际化(i18n)您的应用程序2006-11-0214: 22|Max @张先生 我的下一篇文章将会介绍一下Struts2.0中的Converter,再一篇会介绍校验部分。 感谢大家的支持,我会再加把劲加快文章的更新速度。 回复 更多评论 # re: 在Struts2.0中国际化(i18n)您的应用程序2006-11-0214: 23|Max @Java菜鸟[匿名] 我已经给您回了邮件。 回复 更多评论 # re: 在Struts2.0中国际化(i18n)您的应用程序2006-11-0214: 43|Java菜鸟[匿名] 多谢指点,谢谢! @Max 回复 更多评论 # re: 在Struts2.0中国际化(i18n)您的应用程序2006-11-0321: 23|一滴水 谢谢了,收藏 回复 更多评论 # re: 在Struts2.0中国际化(i18n)您的应用程序2006-11-0410: 05|Frank[匿名] 我通过SoftwareUpdate安装插件propedit,Eclipse提示网络连接有问题,Eclipse的网络连接在哪里配置? 盼高手指教. 回复 更多评论 # re: 在Struts2.0中国际化(i18n)您的应用程序2006-11-0616: 48|Max @Frank[匿名] 你好,可能是由于您的网络不稳定或防火墙的问题。 解决方法: 1、检查网络是否连通; 2、暂时关闭防火墙。 回复 更多评论 # re: 在Struts2.0中国际化(i18n)您的应用程序2006-11-0715: 03|Frank[匿名] 谢谢Max的回复.我试过关闭防火墙了,而且网络连接没有问题,但问题依旧.错误提示如下: 在搜索期间遇到了网络连接问题。 无法访问“http: //propedit.sourceforge.jp/eclipse/updates/">http: //propedit.sourceforge.jp/eclipse/updates/">http: //propedit.sourceforge.jp/eclipse/updates/">http: //propedit.sourceforge.jp/eclipse/updates/”。 无法访问站点: “http: //propedit.sourceforge.jp/eclipse/updates/">http: //propedit.sourceforge.jp/eclipse/updates/">http: //propedit.sourceforge.jp/eclipse/updates/">http: //propedit.sourceforge.jp/eclipse/updates/”[java.io.IOException] 无法访问站点: “http: //propedit.sourceforge.jp/eclipse/updates/">http: //propedit.sourceforge.jp/eclipse/updates/">http: //propedit.sourceforge.jp/eclipse/updates/">http: //propedit.sourceforge.jp/eclipse/updates/”[java.io.IOException] 回复 更多评论 # re: 在Struts2.0中国际化(i18n)您的应用程序2006-11-0809: 42|Max @Frank[匿名] 请问您用的是什么网络? 教育网或ADSL? 回复 更多评论 # re: 在Struts2.0中国际化(i18n)您的应用程序2006-11-0908: 42|Frank[匿名] 通过代理服务器,电信的出口 回复 更多评论 # re: 在Struts2.0中国际化(i18n)您的应用程序2006-11-1011: 33|Frank[匿名] 网速太慢,MAX可否发我一个WEBTOOLS插件? 谢谢先。 mailto: yfrank2003@ 回复 更多评论 # re: 在Struts2.0中国际化(i18n)您的应用程序2006-11-1611: 26|Frank[匿名] propedit插件可以更新,是MyEclipse须设代理。 : ) 回复 更多评论 # re: 在Struts2.0中国际化(i18n)您的应用程序2006-11-1623: 04|Max @Frank[匿名] Goodforyou 回复 更多评论 # re: 在Struts2.0中国际化(i18n)您的应用程序2006-11-2817: 04|tongor 顶你个肺^^ 向你学习! ! ! 回复 更多评论 # re: 在Struts2.0中国际化(i18n)您的应用程序2006-12-0916: 47|konhon优华 建議簡單解釋下原理. 如: urlincludeParams="get"encode="true"/> request_locale參數是怎麼樣加進來的. 回复 更多评论 # re: 在Struts2.0中国际化(i18n)您的应用程序2007-03-1113: 41|praguesky 谢谢MAX的文章...我现在也慢慢开始从struts1向2转型了.你的文章比较基础.不过让我转型的步伐大大加快..真的很感谢 回复 更多评论 # re: 在Struts2.0中国际化(i18n)您的应用程序[未登录]2007-03-1511: 29|hunter 學習中﹗﹗ 回复 更多评论 # re: 在Struts2.0中国际化(i18n)您的应用程序2007-03-1615: 19|film 頂你個肺 回复 更多评论 # re: 在Struts
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 在Struts 20中国际化i18n您的应用程序 Struts 20 国际化 i18n 应用程序