Struts2之國際化
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中應用,那麼就要注意你資源所放的位置是在哪,那麼命名也是不一樣的。最後,後大家介紹了關於國際化佔位符的應用,這個在實際中應用是關鍵的。