第 9 章 ? Struts2 國(guó)際化
在第 1 章綜述中筆者已經(jīng)將國(guó)際化的基本概念做了簡(jiǎn)單說(shuō)明。本章擴(kuò)展國(guó)際化內(nèi)容,向讀者展示在 Struts2 中應(yīng)用國(guó)際化的各種范例。
9.1 ? Struts2 國(guó)際化基礎(chǔ)應(yīng)用
本節(jié)首先介紹國(guó)際化在 Struts2 中的基礎(chǔ)使用方法。主要介紹基礎(chǔ)使用方式的原理以及如何使用占位符號(hào)來(lái)實(shí)現(xiàn) Web 項(xiàng)目國(guó)際化功能的開(kāi)發(fā)。
9.1.1 ? 國(guó)際化基礎(chǔ)使用方式
技術(shù)要點(diǎn)
以登錄功能為例,來(lái)介紹如何實(shí)現(xiàn)中文、英文的國(guó)際化。
= ?????? 國(guó)際化屬性文件定義原理。
= ?????? ActionSupport 類(lèi)中 getText 方法基礎(chǔ)說(shuō)明。
= ?????? 視圖界面中如何顯示國(guó)際化信息。
演示代碼
使用的 Action 文件:
- <!-------------文件名:LoginAction.java---------------> ??
- public ? class ?LoginAction? extends ?ActionSupport?{ ??
- ????……… ??
- ???? public ?String?execute()? throws ?Exception?{ ??
- ???????username?=?getUsername(); //?屬性值即JSP頁(yè)面上輸入的值 ??
- ???????password?=?getPassword(); //?屬性值即JSP頁(yè)面上輸入的值 ??
- ??
- ??????? try ?{ ??
- ??????????? //?判斷輸入值是否是空對(duì)象或沒(méi)有輸入 ??
- ??????????? if ?(username?!=? null ?&&?!username.equals( "" )?&&?password?!=? null &&?!password.equals( "" ))?{ ??
- ??????????????ActionContext.getContext().getSession().put( "user" ,?getUsername()); ??
- ?????????????? //打印getText方法,取得屬性文件中定義的值 ??
- ??????????????System.out.println(getText( "username" )+username); ??
- ??????????????System.out.println(getText( "password" )+password); ??
- ??????????????? //?根據(jù)標(biāo)志內(nèi)容導(dǎo)航到操作成功頁(yè)面 ??
- ??????????????FORWARD?=? "success" ; ??
- ???????????}? else ?{ ??
- ??????????? //?根據(jù)標(biāo)志內(nèi)容導(dǎo)航到操作失敗頁(yè)面 ??
- ??????????????FORWARD?=? "input" ; ??
- ???????????} ??
- ???????}? catch ?(Exception?ex)?{ ??
- ???????????ex.printStackTrace(); ??
- ???????} ??
- ??????? return ?FORWARD; ??
- ????} ??
- ……… ??
- }??
<!-------------文件名:LoginAction.java---------------> public class LoginAction extends ActionSupport { ……… public String execute() throws Exception { username = getUsername();// 屬性值即JSP頁(yè)面上輸入的值 password = getPassword();// 屬性值即JSP頁(yè)面上輸入的值 try { // 判斷輸入值是否是空對(duì)象或沒(méi)有輸入 if (username != null && !username.equals("") && password != null&& !password.equals("")) { ActionContext.getContext().getSession().put("user", getUsername()); //打印getText方法,取得屬性文件中定義的值 System.out.println(getText("username")+username); System.out.println(getText("password")+password); // 根據(jù)標(biāo)志內(nèi)容導(dǎo)航到操作成功頁(yè)面 FORWARD = "success"; } else { // 根據(jù)標(biāo)志內(nèi)容導(dǎo)航到操作失敗頁(yè)面 FORWARD = "input"; } } catch (Exception ex) { ex.printStackTrace(); } return FORWARD; } ……… }
屬性文件中國(guó)際化定義:
?
- <!--------------文件名:struts.properties--------------> ??
- #支持本地化的資源文件名定義 ??
- struts.custom.i18n.resources=messageResource??
<!--------------文件名:struts.properties--------------> #支持本地化的資源文件名定義 struts.custom.i18n.resources=messageResource
?
支持中文的屬性文件內(nèi)容:
?
- <!------------文件名:messageResource_zh_CN.properties-------> ??
- #中文屬性定義文件 ??
- #用key=value格式定義頁(yè)面上顯示的內(nèi)容 ??
- username=用戶(hù)名 ??
- password=密??碼 ??
- loginSubmit=登錄 ??
- loginPage=登錄頁(yè)面 ??
- successPage=操作成功頁(yè)面 ??
- welcome=歡迎您 ??
- user.required=請(qǐng)輸入用戶(hù)名! ??
- pass.required=請(qǐng)輸入密碼!??
<!------------文件名:messageResource_zh_CN.properties-------> #中文屬性定義文件 #用key=value格式定義頁(yè)面上顯示的內(nèi)容 username=用戶(hù)名 password=密 碼 loginSubmit=登錄 loginPage=登錄頁(yè)面 successPage=操作成功頁(yè)面 welcome=歡迎您 user.required=請(qǐng)輸入用戶(hù)名! pass.required=請(qǐng)輸入密碼!
支持英文的屬性文件內(nèi)容:
?
- <!--------文件名:messageResource_en_US.properties-----------> ??
- #英文屬性定義文件 ??
- #用key=value格式定義頁(yè)面上顯示的內(nèi)容 ??
- username=User?Name ??
- password=User?Password ??
- loginSubmit=login ??
- loginPage=login?page ??
- successPage=success?page ??
- welcome=Welcome?You ??
- user.required=please?input?your?name! ??
- pass.required=please?input?your?password!??
<!--------文件名:messageResource_en_US.properties-----------> #英文屬性定義文件 #用key=value格式定義頁(yè)面上顯示的內(nèi)容 username=User Name password=User Password loginSubmit=login loginPage=login page successPage=success page welcome=Welcome You user.required=please input your name! pass.required=please input your password!
?
國(guó)際化的登錄 login.jsp
?
?
- <!-----------------文件名:login.jsp-----------------> ??
- ……… ??
- <html> ??
- <head> ??
- ????<title><s:text?name= "loginPage" ></s:text></title> ??
- </head> ??
- <body> ??
- ????<!--?form標(biāo)簽庫(kù)定義,以及調(diào)用哪個(gè)Action聲明?--> ??
- ????<s:form?action= "Login" > ??
- ????????<table?width= "60%" ?height= "76" ?border= "0" > ??
- ????????????????<!--?各標(biāo)簽定義?--> ??
- ????????????????<s:textfield?name= "username" ?key= "username" /> ??
- ????????????????<s:password?name= "password" ?key= "password" ?/> ??
- ????????????????<s:submit?key= "loginSubmit" ??align= "center" />????????????? ??
- ????????</table> ??
- ????</s:form> ??
- </body> ??
- </html>??
<!-----------------文件名:login.jsp-----------------> ……… <html> <head> <title><s:text name="loginPage"></s:text></title> </head> <body> <!-- form標(biāo)簽庫(kù)定義,以及調(diào)用哪個(gè)Action聲明 --> <s:form action="Login"> <table width="60%" height="76" border="0"> <!-- 各標(biāo)簽定義 --> <s:textfield name="username" key="username"/> <s:password name="password" key="password" /> <s:submit key="loginSubmit" align="center"/> </table> </s:form> </body> </html>
國(guó)際化的登錄成功 success.jsp 文件:
- <!----------------文件名:success.jsp-------------------> ??
- ……… ??
- <head> ??
- ???<title><s:text?name= "successPage" ></s:text></title> ??
- </head>?? ??
- <body> ??
- ?????????<!--?取得session中用戶(hù)名值?--> ??
- ????${sessionScope.user},<s:text?name= "welcome" ></s:text> ??
- </body> ??
- …………??
<!----------------文件名:success.jsp-------------------> ……… <head> <title><s:text name="successPage"></s:text></title> </head> <body> <!-- 取得session中用戶(hù)名值 --> ${sessionScope.user},<s:text name="welcome"></s:text> </body> …………
?
?
?
中文的登錄界面如圖 9.1 。
?
圖 9.1 ? 中文登錄界面
英文的登錄界面如圖 9.2 。
圖 9.2 ? 英文登錄界面
中文登錄成功界面如圖 9.3 。
圖 9.3 ? 中文登錄成功界面
英文登錄成功界面如圖 9.4 。
圖 9.4 ? 英文登錄成功界面
LoginAction 代碼中打印在控制臺(tái)用戶(hù)名和密碼值(支持中文)如圖 9.5 。
圖 9.5 ? 中文屬性值控制臺(tái)打印信息
LoginAction 代碼中打印在控制臺(tái)用戶(hù)名和密碼值(支持英文)如圖 9.6 。
圖 9.6 ? 英文屬性值控制臺(tái)打印信息
代碼解釋
( 1 ) 本節(jié)是 Struts2 國(guó)際化最基本的應(yīng)用。首先請(qǐng)讀者閱讀 struts.properties 文件中代碼。“ struts.custom.i18n.resources ”并不是筆者隨意取的名字。它是 Struts2 設(shè)計(jì)者定義的使用全局國(guó)際化屬性文件的常量名。如果對(duì)它進(jìn)行了定義,則開(kāi)發(fā)者可以在 Web 項(xiàng)目中使用類(lèi)似 XXX_language_country.properties 這樣的屬性文件名格式來(lái)創(chuàng)建在不同語(yǔ)言環(huán)境中的屬性文件。這也就是在上述代碼中有“ messageResource_zh_CN.properties ”和“ messageResource_en_US.properties ”這兩個(gè)各支持中文和英文的屬性文件名的由來(lái)。因?yàn)楣P者在 struts.properties 文件中定義了“ struts.custom.i18n.resources ”值為 messageResource ,這樣 messageResource 作為屬性文件名,可以實(shí)現(xiàn)各個(gè)支持不同國(guó)家語(yǔ)言的國(guó)際化屬性文件。
注意:其實(shí)關(guān)于國(guó)際化屬性文件名的定義不僅僅可以在 struts.properties 中定義,也可以在 struts.xml 和 web.xml 這兩個(gè)配置文件中定義。之所以不在這里介紹,具體原因在第四章介紹如何實(shí)現(xiàn)上傳下載功能的攔截器篇章已經(jīng)記述,這里不再重復(fù)說(shuō)明。如果讀者對(duì)在兩個(gè) xml 文件中定義國(guó)際化屬性文件名又興趣,可自行查閱其它技術(shù)文摘。
( 2 ) LoginAction 繼承 ActionSupport 類(lèi),可以使用 ActionSupport 中 getText 方法。這里 getText 方法中的字符串參數(shù)都是在國(guó)際化屬性文件中定義的 key 。之前章節(jié)也說(shuō)明過(guò)屬性文件中定義格式都是以“ key=value ”格式定義。 getText 方法得到 key 作為方法參數(shù),返回的結(jié)果就是 value 。從圖 9.5 、圖 9.6 也可以看出在兩個(gè)國(guó)際化屬性文件中“用戶(hù)名”和“密碼”的 value 是不相同的,因此在不同的語(yǔ)言環(huán)境下得到的值就不同了。一個(gè)是中文另一個(gè)是英文。
注意: getText 方法在 ActionSupport 中是重載方法。因此它還有幾個(gè)重名的 getText 方法,具體使用在有占位符的國(guó)際化屬性文件中。稍后章節(jié)將具體介紹。
( 3 )在 login.jsp 和 success.jsp 中,筆者使用 struts2 標(biāo)簽 <text> 。該標(biāo)簽的 name 屬性定義為屬性文件中的“ key ”,在 Struts2 的 Action 中 getText 方法就可以將 value 的值顯示在視圖界面上。而在其他 struts2 標(biāo)簽中,增加 key 屬性的定義,也可以將國(guó)際化屬性文件中的 value 值作為各個(gè)標(biāo)簽的值顯示在視圖界面上。比如“ <s:textfield name="username" key="username"/> ”在原先可以使用 label 屬性定義顯示值。現(xiàn)在使用 key 屬性,在不同語(yǔ)言環(huán)境下 username 這個(gè) key 得到的 value 值就不同。效果見(jiàn)圖 9.1 、圖 9.2 。
注意: Struts2 中有個(gè)名字為 i18n 的攔截器,它的使用目的就是在 Action 執(zhí)行前查看 Session 中的 request_locale 參數(shù)的值是什么。如果是“ zh_CN ”它就將之后執(zhí)行的所有 Action 的語(yǔ)言環(huán)境設(shè)置為中文語(yǔ)言環(huán)境。如果是“ en_US ”則是英文語(yǔ)言環(huán)境。在本示例和接下來(lái)的示例中,讀者可以在操作系統(tǒng)下的“控制面板 à 區(qū)域和語(yǔ)言選項(xiàng)”中選擇區(qū)域來(lái)查看在英文和中文語(yǔ)言環(huán)境下示例顯示的異同。當(dāng)然也可以直接在瀏覽器的地址欄中在 action 請(qǐng)求后面寫(xiě)上“? request_locale=zh_CN ”這樣的數(shù)據(jù)。具體可以這么寫(xiě)的原因就是通過(guò)手工輸入的 request_locale 值,來(lái)讓 i18n 攔截器得到該值進(jìn)行相關(guān)語(yǔ)言設(shè)置
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
