針對xxx
class
建立xxx
properties文件
可以對class中的Output設置本地化輸出
更常用的方法是正對package
建立packageName
properties
在其中設置ActionClass
StringName=XXX
創建action都是
……ApplicationAction extends ActionSupport{……}
繼承了ActionSupport類
ActionSupport中有method getText()可以通過key獲得properties中的設置
jsp文件使用properties文件中的設置
首先需要AppActionSupport extends ActionSupport類
在struts
xml中設置Action過濾
讓jsp頁面通過該Action(class=
yourPackage
AppActionSupport
)攔截
這樣在jsp頁面可以使用標簽<s:text name=
ssage
/>
國際化是商業系統中不可或缺的一部分所以無論您學習的是什麼Web框架它都是必須掌握的技能
其實Struts x在此部分已經做得相當不錯了它極大地簡化了我們程序員在做國際化時所需的工作例如如果您要輸出一條國際化的信息只需在代碼包中加入FILENAME_xx_XXproperties(其中FILENAME為默認資源文件的文件名)然後在strutsconfigxml中指明其路徑再在頁面用<bean:message>標志輸出即可
不過所謂沒有最好只有更好Struts 並沒有在這部分止步而是在原有的簡單易用的基礎上將其做得更靈活更強大
國際化Hello World
下面讓我們看一個例子——HelloWorld這個例子演示如何根據用戶浏覽器的設置輸出相應的HelloWorld
在Eclipse創建工程配置開發和運行環境(如果對這個步驟有問題可以參考我早前的文章《為Struts 做好准備》)
在src文件夾中加入strutsproperties文件內容如下
strutscustominresources=globalMessages
Struts 有兩個配置文件strutsxml和strutsproperties都是放在WEBINF/classes/下
strutsxml用於應用程序相關的配置
strutsproperties用於Struts 的運行時(Runtime)的配置
在src文件夾中加入globalMessages_en_USproperties文件內容如下
HelloWorld=Hello World!
在src文件夾中加入globalMessages_zh_CNproperties文件內容如下
HelloWorld=你好世界!
在此想和大家分享一個不錯的編寫properties文件的Eclipse插件(plugin)有了它我們在編輯一些簡體中文繁體中文等Unicode文本時就不必再使用nativeascii編碼了您可以通過Eclipse中的軟件升級(Software Update)安裝此插件步驟如下
展開Eclipse的Help菜單將鼠標移到Software Update子項在出現的子菜單中點擊Find and Install
在Install/Update對話框中選擇Search for new features to install點擊Next
在Install對話框中點擊New Remote Site
在New Update Site對話框的Name填入PropEdit或其它任意非空字符串在URL中填入
在Site to include to search列表中除上一步加入的site外的其它選項去掉點擊Finsih
在彈出的Updates對話框中的Select the features to install列表中將所有結尾為x的選項去掉(適用於Eclipse 版本的朋友)
點擊Finish關閉對話框
在下載後同意安裝再按提示重啟Eclipse在工具條看到形似vi的按鈕表示安裝成功插件可用此時Eclpise中所有properties文件的文件名前有綠色的P的圖標作為標識
在WebContent文件夾下加入HelloWorljsp文件內容如下
<%@ page contentType=text/html; charset=UTF%>
<%@taglib prefix=s uri=/strutstags%>
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h><s:text name=HelloWorld/></h>
<h><s:property value=%{getText(HelloWorld)}/></h>
</body>
</html>
發布運行應用程序在浏覽器地址欄中輸入出現圖所示頁面
圖 中文輸出
將浏覽器的默認語言改為英語(美國)刷新頁面出現圖所示頁面
圖 英文輸出
上面的例子的做法
與Struts
x的做法相似
似乎並不能體現Struts
的優勢
不過
我在上面的例子用了兩種方法來顯示國際化字符串
其輸出是相同的
其實
這就是Struts
的一個優勢
因為它默認支持EL
所示我們可以用getText方法來簡潔地取得國際化字符串
另外更普遍的情況——在使用UI表單標志時
getText可以用來設置label屬性
例如
<s:textfield name=
name
label=
%{getText(
UserName
)}
/>
資源文件查找順序
之所以說Struts 的國際化更靈活是因為它可以能根據不同需要配置和獲取資源(properties)文件在Struts 中有下面幾種方法
使用全局的資源文件方法如上例所示這適用於遍布於整個應用程序的國際化字符串它們在不同的包(package)中被引用如一些比較共用的出錯提示
使用包范圍內的資源文件做法是在包的根目錄下新建名的packageproperties和package_xx_XXproperties文件這就適用於在包中不同類訪問的資源
使用Action范圍的資源文件做法為Action的包下新建文件名(除文件擴展名外)與Action類名同樣的資源文件它只能在該Action中訪問如此一來我們就可以在不同的Action裡使用相同的properties名表示不同的值例如在ActonOne中title為動作一而同樣用title在ActionTwo表示動作二節省一些命名工夫
使用<s:in>標志訪問特定路徑的properties文件使用方法請參考我早前的文章《常用的Struts 的標志(Tag)介紹》在您使用這一方法時請注意<s:in>標志的范圍在<s:in name=xxxxx>到</s:in>之間所有的國際化字符串都會在名為xxxxx資源文件查找如果找不到Struts 就會輸出默認值(國際化字符串的名字)
上面我列舉了四種配置和訪問資源的方法它們的范圍分別是從大到小而Struts 在查找國際化字符串所遵循的是特定的順序如圖所示
圖
資源文件查找順序圖
假設我們在某個ChildAction中調用了getText(usertitle)Struts 的將會執行以下的操作
查找ChildAction_xx_XXproperties文件或ChildActionproperties
查找ChildAction實現的接口查找與接口同名的資源文件MyInterfaceproperties
查找ChildAction的父類ParentAction的properties文件文件名為ParentActionproperties
判斷當前ChildAction是否實現接口ModelDriven如果是調用getModel()獲得對象查找與其同名的資源文件
查找當前包下的packageproperties文件
查找當前包的父包直到最頂層包
在值棧(Value Stack)中查找名為user的屬性轉到user類型同名的資源文件查找鍵為title的資源;
查找在strutsproperties配置的默認的資源文件參考例;
輸出usertitle
參數化國際化字符串
許多情況下我們都需要在動行時(runtime)為國際化字符插入一些參數例如在輸入驗證提示信息的時候在Struts 中我們通過以下兩種方法做到這點
在資源文件的國際化字符串中使用OGNL格式為${表達式}例如
validationrequire=${getText(fileName)} is required
使用Java_Docs/html/zh_CN/api/java/text/l>javatextMessageFormat中的字符串格式格式為{ 參數序號(從開始) 格式類形(number | date | time | choice) 格式樣式}例如
validationbetween=Date must between { date short} and { date short}
在顯示這些國際化字符時
同樣有兩種方法設置參數的值
使用標志的valuevaluevalueN的屬性如
<s:text name=validationrequired value=User Name/>
使用param子元素這些param將按先後順序代入到國際化字符串的參數中例如
<s:text name=validationrequired>
<s:param value=User Name/>
</s:text>
>讓用戶方便地選擇語言>
開發國際化的應用程序時有一個功能是必不可少的——讓用戶快捷地選擇或切換語言在Struts 中通過ActionContextgetContext()setLocale(Locale arg)可以設置用戶的默認語言不過由於這是一個比較普遍的應用場景(Scenario)所以Struts 為您提供了一個名in的攔截器(Interceptor)並在默認情況下將其注冊到攔截器鏈(Interceptor chain)中它的原理為在執行Action方法前in攔截器查找請求中的一個名為request_locale的參數如果其存在攔截器就將其作為參數實例化Locale對象並將其設為用戶默認的區域(Locale)最後將此Locale對象保存在session的名為WW_TRANS_IN_LOCALE的屬性中
下面我將提供一完整示例演示它的使用方法
http://img
educity
cn/img_
/
/
/
gif
align=top twffan=
done
>package tutorial;
http://img
educity
cn/img_
/
/
/
gif
align=top twffan=
done
>
http://img
educity
cn/img_
/
/
/
gif
align=top twffan=
done
>import java
util
Hashtable;
http://img
educity
cn/img_
/
/
/
gif
align=top twffan=
done
>import java
util
Locale;
http://img
educity
cn/img_
/
/
/
gif
align=top twffan=
done
>import java
util
Map;
http://img
educity
cn/img_
/
/
/
gif
align=top twffan=
done
>
_
_
_Open_Image onclick=
this
style
display=
none
; Codehighlighter
_
_
_Open_Text
style
display=
none
; Codehighlighter
_
_
_Closed_Image
style
display=
inline
; Codehighlighter
_
_
_Closed_Text
style
display=
inline
;
src=
http://img
educity
cn/img_
/
/
/
gif
align=top twffan=
done
>
_
_
_Closed_Image onclick=
this
style
display=
none
; Codehighlighter
_
_
_Closed_Text
style
display=
none
; Codehighlighter
_
_
_Open_Image
style
display=
inline
; Codehighlighter
_
_
_Open_Text
style
display=
inline
;
src=
http://img
educity
cn/img_
/
/
/
gif
align=top twffan=
done
>publicclass Locales
http://img
educity
cn/img_
/
/
/
gif
twffan=
done
>{
_
_
_Open_Image onclick=
this
style
display=
none
; Codehighlighter
_
_
_Open_Text
style
display=
none
; Codehighlighter
_
_
_Closed_Image
style
display=
inline
; Codehighlighter
_
_
_Closed_Text
style
display=
inline
;
src=
http://img
educity
cn/img_
/
/
/
gif
align=top twffan=
done
>
_
_
_Closed_Image onclick=
this
style
display=
none
; Codehighlighter
_
_
_Closed_Text
style
display=
none
; Codehighlighter
_
_
_Open_Image
style
display=
inline
; Codehighlighter
_
_
_Open_Text
style
display=
inline
;
src=
http://img
educity
cn/img_
/
/
/
gif
align=top twffan=
done
> public Map<String
Locale> getLocales()
http://img
educity
cn/img_
/
/
/
gif
twffan=
done
>{
http://img
educity
cn/img_
/
/
/
gif
align=top twffan=
done
> Map<String
Locale> locales =new Hashtable<String
Locale>(
);
http://img
educity
cn/img_
/
/
/
gif
align=top twffan=
done
> locales
put(
American English
Locale
US);
http://img
educity
cn/img_
/
/
/
gif
align=top twffan=
done
> locales
put(
Simplified Chinese
Locale
CHINA);
http://img
educity
cn/img_
/
/
/
gif
align=top twffan=
done
> return locales;
http://img
educity
cn/img_
/
/
/
gif
align=top twffan=
done
> }
http://img
educity
cn/img_
/
/
/
gif
align=top twffan=
done
>}tutorial/Locales
java
<%@taglib prefix=
s
uri=
/struts
tags
%>
<script type=
text/javascript
>
<!
function langSelecter_onChanged() {
document
langForm
submit();
}
//
>
</script>
<s:set name=
SESSION_LOCALE
value=
#session[
WW_TRANS_I
N_LOCALE
]
/>
<s:bean id=
locales
name=
tutorial
Locales
/>
<form action=
<s:url includeParams=
get
encode=
true
/>
name=
langForm
>
Language: <s:select label=
Language
list=
#locales
locales
listKey=
value
listValue=
key
value=
#SESSION_LOCALE == null ? locale : #SESSION_LOCALE
name=
request_locale
id=
langSelecter
onchange=
langSelecter_onChanged()
theme=
simple
/>
</form>LangSelector
jsp
上述代碼的原理為LangSelectorjsp先實例化一個Locales對象並把對象的Map類型的屬性locales賦予下拉列表(select) 如此一來下拉列表就獲得可用語言的列表大家看到LangSelector有<s:form>標志和一段Javascript腳本它們的作用就是在用戶在下拉列表中選擇了後提交包含reqeust_locale變量的表單到Action在打開頁面時為了下拉列表的選中的當前區域我們需要到session取得當前區域(鍵為WW_TRANS_IN_LOCALE的屬性)而該屬性在沒有設置語言前是為空的所以通過值棧中locale屬性來取得當前區域(用戶浏覽器所設置的語言)
你可以把LangSelector
jsp作為一個控件使用
方法是在JSP頁面中把它包含進來
代碼如下所示
<s:include value=
/LangSelector
jsp
/>
在例
中的HellloWorld
jsp中<body>後加入上述代碼
並在struts
xml中新建Action
代碼如下
<action name=
HelloWorld
>
<result>/HelloWorld
jsp</result>
</action>
或者
如果你多個JSP需要實現上述功能
你可以使用下面的通用配置
而不是為每一個JSP頁面都新建一個Action
<action name=
*
>
<result>/{
}
jsp</result>
</action>
分布運行程序
在浏覽器的地址欄中輸入
出現圖
所示頁面
圖
HelloWorld
action
src=
http://img
educity
cn/img_
/
/
/
gif
twffan=
done
>
圖
HelloWorld
action
在下拉列表中
選擇
American English
出現圖
所示頁面
圖
HelloWorld
action
src=
http://img
educity
cn/img_
/
/
/
gif
twffan=
done
>
圖
HelloWorld
action
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28805.html