- Java EE框架開發技術與案例教程
- 張繼軍 董衛
- 2196字
- 2020-05-28 14:20:35
4.5 Struts 2的國際化與應用案例
國際化是指應用程序運行時,可根據客戶端請求來自的國家/地區、語言的不同而顯示不同的界面。常用i18n作為“國際化”的簡稱,Struts 2框架通過資源文件的方式來實現國際化。使用國際化,首先需要建立不同語言的資源文件,并把中文符轉化為Unicode代碼,然后在struts.xml配置文件中配置資源文件。
4.5.1 資源文件
語言資源文件內容是由一組key-value對組成的。其格式如下。
loginName=用戶名稱 loginPassword=用戶密碼
針對不同的語言環境,需要定義不同的資源文件。資源文件放在“源包”(src)下,全局資源文件的命名可以有以下3種形式。
● 資源文件名_語言種類編碼_國家編碼.properties。
● 資源文件名_語言種類編碼.properties。
● 資源文件名.properties。
資源文件如果使用第3種命名方式,即缺省語言代碼,若系統找不到與客戶端請求的語言環境相匹配的資源文件,則系統使用該默認的屬性文件。
【例4-7】假設對登錄系統進行國際化處理,根據不同的語言環境顯示英文和中文用戶界面。創建英文和中文版本的資源文件,分別取名為globalMessages_zh_CN.properties和globalMessages_en_US.properties。
提示:對于中文資源文件內容,需要將中文字符轉化為Unicode編碼。在Eclipse開發環境中,自動進行轉換。若使用其他開發工具,根據其特點,選取相應的方法。
1)建立中文版資源文件:globalMessages_zh_CN.properties,代碼如下。
title=登錄頁面 username=姓名 password=密碼 submit=登錄 reset=重置 message.success=你已成功登錄。現進入了主頁。 message.failure=你登錄失敗。現進入注冊頁面,請注冊你的信息。
2)建立英文版資源文件:globalMessages_en_US.properties,代碼如下。
title = Login Page username = Input your username password = Input your password submit = Submit reset = Reset message.success = you're successful to login in. Now you've entered the main page. message.failure = you fail to login in. You need register your information.
4.5.2 資源文件的訪問
編寫完國際化資源文件后,需要在struts.xml文件中配置國際化資源文件的名稱(或者在struts.properties屬性文件內直接設置資源文件),從而使Struts 2的i18n攔截器在加載國際化資源文件時能找到這些國際化資源文件。
1.資源文件的配置
在struts.xml中,需要使用Struts 2的i18n攔截器,通過constant元素配置常量,指定國際資源文件名稱,value的值就是常量值,即國際化資源文件的名稱,配置格式如下。

2.訪問資源文件
當建立資源文件并配置后,就可以在Web應用程序中引用這些資源文件。但不同的Web技術(JSP、Struts 2中的Action、XML)其引用方法不同。
1)JSP頁面上使用國際化資源。
JSP頁面上使用國際化資源,一般使用<s:text>標簽,直接顯示資源文件內的屬性值。另外,在表單中要注意以下兩種情況。
● 表單不使用theme主題,即表單的theme屬性不能設置為simple,此時使用表單標簽的key屬性。例如,【例4-7】給出登錄頁面的設計,其代碼如下。
<s:form action=""> <s:textfield name="username" key="username"></s:textfield> <s:password name="password" key="password"></s:password> <s:submit key="submit"></s:submit> </s:form>
● 表單使用theme主題,即表單的theme屬性若設置為simple,則表單標簽的key屬性不起作用,此時,需要使用<s:text>標簽添加提示信息。例如,【例4-7】登錄頁面也可以給出如下的等價設計,其代碼如下。
<s:form action="" theme="simple"> <s:text name="username"/>:<s:textfield name="username"></s:textfield><br> <s:text name="password"/>:<s:password name="password"> </s:password><br> <s:submit key="submit"></s:submit> </s:form>
2)Action訪問國際化資源文件,通過getText(String key)方法獲取資源信息。注意:采用該方式,Action必須繼承ActionSupport。
例如,在【例4-7】中給出如下Action的定義,并配置Action。
package com.edu.i18n.action; import com.opensymphony.xwork2.ActionSupport; public class TestI18nAction extends ActionSupport { public String execute() throws Exception { //在Action中訪問國際化資源文件的value值,這里是"username" String username = getText("username"); System.out.println(username); return SUCCESS; } }
配置Action和資源文件,代碼如下。
<struts> <constant name="struts.custom.i18n.resources" value="globalMessages"></constant> <package name="default" namespace="/" extends="struts-default"> <action name="testI18n" class="com.edu.i18n.action.TestI18nAction"> <result>/i18n.jsp</result> </action> </package> </struts>
當運行該Action時,在控制臺上輸出username對應的“國際化信息”。
3)利用超鏈接實現動態加載國際化資源文件——直接進入所需要的語言頁面。
在超鏈接的后面附著request_locale的請求參數,其參數值為“語言國家代碼”。注意:超鏈接必須是一個Struts 2的Action請求。例如,對于前面給出的Action:testI18n,利用超鏈接直接加載國際化資源,從而按規定的語言顯示頁面。
<a href="testI18n.action? request_locale=en_US">按英文顯示頁面</a> <a href="testI18n.action? request_locale=zh_CN">按中文顯示頁面</a>
4.5.3 Struts 2的國際化應用案例
【例4-8】在【例4-7】已經給出的資源文件基礎上,設計具有“中英文”的登錄系統。
【分析】對于登錄系統的業務流程,在前面的一些案例中已經介紹過,請參考。
【設計】該系統需要設計的組件有以下幾個。
1)兩個頁面:登錄頁面login.jsp和成功登錄頁面loginsuccess.jsp。
2)兩個資源文件:支持英文登錄和支持中文登錄的資源文件。
3)登錄驗證的控制器LoginAction類。該控制器的業務邏輯是:如果驗證成功,則跳轉到loginsuccess.jsp頁面;如果驗證不成功,則重新返回到登錄頁面(login.jsp)。
【實現過程】
1)建立工程c4_i18n,并在web.xml中配置核心控制器。
2)編寫國際化資源文件。見【例4-7】給出的資源文件。
3)編寫視圖組件輸出國際化消息。
● 中英文登錄頁面(login.jsp)的代碼如下。
<html> <head><title><s:text name="title" /></title></head> <body> <s:form action="checkLogin" method="post"> <s:textfield name="name" key="username" size="20" /> <s:password name="password" key="password" size="22" /> <s:submit key="submit" /> </s:form> </body> </html>
● 登錄成功頁面(loginSuccess.jsp)的代碼如下。
<html> <head> <title> <s:text name="message.success"/></title> </head> <body> <s:text name="username"/>:<s:property value="name"/><br> <s:text name="password"/>:<s:property value="password"/> </body> <br><a href="login.jsp"> <s:property value="tip"/></a> </html>
4)編寫控制器Action, login.jsp對應的業務控制器LoginAction類,代碼如下。
package com.edu.i18n.action; //省略了import; public class LoginAction extends ActionSupport { private String name; private String password; private String tip; //用于存放標題信息 //省略了屬性的setter/getter方法 public String execute() throws Exception{ if(getName().equals("QQ")&&getPassword().equals("123") ){ ActionContext.getContext().getSession().put("name", getName()); tip=getText("title"); return "success"; }else{ return "error"; } } }
5)在struts.xml中配置Action與國際資源文件,配置內容如下。
<struts> <constant name="struts.custom.i18n.resources" value="globalMessages" /> <constant name="struts.i18n.encoding" value="UTF-8" /> <package name="I18N" extends="struts-default"> <action name="checkLogin" class="loginAction.LoginAction"> <result name="success">/loginSuccess.jsp</result> <result name="error">/login.jsp</result> </action> </package> </struts>
6)項目部署和運行。
項目部署后運行,如果操作系統是在中文系統下,運行login.jsp頁面,將出現中文提示信息的運行頁面;如果使用的是英文操作系統或者通過設置瀏覽器語言,運行時將出現英文登錄頁面。在中文情況下的運行界面如圖4-7所示。

圖4-7 【例4-8】的運行界面
a) 登錄頁面b) 顯示登錄成功頁面
- TensorFlow Lite移動端深度學習
- Learning Docker
- DevOps Automation Cookbook
- Hands-On RESTful Web Services with Go
- Learning JavaScript Data Structures and Algorithms
- Spring Boot+Vue全棧開發實戰
- 區塊鏈國產化實踐指南:基于Fabric 2.0
- Web前端開發技術:HTML、CSS、JavaScript
- Oracle Database XE 11gR2 Jump Start Guide
- Java從入門到精通(視頻實戰版)
- Splunk Essentials
- MATLAB計算機視覺實戰
- 打造流暢的Android App
- Office VBA開發經典:中級進階卷
- Tkinter GUI Application Development Blueprints