Struts2的国际化的步骤与Java国际化的步骤基本相似,只是实现更加简单Strut2的国际化可以按如下步骤进行。
(1). 让系统加载国际化资源。加载国际化资源文件有两种方式。
1) 自动加载:Action范围的国际化资源文件、包范围的国际化资源文件由系统自动加载。
2) 手动加载:JSP范围的国际化资源文件、全局范围的国际化资源文件,分别使用标签、配置常量的方式来手动加载
2. 输出国际化。struts2输出国际化消息同样有两种方式。
1) 在视图页面上输出国际化消息、需要使用Struts2的标签库
2) 在Action类中输出国际化消息,需要使用ActionSupport的getText()方法来完成。
1. 视图页面的国际化
在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>
2. Action的国际化
(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>
3. 带占位符的国际化
在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;
}
}
4. 总结
这里笔者向大家介绍了Sruts2的国际化,其实也就是两大部分,那就是在JSP的视图中应用与在Action中应用。在JSP中应用,那么注意在加上<s:i18n…/>的标签,并且资源是放在项目下命名要与使用的*.jsp的命名一样。如果是在Action中应用,那么就要注意你资源所放的位置是在哪,那么命名也是不一样的。最后,后大家介绍了关于国际化占位符的应用,这个在实际中应用是关键的。
923

被折叠的 条评论
为什么被折叠?



