- 浏览: 415171 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
skying007:
...
Mysql coalesce() 函数认识和用法 -
kchiu:
关于这个心跳的发送和接收 晚上全是the fuccking s ...
socket心跳检测 -
bjsq618:
你的想法在大的物流公司已经实现了,只不过他们使用是GPS定位
ddd -
jiaguwen123:
2,AuthenticationHandler类的写法
pa ...
xfire客户端 -
sornor:
总结的不错哟!
Java中的函数yield(),sleep()和wait()的区别
原文地址(可查看图片):http://axuxinggang.blog.163.com/blog/static/31417448200910483136822/
一,在Eclipse创建工程配置开发和运行环境
要想读取资源文件必须要下载一个插件,这个插件的名字叫做:plugin,大家不用担心是可以通过Eclipse自己升级和下载的一个插件,所以不需要从网上下载.下面我把怎么配置这个插件的步骤告诉大家.
1、展开Eclipse的Help菜单,将鼠标移到Software Update子项,在出现的子菜单中点击Find and Install;
2、在Install/Update对话框中选择Search for new features to install,点击Next;
3、在Install对话框中点击New Remote Site;
4、在New Update Site对话框的Name填入“PropEdit”或其它任意非空字符串,在URL中填入http://propedit.sourceforge.jp/eclipse/updates/;
5、在Site to include to search列表中,除上一步加入的site外的其它选项去掉,点击Finsih;
6、在弹出的Updates对话框中的Select the features to install列表中将所有结尾为“3.1.x”的选项去掉(适用于Eclipse 3.2版本的朋友);
7、点击Finish关闭对话框;
8、在下载后,同意安装,再按提示重启Eclipse,在工具条看到形似vi的按钮表示安装成功,插件可用。此时,Eclpise中所有properties文件的文件名前有绿色的P的图标作为标识。
二,开始配置资源文件:
相信通过步骤一之后,你的Eclipse已经能够使用扩展名为.properties的资源文件了,那怎么使用资源文件呢.
1.新建一个为名为struts.properties的资源文件,那么这个时候就出现了分类:
(1),如果向其中写入struts.custom.i18n.resources=globalMessages,那么同样建立在src目录下的globalMessages.properties或者globalMessages_zh_CN.properties,就成为全局资源文件,一般来说,全局文件一般放在src文件夹下。
(2)相反的来说,如果向struts.properties中写入struts.custom.i18n.resources=com.sanss.globalMessages的话,说明说明资源文件globalMessages位于com.sansspackage下面,又可定义RingManage.properties放到与class相同的目录。还可以将资源文件命名成package.properties,这样就可以写入到具体的包下面.
2.读取资源文件
假如说刚刚我们像struts2.0中写如的是全局的资源文件,那么现在我们建立一个名为:globalMessages_zh_CN.properties的资源文件,文件中可以直接写如建和值的对等关系,如:
invalid.ringName=请输入铃音名
text.createRing=创建铃音
format.date=格式化日期
都是可以的.
3,根据不同的需要在不同的地方读取资源文件的方式:
(1)在JSP界面上读取:
在界面上读取是比较简单的,我们有三种方式可以读取:
<1>使用2.0标签 //name="建的名字"
<2>2. getText方式
<h2><s:property value="%{getText('text.createRing')}"/></< SPAN>h2>在JSP上面可以直接读到
<s:property value="getText('text.createRing')"/>
<3>3.被validator的配置文件引用key。例如在RingManage-validation.xml中的
<message key="invalid.ringName"></< SPAN>message>
如果在name中以%{...}包裹一个名字,则会先在value-stack中进行ongl转换,然后再去资源文件中获取文本。
(2) 在普通的JAVA类和Action中读取资源文件:
<1>让你的JAVA类或者是ACTION继承ActionSupport,通过里面的getText("建名")来取值,可能有一些朋友这么做了,可是偏骗就是从全局资源文件中取不到值,一开始我也是这样,后来找到了解决的办法,我想可能是在2.0中普通的java类和ACTION根本就没有办法读取到全局的资源文件中的值.后来我看到了下面的那些话后决定使用局部的资源文件.
假设我们在某个ChildAction中调用了getText("user.title"),Struts 2.0的将会执行以下的操作:
查找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配置的默认的资源文件,参考例1;
输出user.title。
所以后来我看到这些之后明白,当在一个JAVA类或者是ACTION里面使用getText的时候它会首先去找到与ACTION或者是与JAVA类同名的资源文件,所以我在同一包下面建立了相同名称的资源文件.后来经过getText的测试通过了.截止到现在,struts2.0的资源文件的读取,终于成功了.
回头想想可真不容易啊,从8点开始琢磨,一直琢磨到下一点多,真是得来不易,从这次的事件中,我明白了,人一定要有耐心,和恒心还有坚定不移的决心,只有这样,我们才能在IT界中打出一块属于我们自己的领地.太晚了,明天还有正课.得赶紧睡觉了,明天是hibernate框架.
参考================================================================================================
在Struts 2.0中国际化您的应用程
来自:
http://www.blogjava.net/max/archive/2006/11/01/78536.html
国际化是商业系统中不可或缺的一部分,所以无论您学习的是什么Web框架,它都是必须掌握的技能。
其实,Struts 1.x在此部分已经做得相当不错了。它极大地简化了我们程序员在做国际化时所需的工作,例如,如果您要输出一条国际化的信息,只需在代码包中加入FILE-NAME_xx_XX.properties(其中FILE-NAME为默认资源文件的文件名),然后在struts-config.xml中指明其路径,再在页面用<bean:message>标志输出即可。
不过,所谓“没有最好,只有更好”。Struts 2.0并没有在这部分止步,而是在原有的简单易用的基础上,将其做得更灵活、更强大。
国际化Hello World
下面让我们看一个例子——HelloWorld。这个例子演示如何根据用户浏览器的设置输出相应的HelloWorld。
在Eclipse创建工程配置开发和运行环境(如果对这个步骤有问题,可以参考我早前的文章《为Struts 2.0做好准备》)。
在src文件夹中加入struts.properties文件,内容如下:
struts.custom.i18n.resources=globalMessages
Struts 2.0有两个配置文件,struts.xml和struts.properties都是放在WEB-INF/classes/下。
struts.xml用于应用程序相关的配置
struts.properties用于Struts 2.0的运行时(Runtime)的配置
在src文件夹中加入globalMessages_en_US.properties文件,内容如下:
HelloWorld=Hello World!
在src文件夹中加入globalMessages_zh_CN.properties文件,内容如下:
HelloWorld=你好,世界! 在此想和大家分享一个不错的编写properties文件的Eclipse插件(plugin),有了它我们在编辑一些简体中文、繁体中文等Unicode文本时,就不必再使用native2ascii编码了。您可以通过Eclipse中的软件升级(Software Update)安装此插件,步骤如下:
1、展开Eclipse的Help菜单,将鼠标移到Software Update子项,在出现的子菜单中点击Find and Install;
2、在Install/Update对话框中选择Search for new features to install,点击Next;
3、在Install对话框中点击New Remote Site;
4、在New Update Site对话框的Name填入“PropEdit”或其它任意非空字符串,在URL中填入http://propedit.sourceforge.jp/eclipse/updates/;
5、在Site to include to search列表中,除上一步加入的site外的其它选项去掉,点击Finsih;
6、在弹出的Updates对话框中的Select the features to install列表中将所有结尾为“3.1.x”的选项去掉(适用于Eclipse 3.2版本的朋友);
7、点击Finish关闭对话框;
8、在下载后,同意安装,再按提示重启Eclipse,在工具条看到形似vi的按钮表示安装成功,插件可用。此时,Eclpise中所有properties文件的文件名前有绿色的P的图标作为标识。
在WebContent文件夹下加入HelloWorl.jsp文件,内容如下:
<%@ page contentType="text/html; charset=UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h2><s:text name="HelloWorld"/></h2>
<h2><s:property value="% { getText('HelloWorld')}"/></h2>
</body>
</html>
发布运行应用程序,在浏览器地址栏中输入http://localhost:8080/Struts2_i18n/HelloWorld.jsp ,出现图1所示页面。
图1 中文输出
将浏览器的默认语言改为“英语(美国)”,刷新页面,出现图2所示页面。
图2 英文输出
上面的例子的做法,与Struts 1.x的做法相似,似乎并不能体现Struts 2.0的优势。不过,我在上面的例子用了两种方法来显示国际化字符串,其输出是相同的。其实,这就是Struts 2.0的一个优势,因为它默认支持EL,所示我们可以用getText方法来简洁地取得国际化字符串。另外更普遍的情况——在使用UI表单标志时,getText可以用来设置label属性,例如:
<s:textfield name="name" label="% { getText('UserName')}"/>
资源文件查找顺序
之所以说Struts 2.0的国际化更灵活是因为它可以能根据不同需要配置和获取资源(properties)文件。在Struts 2.0中有下面几种方法:
使用全局的资源文件,方法如上例所示。这适用于遍布于整个应用程序的国际化字符串,它们在不同的包(package)中被引用,如一些比较共用的出错提示;
使用包范围内的资源文件。做法是在包的根目录下新建名的package.properties和package_xx_XX.properties文件。这就适用于在包中不同类访问的资源;
使用Action范围的资源文件。做法为Action的包下新建文件名(除文件扩展名外)与Action类名同样的资源文件。它只能在该Action中访问。如此一来,我们就可以在不同的Action里使用相同的properties名表示不同的值。例如,在ActonOne中title为“动作一”,而同样用title在ActionTwo表示“动作二”,节省一些命名工夫;
使用<s:i18n>标志访问特定路径的properties文件。使用方法请参考我早前的文章《常用的Struts 2.0的标志(Tag)介绍》。在您使用这一方法时,请注意<s:i18n>标志的范围。在<s:i18n name="xxxxx">到</s:i18n>之间,所有的国际化字符串都会在名为xxxxx资源文件查找,如果找不到,Struts 2.0就会输出默认值(国际化字符串的名字)。
上面我列举了四种配置和访问资源的方法,它们的范围分别是从大到小,而Struts 2.0在查找国际化字符串所遵循的是特定的顺序,如图3所示:
图3 资源文件查找顺序图
假设我们在某个ChildAction中调用了getText("user.title"),Struts 2.0的将会执行以下的操作:
查找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配置的默认的资源文件,参考例1;
输出user.title。
参数化国际化字符串
许多情况下,我们都需要在动行时(runtime)为国际化字符插入一些参数,例如在输入验证提示信息的时候。在Struts 2.0中,我们通过以下两种方法做到这点:
在资源文件的国际化字符串中使用OGNL,格式为,例如:
validation.require=$ {getText(fileName)} is required
使用java.text.MessageFormat中的字符串格式,格式为{ 参数序号(从0开始), 格式类形(number | date | time | choice), 格式样式},例如:
validation.between=Date must between {0, date, short} and {1, date, short}
在显示这些国际化字符时,同样有两种方法设置参数的值:
使用标志的value0、value1...valueN的属性,如:
<s:text name="validation.required" value0="User Name"/>
使用param子元素,这些param将按先后顺序,代入到国际化字符串的参数中,例如:
<s:text name="validation.required">
<s:param value="User Name"/>
</s:text>
让用户方便地选择语言
开发国际化的应用程序时,有一个功能是必不可少的——让用户快捷地选择或切换语言。在Struts 2.0中,通过ActionContext.getContext().setLocale(Locale arg)可以设置用户的默认语言。不过,由于这是一个比较普遍的应用场景(Scenario),所以Struts 2.0为您提供了一个名i18n的拦截器(Interceptor),并在默认情况下将其注册到拦截器链(Interceptor chain)中。它的原理为在执行Action方法前,i18n拦截器查找请求中的一个名为"request_locale"的参数。如果其存在,拦截器就将其作为参数实例化Locale对象,并将其设为用户默认的区域(Locale),最后,将此Locale对象保存在session的名为“WW_TRANS_I18N_LOCALE”的属性中。
下面,我将提供一完整示例演示它的使用方法。
package tutorial;
import java.util.Hashtable;
import java.util.Locale;
import java.util.Map;
publicclass Locales {
public Map<String, Locale> getLocales() {
Map<String, Locale> locales =new Hashtable<String, Locale>(2);
locales.put("American English", Locale.US);
locales.put("Simplified Chinese", Locale.CHINA);
return locales;
}
}
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_I18N_LOCALE']"/>
<s:bean id="locales" name="tutorial.Locales"/>
<form action="<s:url includeParams="get" encode="true"/>" name="langForm"
style="background-color: powderblue; padding-top: 4px; padding-bottom: 4px;">
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_I18N_LOCALE”的属性),而该属性在没有设置语言前是为空的,所以通过值栈中locale属性来取得当前区域(用户浏览器所设置的语言)。
你可以把LangSelector.jsp作为一个控件使用,方法是在JSP页面中把它包含进来,代码如下所示:
<s:include value="/LangSelector.jsp"/>
在例1中的HellloWorld.jsp中<body>后加入上述代码,并在struts.xml中新建Action,代码如下:
<action name="HelloWorld">
<result>/HelloWorld.jsp</result>
</action>
或者,如果你多个JSP需要实现上述功能,你可以使用下面的通用配置,而不是为每一个JSP页面都新建一个Action。
<action name="*">
<result>/{1}.jsp</result>
</action>
分布运行程序,在浏览器的地址栏中输入http://localhost:8080/Struts2_i18n/HelloWorld.action,出现图4所示页面:
图3 HelloWorld.action
在下拉列表中,选择“American English”,出现图5所示页面:
图4 HelloWorld.action
可能大家会问为什么一定要通过Action来访问页面呢?
你可以试一下不用Action而直接用JSP的地址来访问页面,结果会是无论你在下拉列表中选择什么,语言都不会改变。这表示不能正常运行的。其原因为如果直接使用JSP访问页面,Struts 2.0在web.xml的配置的过滤器(Filter)就不会工作,所以拦截器链也不会工作。
一,在Eclipse创建工程配置开发和运行环境
要想读取资源文件必须要下载一个插件,这个插件的名字叫做:plugin,大家不用担心是可以通过Eclipse自己升级和下载的一个插件,所以不需要从网上下载.下面我把怎么配置这个插件的步骤告诉大家.
1、展开Eclipse的Help菜单,将鼠标移到Software Update子项,在出现的子菜单中点击Find and Install;
2、在Install/Update对话框中选择Search for new features to install,点击Next;
3、在Install对话框中点击New Remote Site;
4、在New Update Site对话框的Name填入“PropEdit”或其它任意非空字符串,在URL中填入http://propedit.sourceforge.jp/eclipse/updates/;
5、在Site to include to search列表中,除上一步加入的site外的其它选项去掉,点击Finsih;
6、在弹出的Updates对话框中的Select the features to install列表中将所有结尾为“3.1.x”的选项去掉(适用于Eclipse 3.2版本的朋友);
7、点击Finish关闭对话框;
8、在下载后,同意安装,再按提示重启Eclipse,在工具条看到形似vi的按钮表示安装成功,插件可用。此时,Eclpise中所有properties文件的文件名前有绿色的P的图标作为标识。
二,开始配置资源文件:
相信通过步骤一之后,你的Eclipse已经能够使用扩展名为.properties的资源文件了,那怎么使用资源文件呢.
1.新建一个为名为struts.properties的资源文件,那么这个时候就出现了分类:
(1),如果向其中写入struts.custom.i18n.resources=globalMessages,那么同样建立在src目录下的globalMessages.properties或者globalMessages_zh_CN.properties,就成为全局资源文件,一般来说,全局文件一般放在src文件夹下。
(2)相反的来说,如果向struts.properties中写入struts.custom.i18n.resources=com.sanss.globalMessages的话,说明说明资源文件globalMessages位于com.sansspackage下面,又可定义RingManage.properties放到与class相同的目录。还可以将资源文件命名成package.properties,这样就可以写入到具体的包下面.
2.读取资源文件
假如说刚刚我们像struts2.0中写如的是全局的资源文件,那么现在我们建立一个名为:globalMessages_zh_CN.properties的资源文件,文件中可以直接写如建和值的对等关系,如:
invalid.ringName=请输入铃音名
text.createRing=创建铃音
format.date=格式化日期
都是可以的.
3,根据不同的需要在不同的地方读取资源文件的方式:
(1)在JSP界面上读取:
在界面上读取是比较简单的,我们有三种方式可以读取:
<1>使用2.0标签 //name="建的名字"
<2>2. getText方式
<h2><s:property value="%{getText('text.createRing')}"/></< SPAN>h2>在JSP上面可以直接读到
<s:property value="getText('text.createRing')"/>
<3>3.被validator的配置文件引用key。例如在RingManage-validation.xml中的
<message key="invalid.ringName"></< SPAN>message>
如果在name中以%{...}包裹一个名字,则会先在value-stack中进行ongl转换,然后再去资源文件中获取文本。
(2) 在普通的JAVA类和Action中读取资源文件:
<1>让你的JAVA类或者是ACTION继承ActionSupport,通过里面的getText("建名")来取值,可能有一些朋友这么做了,可是偏骗就是从全局资源文件中取不到值,一开始我也是这样,后来找到了解决的办法,我想可能是在2.0中普通的java类和ACTION根本就没有办法读取到全局的资源文件中的值.后来我看到了下面的那些话后决定使用局部的资源文件.
假设我们在某个ChildAction中调用了getText("user.title"),Struts 2.0的将会执行以下的操作:
查找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配置的默认的资源文件,参考例1;
输出user.title。
所以后来我看到这些之后明白,当在一个JAVA类或者是ACTION里面使用getText的时候它会首先去找到与ACTION或者是与JAVA类同名的资源文件,所以我在同一包下面建立了相同名称的资源文件.后来经过getText的测试通过了.截止到现在,struts2.0的资源文件的读取,终于成功了.
回头想想可真不容易啊,从8点开始琢磨,一直琢磨到下一点多,真是得来不易,从这次的事件中,我明白了,人一定要有耐心,和恒心还有坚定不移的决心,只有这样,我们才能在IT界中打出一块属于我们自己的领地.太晚了,明天还有正课.得赶紧睡觉了,明天是hibernate框架.
参考================================================================================================
在Struts 2.0中国际化您的应用程
来自:
http://www.blogjava.net/max/archive/2006/11/01/78536.html
国际化是商业系统中不可或缺的一部分,所以无论您学习的是什么Web框架,它都是必须掌握的技能。
其实,Struts 1.x在此部分已经做得相当不错了。它极大地简化了我们程序员在做国际化时所需的工作,例如,如果您要输出一条国际化的信息,只需在代码包中加入FILE-NAME_xx_XX.properties(其中FILE-NAME为默认资源文件的文件名),然后在struts-config.xml中指明其路径,再在页面用<bean:message>标志输出即可。
不过,所谓“没有最好,只有更好”。Struts 2.0并没有在这部分止步,而是在原有的简单易用的基础上,将其做得更灵活、更强大。
国际化Hello World
下面让我们看一个例子——HelloWorld。这个例子演示如何根据用户浏览器的设置输出相应的HelloWorld。
在Eclipse创建工程配置开发和运行环境(如果对这个步骤有问题,可以参考我早前的文章《为Struts 2.0做好准备》)。
在src文件夹中加入struts.properties文件,内容如下:
struts.custom.i18n.resources=globalMessages
Struts 2.0有两个配置文件,struts.xml和struts.properties都是放在WEB-INF/classes/下。
struts.xml用于应用程序相关的配置
struts.properties用于Struts 2.0的运行时(Runtime)的配置
在src文件夹中加入globalMessages_en_US.properties文件,内容如下:
HelloWorld=Hello World!
在src文件夹中加入globalMessages_zh_CN.properties文件,内容如下:
HelloWorld=你好,世界! 在此想和大家分享一个不错的编写properties文件的Eclipse插件(plugin),有了它我们在编辑一些简体中文、繁体中文等Unicode文本时,就不必再使用native2ascii编码了。您可以通过Eclipse中的软件升级(Software Update)安装此插件,步骤如下:
1、展开Eclipse的Help菜单,将鼠标移到Software Update子项,在出现的子菜单中点击Find and Install;
2、在Install/Update对话框中选择Search for new features to install,点击Next;
3、在Install对话框中点击New Remote Site;
4、在New Update Site对话框的Name填入“PropEdit”或其它任意非空字符串,在URL中填入http://propedit.sourceforge.jp/eclipse/updates/;
5、在Site to include to search列表中,除上一步加入的site外的其它选项去掉,点击Finsih;
6、在弹出的Updates对话框中的Select the features to install列表中将所有结尾为“3.1.x”的选项去掉(适用于Eclipse 3.2版本的朋友);
7、点击Finish关闭对话框;
8、在下载后,同意安装,再按提示重启Eclipse,在工具条看到形似vi的按钮表示安装成功,插件可用。此时,Eclpise中所有properties文件的文件名前有绿色的P的图标作为标识。
在WebContent文件夹下加入HelloWorl.jsp文件,内容如下:
<%@ page contentType="text/html; charset=UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h2><s:text name="HelloWorld"/></h2>
<h2><s:property value="% { getText('HelloWorld')}"/></h2>
</body>
</html>
发布运行应用程序,在浏览器地址栏中输入http://localhost:8080/Struts2_i18n/HelloWorld.jsp ,出现图1所示页面。
图1 中文输出
将浏览器的默认语言改为“英语(美国)”,刷新页面,出现图2所示页面。
图2 英文输出
上面的例子的做法,与Struts 1.x的做法相似,似乎并不能体现Struts 2.0的优势。不过,我在上面的例子用了两种方法来显示国际化字符串,其输出是相同的。其实,这就是Struts 2.0的一个优势,因为它默认支持EL,所示我们可以用getText方法来简洁地取得国际化字符串。另外更普遍的情况——在使用UI表单标志时,getText可以用来设置label属性,例如:
<s:textfield name="name" label="% { getText('UserName')}"/>
资源文件查找顺序
之所以说Struts 2.0的国际化更灵活是因为它可以能根据不同需要配置和获取资源(properties)文件。在Struts 2.0中有下面几种方法:
使用全局的资源文件,方法如上例所示。这适用于遍布于整个应用程序的国际化字符串,它们在不同的包(package)中被引用,如一些比较共用的出错提示;
使用包范围内的资源文件。做法是在包的根目录下新建名的package.properties和package_xx_XX.properties文件。这就适用于在包中不同类访问的资源;
使用Action范围的资源文件。做法为Action的包下新建文件名(除文件扩展名外)与Action类名同样的资源文件。它只能在该Action中访问。如此一来,我们就可以在不同的Action里使用相同的properties名表示不同的值。例如,在ActonOne中title为“动作一”,而同样用title在ActionTwo表示“动作二”,节省一些命名工夫;
使用<s:i18n>标志访问特定路径的properties文件。使用方法请参考我早前的文章《常用的Struts 2.0的标志(Tag)介绍》。在您使用这一方法时,请注意<s:i18n>标志的范围。在<s:i18n name="xxxxx">到</s:i18n>之间,所有的国际化字符串都会在名为xxxxx资源文件查找,如果找不到,Struts 2.0就会输出默认值(国际化字符串的名字)。
上面我列举了四种配置和访问资源的方法,它们的范围分别是从大到小,而Struts 2.0在查找国际化字符串所遵循的是特定的顺序,如图3所示:
图3 资源文件查找顺序图
假设我们在某个ChildAction中调用了getText("user.title"),Struts 2.0的将会执行以下的操作:
查找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配置的默认的资源文件,参考例1;
输出user.title。
参数化国际化字符串
许多情况下,我们都需要在动行时(runtime)为国际化字符插入一些参数,例如在输入验证提示信息的时候。在Struts 2.0中,我们通过以下两种方法做到这点:
在资源文件的国际化字符串中使用OGNL,格式为,例如:
validation.require=$ {getText(fileName)} is required
使用java.text.MessageFormat中的字符串格式,格式为{ 参数序号(从0开始), 格式类形(number | date | time | choice), 格式样式},例如:
validation.between=Date must between {0, date, short} and {1, date, short}
在显示这些国际化字符时,同样有两种方法设置参数的值:
使用标志的value0、value1...valueN的属性,如:
<s:text name="validation.required" value0="User Name"/>
使用param子元素,这些param将按先后顺序,代入到国际化字符串的参数中,例如:
<s:text name="validation.required">
<s:param value="User Name"/>
</s:text>
让用户方便地选择语言
开发国际化的应用程序时,有一个功能是必不可少的——让用户快捷地选择或切换语言。在Struts 2.0中,通过ActionContext.getContext().setLocale(Locale arg)可以设置用户的默认语言。不过,由于这是一个比较普遍的应用场景(Scenario),所以Struts 2.0为您提供了一个名i18n的拦截器(Interceptor),并在默认情况下将其注册到拦截器链(Interceptor chain)中。它的原理为在执行Action方法前,i18n拦截器查找请求中的一个名为"request_locale"的参数。如果其存在,拦截器就将其作为参数实例化Locale对象,并将其设为用户默认的区域(Locale),最后,将此Locale对象保存在session的名为“WW_TRANS_I18N_LOCALE”的属性中。
下面,我将提供一完整示例演示它的使用方法。
package tutorial;
import java.util.Hashtable;
import java.util.Locale;
import java.util.Map;
publicclass Locales {
public Map<String, Locale> getLocales() {
Map<String, Locale> locales =new Hashtable<String, Locale>(2);
locales.put("American English", Locale.US);
locales.put("Simplified Chinese", Locale.CHINA);
return locales;
}
}
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_I18N_LOCALE']"/>
<s:bean id="locales" name="tutorial.Locales"/>
<form action="<s:url includeParams="get" encode="true"/>" name="langForm"
style="background-color: powderblue; padding-top: 4px; padding-bottom: 4px;">
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_I18N_LOCALE”的属性),而该属性在没有设置语言前是为空的,所以通过值栈中locale属性来取得当前区域(用户浏览器所设置的语言)。
你可以把LangSelector.jsp作为一个控件使用,方法是在JSP页面中把它包含进来,代码如下所示:
<s:include value="/LangSelector.jsp"/>
在例1中的HellloWorld.jsp中<body>后加入上述代码,并在struts.xml中新建Action,代码如下:
<action name="HelloWorld">
<result>/HelloWorld.jsp</result>
</action>
或者,如果你多个JSP需要实现上述功能,你可以使用下面的通用配置,而不是为每一个JSP页面都新建一个Action。
<action name="*">
<result>/{1}.jsp</result>
</action>
分布运行程序,在浏览器的地址栏中输入http://localhost:8080/Struts2_i18n/HelloWorld.action,出现图4所示页面:
图3 HelloWorld.action
在下拉列表中,选择“American English”,出现图5所示页面:
图4 HelloWorld.action
可能大家会问为什么一定要通过Action来访问页面呢?
你可以试一下不用Action而直接用JSP的地址来访问页面,结果会是无论你在下拉列表中选择什么,语言都不会改变。这表示不能正常运行的。其原因为如果直接使用JSP访问页面,Struts 2.0在web.xml的配置的过滤器(Filter)就不会工作,所以拦截器链也不会工作。
发表评论
-
Struts2自定义拦截器—Session超时的处理
2011-10-11 11:20 1525http://blog.csdn.net/java_cxrs/ ... -
struts2工作原理
2010-09-14 13:09 1667一个请求在Struts2框架中的处理分为以下几个步骤: 1.客 ... -
struts2配置多个struts.xml文件
2010-09-14 12:36 2289在Struts2中如何加载多个配置文件,不是用include的 ... -
struts中#、%和$这三个符号的使用方法
2010-08-14 01:07 1061一、"#"的用法 1、 访问OGNL ... -
s:url标签使用
2010-08-11 16:39 9104一. value <s:set name ... -
标签tree使用
2010-08-11 16:26 1074<head> <s:head theme ... -
s:同行显示
2010-08-11 11:39 1042<s:form action="Login ... -
浅谈Struts 2 interceptor 工作流程
2010-08-02 13:43 1126主要通过一个自定义interceptor简单的例子来解释 St ... -
拦截器详解
2010-08-02 12:51 825在之前的文章中,我们 ... -
Struts2的国际化支持
2010-08-02 11:23 1019每种框价都会有国际化的支持,struts2的国际化大致上分 ... -
struts1与struts2区别
2010-07-26 14:01 8541 在Action实现类方面的对比:Struts 1要求 ... -
struts2中ognl表达式<二>
2010-07-26 11:08 1368OGNL是Object Graph Navigation La ... -
struts2中ognl表达式<一>
2010-07-26 10:54 1949OGNL —— 完美的催化剂 为了解决数 ... -
struts2 iterator标签 status属性
2010-07-22 10:22 1264iterator标签主要是用于迭代输出集合元素,如list s ... -
Struts2.1 标签详细说明
2010-07-22 10:09 908附件为:struts2标签详细说明! -
The Struts dispatcher cannot be found. This is usually caused by using Struts ta
2010-07-21 19:35 1478异常信息:The Struts dispatcher cann ... -
org.apache.struts2.util.Counter
2010-07-21 15:40 2778<s:bean name="org.apach ... -
使用struts2中的s:bean标签
2010-07-21 15:26 1838先添加一个bean: Test1.java package ... -
<s:token />防重复提交
2010-07-21 13:58 1893<s:token />标签防止重复提交,用法如下: ... -
struts2输入校验
2010-07-19 17:36 1040***************** regist.jsp ...
相关推荐
Struts2.0是Apache软件基金会的一个开源框架,主要用于构建基于Java EE的Web应用程序。它在原有的Struts1.x的基础上进行了重大改进,引入了更多现代Web开发的最佳实践和设计模式,提高了开发效率和代码可维护性。这...
本教程将深入探讨Struts2.0如何实现文件的上传与下载,并通过具体的实例进行解析。 ### 文件上传 在Struts2中,文件上传主要依赖于`Commons FileUpload`库。以下是一些关键知识点: 1. **表单设计**:首先,我们...
3. **国际化资源文件乱码**:在使用国际化资源文件(如.properties文件)存储多语言文本时,如果文件编码设置不当,可能会导致读取时出现乱码。 #### 页面显示中文乱码的解决方案 页面显示中文乱码的问题相对较为...
Struts2.0简明教程是一系列针对初学者和进阶者的教程,旨在帮助开发者快速理解和掌握Struts2框架的核心概念和技术。这个教程涵盖了从框架的初步安装到实际开发中的常见功能,包括Action、标签(Tag)、转换器...
### Struts2.0 文件上传知识点详解 #### 一、Struts2 文件上传概述 **Struts2** 是一个基于 **MVC(Model-View-Controller)** 架构模式的开源框架,它广泛应用于Java Web应用程序的开发。在Struts2中,文件上传是...
综上所述,Struts 2.0的验证框架通过定义XML配置文件和资源文件,实现了对用户输入的有效性检查,提高了应用程序的安全性和用户体验。通过合理配置和使用,开发者可以构建出更加健壮和可靠的Web应用。
在Java Web开发领域,Spring、Struts2.0和Hibernate是三个非常重要的开源框架,它们分别专注于不同的层次:Spring提供全面的应用程序管理,Struts2.0处理MVC(Model-View-Controller)架构,而Hibernate则是一个强大...
创建不同语言的资源文件,如`message_en.properties`(英文)和`message_zh_CN.properties`(简体中文)。在`struts.properties`中指定默认的语言,然后在JSP中使用`s:text`标签引用资源包中的键,实现文本的国际化...
1. **Struts 2.0框架**:Struts 2是MVC(模型-视图-控制器)架构的一个实现,用于构建基于Java的Web应用程序。它提供了丰富的功能,如拦截器、结果类型、插件支持等,以简化应用开发。在本项目中,Struts 2将负责...
### Struts2.0 + Spring2.0 + Hibernate3.1 Web 应用知识点解析 #### 一、项目概述 本项目是一个基于Struts2.0、Spring2.0及Hibernate3.1的Web应用程序。它不仅实现了基本的CRUD(创建、读取、更新、删除)操作,...
### Struts2.0中JAR包的使用详解 #### 一、概述 在Struts2.0框架中,为了实现MVC模式的应用程序开发,需要依赖一系列的JAR包来支持其核心功能及扩展特性。本文将详细介绍这些常用的JAR包的功能与作用,帮助开发者...
标题 "Spring2.5 Struts2.0 TopLink Ext2例子" 涉及到的是一个集成使用四个关键开源框架的示例项目,这些框架在Web应用开发中扮演着重要角色。下面将详细介绍这些框架以及它们如何协同工作。 1. **Spring**(2.5...
这个压缩包文件包含了一个基于J2EE架构的高级项目源码,主要采用了Struts2.0、Hibernate、Spring和ExtJS这四大核心技术。下面将详细解释这些技术及其在项目中的应用。 **Struts2.0** 是一个MVC(Model-View-...
在本文中,我们将深入探讨如何使用ExtJS(Ext)与Struts2.0框架整合,实现多文件上传功能。这是一个常见的需求,在Web应用中,用户可能需要上传多个文件,如图片、文档等。通过理解这一过程,开发者可以构建更强大、...
总之,`web.xml`配置文件在Struts2.0框架中起着桥梁和纽带的作用,连接了用户的请求与应用程序的处理逻辑,是每个Struts2开发者必须掌握的基础知识。通过深入理解和实践,开发者可以构建出更加健壮、高效的Web应用。
3. **国际化支持**:内置了国际化支持,可以通过资源文件轻松实现多语言应用。 4. **简化开发**:通过内置的标签库和其他特性,大大简化了前端页面的开发工作。 综上所述,Struts2提供了一套完整的解决方案,帮助...
- **编码转换**:对中文资源文件进行编码转换,确保正确读取中文字符。 通过以上详细解析,我们可以深入了解MVC设计模式的核心概念、Struts两个版本之间的差异、SSH框架的优势以及如何在Struts中实现国际化等功能...