Struts2的国际化的步骤与Java国际化的步骤基本相似,只是实现更加简单Strut2的国际化可以按如下步骤进行。
(1). 让系统加载国际化资源。加载国际化资源文件有两种方式。
1) 自动加载:Action范围的国际化资源文件、包范围的国际化资源文件由系统自动加载。
2) 手动加载:JSP范围的国际化资源文件、全局范围的国际化资源文件,分别使用标签、配置常量的方式来手动加载
2. 输出国际化。struts2输出国际化消息同样有两种方式。
1) 在视图页面上输出国际化消息、需要使用Struts2的标签库
2) 在Action类中输出国际化消息,需要使用ActionSupport的getText()方法来完成。
在JSP页面中指定国际化资源需要借助Struts2的另外一个标签:<s:i18n…/>。
如果把<s:i18n…/>标签作为<s:text…/>标签的父类标签,则<s:text…/>标签将会直接加载<s:i18n…/>标签里指定的国际化资源文件;如果把<s:i18n…/>标签当成表单标签父类标签,则表单标签的key属性将会从国际化资源文件中加载该信息。
(1). 定义资源文件,下面分别是中文的、英文的,可以将native2ascii命令处理文件,将文件放到项目的src下,并建立一个文件夹来存放viewResources。
Ø loginForm_zh_CN.properties
#在JSP页面使用的JSP范围的资源文件 loginPage=JSP消息:登录页面 user=JSP消息:用户名 pass=JSP消息:密 码 login=JSP消息:登录
Ø loginForm_en_US.properties
loginPage=JSP Message:Login Page user=JSP Message:User Name pass=JSP Message:User Pass login=JSP Message:Login
(2). JSP视图上的应用
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html > <s:i18n name="viewResources.loginForm"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title><s:text name="loginPage"></s:text></title> </head> <body> <s:form method="post" action="login"> <s:textfield name="username" key="user"/> <s:textfield name="password" key="pass"/> <s:submit key="login"/> </s:form> </body> </html> </s:i18n>
(1). 创建资源文件,汪意要放在使用的Action所在有包下.这个时候命名是用ActionName_language_country.property。如果是在项目即src下,所有的包都可用,那么命名是:package_<language>_<country>.property,如package_zh_CN.properties
Ø LoginAction_zh_CN.properties
failTip=Action消息:对不起,您不能登录! succTip=Action消息:欢迎,您已经登录! username.required=Action消息:用户名是必需的!
Ø LoginAction_en_US.properties
failTip=Action Scope:Sorry,You can't log in! succTip=Action Scope:welcome,you has logged in! username.required=Action Scope: User Name is required!
(2). 创建Actionr的类
public class LoginAction extends ActionSupport { // 下面定义了两个成员变量,用于封装请求参数 private String username; private String password; // username的setter和getter方法 public void setUsername(String username) { this.username = username; } public String getUsername() { return this.username; } // password的setter和getter方法 public void setPassword(String password) { this.password = password; } public String getPassword() { return this.password; } // 处理用户请求的execute()方法 public String execute() throws Exception { ActionContext ctx = ActionContext.getContext(); if (getUsername().equals(“owen") && getPassword().equals("owen")) { ctx.getSession().put("user" , getUsername()); // 获取国际化消息 ctx.put("tip" , getText("succTip")); return SUCCESS; } // 获取国际化消息 ctx.put("tip" , getText("failTip")); return ERROR; } }(3).创建Action的校验规则文件:LoginAction-validation.xml
<?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>
在Struts2中则有更简单的方式来填充占位符,Struts2中提供了如下两种方式来填充:
(1). 如果需要在JSP页面中填充国际化消息里的占位符,则可以通过在<s:text…/>标签中使用多个<s:param…/>标签来填写消息占位符。
(2). 如果需要在Action中填充国际化消息里的占位符,则可以通过调用getText(String aTextName,Listargs)或getText(Stringkey,String[] args)方法来填充占位符。
下面笔者通过例子来说明。
1) 创建资源文件:
Ø result_zh_CN.properties
resultPage=登录结果 welcomeMsg={0},您好!现在时间是{1}!
Ø result_en_US.properties
resultPage=Log In Result welcomeMsg={0},Hello!Now is {1}!
2) 在JSP视图的应用
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html> <s:i18n name="viewResources.result"> <html> <head> <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>
3) 在Action中应用
public class LoginAction extends ActionSupport { // 下面定义了两个成员变量,用于封装请求参数 private String username; private String password; // username的setter和getter方法 public void setUsername(String username) { this.username = username; } public String getUsername() { return this.username; } // password的setter和getter方法 public void setPassword(String password) { this.password = password; } public String getPassword() { return this.password; } // 处理用户请求的execute方法 public String execute() throws Exception { ActionContext ctx = ActionContext.getContext(); if (getUsername().equals("owen") && getPassword().equals("owen")) { 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; } }
这里笔者向大家介绍了Sruts2的国际化,其实也就是两大部分,那就是在JSP的视图中应用与在Action中应用。在JSP中应用,那么注意在加上<s:i18n…/>的标签,并且资源是放在项目下命名要与使用的*.jsp的命名一样。如果是在Action中应用,那么就要注意你资源所放的位置是在哪,那么命名也是不一样的。最后,后大家介绍了关于国际化占位符的应用,这个在实际中应用是关键的。