國際化主要的好處就是在不修改程序的代碼的前提下,在根據客戶端所處的地區語言環境顯示相應的界面。struts2國際化是建立在java國際化的基礎上的,借助于攔截器和國際化資源文件,使得國際化實現更加簡單。
1、國際化資源文件命名規則
baseName_language_country.properties
例如
message_zh_CN.properties
message_en_US.properties
第一個是中文,第二個是英文,baseName可以自己起,但是后面就得一摸一樣,否則會出錯,我就是把CN改成CH,然后想在jsp那里輸出資源文件內容struts2就找不到就顯示了key值。
2、資源文件的類型有四個:
(1)全局資源文件,對整個應用程序有效,保存在src下,并且全局資源文件需要在struts.xml中使用
<constant name="struts.custom.i18n.resources" value="baseName"/>
在<package>上面
(2)包級別的資源文件,對包及子包中所有類有效,需要在包目錄下新建。package_language_country.properties
(3)動作類級別資源文件:只對指定的動作類有效,需要在動作類同一個目錄下新建。動作類名_language_country.properties
(4)臨時的資源文件:用于視圖頁面中輸出國際化消息時臨時指定國際化資源文件,此時需要使用<s:i18n name="baseName">來指定資源文件,可將該標簽作為<s:text>或表單標簽的父標簽。注:臨時資源文件名字任意,必須放在src下。
注意除了全局資源文件外,其他資源不需要在struts.xml配置文件中定義,sttuts2會自動按名字取加載資源文件。
3、資源文件的加載順序
重點:
1、國際化消息的輸出
在jsp中輸出資源文件內容:
(1)使用s:text標簽方式獲取資源文件的內容
<s:text name="login.success">
<s:param>
<s:property value="username"/>
</s:param>
</s:text>
資源文件為:
login.name=username
login.password=password
login.submit=submit
login.success=hello,{0},welcome to mysite
其中param是指定帶占位符的國際化消息,就是把動作類里的username屬性獲取然后把它放到{0}的位置。還有序號從0開始。這是直接在頁面輸出
(2)如果想在表單的label輸出資源文件內容:
<s:form action="login" namespace="/i18n">
<s:textfield name="username" key="login.name"/>
<s:password name="password" key="login.password"/>
<s:submit key="login.submit"/>
</s:form>
(3)想在動作類中輸出資源文件內容:
String tip = getText("login.name");
2、帶占位符的國際化消息
除了在S:text中替換還可以通過動作類中的getText
完整例子
LoginAction
package com.ljs.struts.two;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
private String username;
private String password;
private String tip;
public String execute () {
if(username==null||username.trim().length()==0) {
return LOGIN;
} else {
tip = getText("login.success", new String[] {username});
return SUCCESS;
}
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getTip() {
return tip;
}
public void setTip(String tip) {
this.tip = tip;
}
public LoginAction() {
// TODO Auto-generated constructor stub
}
}
login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<s:form action="login" namespace="/i18n">
<s:textfield name="username" key="login.name"/>
<s:password name="password" key="login.password"/>
<s:submit key="login.submit"/>
</s:form>
</body>
</html>
success.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
<h3>
國際化方式一:使用s:text標簽方式獲取資源文件的內容
</h3>
<s:text name="login.success">
<s:param>
<s:property value="username"/>
</s:param>
</s:text>
<h3>
國際化方式二:通過動作類調用getText(key)方法來獲取資源文件的內容
</h3>
<s:property value="tip"/>
</body>
</html>
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<!-- Struts2配置文件的根元素 -->
<struts>
<constant name="struts.custom.i18n.resources" value="message"/>
<package name="i18n" extends="struts-default" namespace="/i18n">
<action name="login" class="com.ljs.struts.two.LoginAction">
<result name="login">/login.jsp</result>
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
還有一個注意的,我雖然改正了資源文件的名字,但是動作類里卻忘記
了get和set方法,導致點提交execute方法里的username一直為null,所以跳不到success。