1. 程式人生 > >Struts2之國際化

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