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

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