步骤
1)加载国际化资源文件:|--Action以及包范围内国际化资源文件自动加载
|--JSP、全局范围的国际化资源文件,分别使用标签、配置常量方式手动加载
2)输出国际化:|--视图上:使用Struts2标签库
|--Action类中:使用ActionSupport的getText()方法完成
加载资源文件的顺序:
1Action中: 类文件->父类文件->实现的接口所在文件->实现的ModelDriven,找到getModel()方法对应的model对象重复前面几步操作->baseName为package的系列资源文件->沿当前包上溯,直到顶层包查找baseName为package的系列资源文件->查找struts.custom.i18n.resources常量指定的baseName的系列资源文件->没有找到,直接输出该key的字符串值。
2JSP中: 1) 对于使用<s:i18n../>标签作为父标签的<s:text../>标签、表单标签:
<s:i18n../>指定的资源文件->struts.custom.i18n.resources指定的资源文件->没有找到,直接 输出该key的字符串值。
2)对于没有使用<s:i18n../>标签的:
struts.custom.i18n.resources指定的资源文件->没有找到,直接输出该key的字符串值。
<s:i18n../>指定的资源文件->struts.custom.i18n.resources指定的资源文件->没有找到,直接 输出该key的字符串值。
2)对于没有使用<s:i18n../>标签的:
struts.custom.i18n.resources指定的资源文件->没有找到,直接输出该key的字符串值。
JSP视图页面:
资源文件在WEB-INFsrcviewResources下,资源文件的baseName为loginForm
<s:i18n name="viewResources.loginForm"> <html> <head> <meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" /> <meta http-equiv="Content-Type" content="text/html; charset=GBK" /> <!-- 使用text标签来输出国际化消息 --> <title><s:text name="loginPage"/></title> </head> <body> <s:form action="login"> <!-- 表单标签中使用key属性来输出国际化消息 --> <s:textfield name="username" key="user"/> <s:textfield name="password" key="pass"/> <s:submit key="login"/> </s:form> </body> </html> </s:i18n>
Action范围内的国际化:
在Action所在路径建立ActionName_language_country.properties文件即可
Action范围内的国际化资源消息可以通过下面三种方式使用:
- 在JSP页面中输出国际化消息,可以使用struts2的<s:text../>标签,该标签可以指定一个name属性,该属性的值为国际化资源文件中的key。
- 如果想在表单元素的label中输出国际化信息,可以为该表单标签指定一个key值,改属性的值为国际化资源文件中的key。
- 在Action类中可以使用ActionSupport类的getText()方法,该方法可以接受一个name参数,该参数指定国际化资源文件中的key。
public String execute() throws Exception { ActionContext ctx = ActionContext.getContext(); if (getUsername().equals("crazyit.org") && getPassword().equals("leegang")) { ctx.getSession().put("user" , getUsername()); // 获取国际化消息 ctx.put("tip" , getText("succTip")); return SUCCESS; } // 获取国际化消息 ctx.put("tip" , getText("failTip")); return ERROR; }
如果需要在Action校验规则文件中使用Action范围的国际化消息,可通过<message../>元素指定key属性来实现。
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> <validators> <!-- 校验Action的name属性 --> <field name="username"> <!-- 指定name属性必须满足必填规则 --> <field-validator type="requiredstring"> <param name="trim">true</param> <message key="username.required"/> </field-validator> </field> </validators>
包范围内使用国际化资源:
与Action范围的国际化资源文件功能相似,区别是:包范围内的可以 被该包下所有Action使用。
文件名为package_<language>_<country>.properties
当Action范围的和包范围的资源文件同时存在时,系统优先使用Action范围内的。推荐尽量使用Action范围的国际化资源消息,以提高更好的维护性。
全局范围内使用国际化资源:
struts.properties文件中
struts.custom.i18n.resources=messageResource
struts.xml中:
<constant name="struts.custom.i18n.resources" value="messageResource"/>
(注:messageResource为国际化资源文件的baseName)
实际项目中不推荐把JSP页面、Action、Action 校验文件中的国际化消息放到全局国际化资源文件中管理,因为这样会导致全局国际化资源文件爆炸式增长,难以维护。
输出带有占位符的国际化消息:
输出带有占位符的国际化消息:
JSP页面中:
<s:i18n name="viewResources.result"> <html> <head> <meta name="author" content="Yeeku.H.Lee(CrazyIt.org)" /> <meta http-equiv="Content-Type" content="text/html; charset=GBK" /> <title><s:text name="resultPage"/></title> </head> <body> <jsp:useBean id="d" class="java.util.Date" scope="page"/> ${requestScope.tip}<br/> <!-- 输入带占位符的国际化消息 --> <s:text name="welcomeMsg"> <s:param><s:property value="username"/></s:param> <s:param>${d}</s:param> </s:text> </body> </html> </s:i18n>
Action中:
public String execute() throws Exception { ActionContext ctx = ActionContext.getContext(); if (getUsername().equals("crazyit.org") && getPassword().equals("leegang")) { ctx.getSession().put("user" , getUsername()); // 获取国际化消息 ctx.put("tip" , getText("succTip" , new String[]{username})); return SUCCESS; } // 获取国际化消息 ctx.put("tip" , getText("failTip" , new String[]{username})); return ERROR; }
Struts2还提供了对占位符的一种替代方式,直接在国际化消息中使用表达式:
failTip=${username},对不起,您不能登录!
succTip=${username},欢迎,您已经登录!