主題:學習Spring必學的Java基礎知識(8)----國際化信息

引述要學習Spring框架的技術內幕,必須事先掌握一些基本的Java知識,正所謂「登高必自卑,涉遠必自邇」。如下幾項Java知識和Spring框架息息相關,不可不學(我將經過一個系列分別介紹這些Java基礎知識,但願對你們有所幫助。):

[1] Java反射知識-->Spring IoC :http://www.iteye.com/topic/1123081
[2] Java動態代理-->Spring AOP :http://www.iteye.com/topic/1123293
[3] 屬性編輯器,即PropertyEditor-->Spring IoC:http://www.iteye.com/topic/1123628
[4] XML基礎知識-->Spring配置:http://www.iteye.com/topic/1123630
[5] 註解-->Spring配置:http://www.iteye.com/topic/1123823
[6] 線程本地變動,即ThreadLocal-->Spring事務管理:http://www.iteye.com/topic/1123824
[7] 事務基礎知識-->Spring事務管理:http://www.iteye.com/topic/1124043
[8] 國際化信息-->MVC:http://www.iteye.com/topic/1124044
[9] HTTP報文-->MVC:http://www.iteye.com/topic/1124408



假設咱們正在開發一個支持多國語言的Web應用程序,要求系統可以根據客戶端的系統的語言類型返回對應的界面:英文的操做系統返回英文界面,而中 文的操做系統則返回中文界面——這即是典型的i18n國際化問題。對於有國際化要求的應用系統,咱們不能簡單地採用硬編碼的方式編寫用戶界面信息、報錯信 息等內容,而必須爲這些須要國際化的信息進行特殊處理。簡單來講,就是爲每種語言提供一套相應的資源文件,並以規範化命名的方式保存在特定的目錄中,由系 統自動根據客戶端語言選擇適合的資源文件。

基礎知識

「國際化信息」也稱爲「本地化信息」,通常須要兩個條件才能夠肯定一個特定類型的本地化信息,它們分別是「語言類型」和「國家/地區的類型」。如 中文本地化信息既有中國大陸地區的中文,又有中國臺灣、中國香港地區的中文,還有新加坡地區的中文。Java經過java.util.Locale類表示 一個本地化對象,它容許經過語言參數和國家/地區參數建立一個肯定的本地化對象。

語言參數使用ISO標準語言代碼表示,這些代碼是由ISO-639標準定義的,每一種語言由兩個小寫字母表示。在許多網站上均可以找到這些代碼的完整列表,下面的網址是提供了標準語言代碼的信息:http://www.loc.gov/standards/iso639-2/php/English_list.php

國家/地區參數也由標準的ISO國家/地區代碼表示,這些代碼是由ISO-3166標準定義的,每一個國家/地區由兩個大寫字母表示。用戶能夠從如下網址查看ISO-3166的標準代碼:
http://www.iso.ch/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html。

表5-2給出了一些語言和國家/地區的標準代碼:



Locale

java.util.Locale是表示語言和國家/地區信息的本地化類,它是建立國際化應用的基礎。下面給出幾個建立本地化對象的示例:

php

Java代碼  收藏代碼html

  1. //①帶有語言和國家/地區信息的本地化對象  java

  2. Locale locale1 = new Locale("zh","CN");   spring

  3.   

  4. //②只有語言信息的本地化對象  編程

  5. Locale locale2 = new Locale("zh");   數組

  6.   

  7. //③等同於Locale("zh","CN")  框架

  8. Locale locale3 = Locale.CHINA;   編輯器

  9.   

  10. //④等同於Locale("zh")  工具

  11. Locale locale4 = Locale.CHINESE;   性能

  12.   

  13. //⑤獲取本地系統默認的本地化對象  

  14. Locale locale 5= Locale.getDefault();  



用戶既能夠同時指定語言和國家/地區參數定義一個本地化對象①,也能夠僅經過語言參數定義一個泛本地化對象②。Locale類中經過靜態常量定義了一些經常使用的本地化對象,③和④處就直接經過引用常量返回本地化對象。此外,用戶還能夠獲取系統默認的本地化對象,如⑤所示。

引用

在測試時,若是但願改變系統默認的本地化設置,能夠在啓動JVM時經過命令參數指定:java -Duser.language=en -Duser.region=US MyTest。



本地化工具類

JDK的java.util包中提供了幾個支持本地化的格式化操做工具類:NumberFormat、DateFormat、MessageFormat。下面,咱們分別經過實例瞭解它們的用法:

代碼清單5-13  NumberFormat

Java代碼  收藏代碼

  1. Locale locale = new Locale("zh""CN");  

  2. NumberFormat currFmt = NumberFormat.getCurrencyInstance(locale);  

  3. double amt = 123456.78;  

  4. System.out.println(currFmt.format(amt));   



上面的實例經過NumberFormat按本地化的方式對貨幣金額進行格式化操做,運行實例,輸出如下信息:

Java代碼  收藏代碼

  1. 123,456.78   



代碼清單5-14  DateFormat

Java代碼  收藏代碼

  1. Locale locale = new Locale("en""US");  

  2. Date date = new Date();  

  3. DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM, locale);  

  4. System.out.println(df.format(date));   



經過DateFormat#getDateInstance(int style,Locale locale)方法按本地化的方式對日期進行格式化操做。該方法第一個入參爲時間樣式,第二個入參爲本地化對象。運行以上代碼,輸出如下信息:

Java代碼  收藏代碼

  1. Jan 82007  



MessageFormat在NumberFormat和DateFormat的基礎上提供了強大的佔位符字符串的格式化功能,它支持時間、貨幣、數字以及對象屬性的格式化操做。下面的實例演示了一些常見的格式化功能:

代碼清單5-15  MessageFormat

Java代碼  收藏代碼

  1.  //①信息格式化串  

  2. String pattern1 = "{0},你好!你於{1}在工商銀行存入{2} 元。";  

  3. String pattern2 = "At {1,time,short} On{1,date,long},{0} paid {2,number, currency}.";  

  4.   

  5. //②用於動態替換佔位符的參數  

  6. Object[] params = {"John"new GregorianCalendar().getTime(),1.0E3};  

  7.   

  8. //③使用默認本地化對象格式化信息  

  9. String msg1 = MessageFormat.format(pattern1,params);   

  10.   

  11. //④使用指定的本地化對象格式化信息  

  12. MessageFormat mf = new MessageFormat(pattern2,Locale.US);   

  13. String msg2 = mf.format(params);  

  14. System.out.println(msg1);  

  15. System.out.println(msg2);  



pattern1是簡單形式的格式化信息串,經過{n}佔位符指定動態參數的替換位置索引,{0}表示第一個參數,{1}表示第二個參數,以此類推。

pattern2格式化信息串比較複雜一些,除參數位置索引外,還指定了參數的類型和樣式。從pattern2中能夠看出格式化信息串的語法是很 靈活的,一個參數甚至能夠出如今兩個地方:如 {1,time,short}表示從第二個入參中獲取時間部分的值,顯示爲短樣式時間;而{1,date,long}表示從第二個入參中獲取日期部分的 值,顯示爲長樣式時間。關於MessageFormat更詳細的使用方法,請參見JDK的Javadoc。

在②處,定義了用於替換格式化佔位符的動態參數,這裏,咱們使用到了JDK5.0自動裝包的語法,不然必須採用封裝類表示基本類型的參數值。

在③處,經過MessageFormat的format()方法格式化信息串。它使用了系統默認的本地化對象,因爲咱們是中文平臺,所以默認爲Locale.CHINA。而在④處,咱們顯式指定MessageFormat的本地化對象。

運行上面的代碼,輸出如下信息:

引用

John,你好!你於07-1-8 下午9:58在工商銀行存入1,000元。
At 9:58 PM OnJanuary 8, 2007,John paid $1,000.00.
ResourceBoundle



若是應用系統中某些信息須要支持國際化功能,則必須爲但願支持的不一樣本地化類型分別提供對應的資源文件,並以規範的方式進行命名。國際化資源文件的命名規範規定資源名稱採用如下的方式進行命名:

引用

<資源名>_<語言代碼>_<國家/地區代碼>.properties



其中,語言代碼和國家/地區代碼都是可選的。<資源名>.properties命名的國際化資源文件是默認的資源文件,即某個本地化 類型在系統中找不到對應的資源文件,就採用這個默認的資源文件。<資源名>_<語言代碼>.properties命名的國際化資 源文件是某一語言默認的資源文件,即某個本地化類型在系統中找不到精確匹配的資源文件,將採用相應語言默認的資源文件。

舉一個例子:假設資源名爲resource,則語言爲英文,國家爲美國,則與其對應的本地化資源文件命名爲resource_en_US.properties。信息在資源文件以屬性名/值的方式表示:

引用

greeting.common=How are you!
greeting.morning = Good morning!
greeting.afternoon = Good Afternoon!
對應語言爲中文,國家/地區爲中國大陸的本地化資源文件則命名爲resource_zh_ CN.properties,資源文件內容以下:
greeting.common=\u60a8\u597d\uff01
greeting.morning=\u65e9\u4e0a\u597d\uff01
greeting.afternoon=\u4e0b\u5348\u597d\uff01



本地化不一樣的同一資源文件,雖然屬性值各不相同,但屬性名倒是相同的,這樣應用程序就能夠經過Locale對象和屬性名精確調用到某個具體的屬性值了。

讀者可能已經注意到,上面中文的本地化資源文件內容採用了特殊的編碼表示中文字符,這是由於資源文件對文件內容有嚴格的要求:只能包含ASCII 字符。因此必須將非ASCII字符的內容轉換爲Unicode代碼的表示方式。如上面中文的resource_zh_CN.properties資源文件 的三個屬性值分別是「您好!」、「早上好!」和「下午好!」三個中文字符串對應的Unicode代碼串。

若是在應用開發時,直接採用Unicode代碼編輯資源文件是很不方便的,因此,一般咱們直接使用正常的方式編寫資源文件,在測試或部署時再採用 工具進行轉換。JDK在bin目錄下爲咱們提供了一個完成此項功能的native2ascii工具,它能夠將中文字符的資源文件轉換爲Unicode代碼 格式的文件,命令格式以下:

引用

native2ascii [-reverse] [-encoding 編碼] [輸入文件 [輸出文件]]



resource_zh_CN.properties包含中文字符而且以UTF-8進行編碼,假設將該資源文件放到d:\目錄下,經過下面的命令就能夠將其轉換爲Unicode代碼的形式:

引用

D:\>native2ascii -encoding utf-8 d:\resource_zh_CN.properties
d:\resource_zh_CN_1.properties



因爲原資源文件採用UTF-8編碼,因此必須顯式經過-encoding指定編碼格式。

引用

經過 native2ascii命令手工轉換資源文件,不但在操做上不方便,轉換後資源文件中的屬性內容因爲採用了ASCII編碼,閱讀起來也不方便。不少 IDE開發工具都有屬性編輯器的插件,插件會自動將資源文件內容轉換爲ASCII形式的編碼,同時以正常的方式閱讀和編輯資源文件的內容,這給開發和維護 帶來了很大的便利。對於MyEclipse來講,使用MyEclipse Properties Editor編輯資源屬性文件;對於Intellij IDEA來講,無須安裝任何插件就天然支持資源屬性文件的這種編輯方式了。



若是應用程序中擁有大量的本地化資源文件,直接經過傳統的File操做資源文件顯然太過笨拙。Java爲咱們提供了用於加載本地化資源文件的方便類java.util.ResourceBoundle。

ResourceBoundle爲加載及訪問資源文件提供便捷的操做,下面的語句從相對於類路徑的目錄中加載一個名爲resource的本地化資源文件:

Java代碼  收藏代碼

  1. ResourceBundle rb = ResourceBundle.getBundle("com/baobaotao/i18n/resource", locale)  



經過如下的代碼便可訪問資源文件的屬性值:

Java代碼  收藏代碼

  1. rb.getString("greeting.common")  



來看下面的實例:

代碼清單5-16  ResourceBoundle

Java代碼  收藏代碼

  1. ResourceBundle rb1 = ResourceBundle.getBundle("com/baobaotao/i18n/resource", Locale.US);  

  2. ResourceBundle rb2 = ResourceBundle.getBundle("com/baobaotao/i18n/resource", Locale.CHINA);  

  3. System.out.println("us:"+rb1.getString("greeting.common"));  

  4. System.out.println("cn:"+rb2.getString("greeting.common"));  



rb1加載了對應美國英語本地化的resource_en_US.properties資源文件;而rb2加載了對應中國大陸中文的resource_zh_CN.properties資源文件。運行上面的代碼,將輸出如下信息:

引用

us:How are you!
cn:您好!



加載資源文件時,若是不指定本地化對象,將使用本地系統默認的本地化對象。因此,在中文系統中,ResourceBundle.getBundle("com/baobaotao/i18n/resource")語句也將返回和代碼清單5-14中rb2相同的本地化資源。

ResourceBundle在加載資源時,若是指定的本地化資源文件不存在,它按如下順序嘗試加載其餘的資源:本地系統默認本地化對象對應的資 源→默認的資源。上面的例子中,假設咱們使用ResourceBundle.getBundle("com/baobaotao/i18n /resource",Locale.CANADA)加載資源,因爲不存在resource_en_CA.properties資源文件,它將嘗試加載 resource_zh_CN.properties的資源文件,假設resource_zh_CN.properties資源文件也不存在,它將繼續嘗 試加載resource.properties的資源文件,若是這些資源都不存在,將拋出 java.util.MissingResourceException異常。

在資源文件中使用格式化串

在上面的資源文件中,屬性值都是通常的字符串,它們不能結合運行時的動態參數構造出靈活的信息,而這種需求是很常見的。要解決這個問題很簡單,只須使用帶佔位符的格式化串做爲資源文件的屬性值並結合使用MessageFormat就能夠知足要求了。

上面的例子中,咱們僅向用戶提供通常性問候,下面咱們對資源文件進行改造,經過格式化串讓問候語更具個性化:

引用

greeting.common=How are you!{0},today is {1}
greeting.morning = Good morning!{0},now is {1 time short}
greeting.afternoon = Good Afternoon!{0} now is {1 date long}



將該資源文件保存在fmt_resource_en_US.properties中,按照一樣的方式編寫對應的中文本地化資源文件fmt_resource_zh_CN.properties。

下面,咱們聯合使用ResourceBoundle和MessageFormat獲得美國英文的本地化問候語:

代碼清單5-17  資源文件格式化串處理

Java代碼  收藏代碼

  1.  //①加載本地化資源  

  2. ResourceBundle rb1 =   

  3.              ResourceBundle.getBundle("com/baobaotao/i18n/fmt_ resource",Locale.US);   

  4. ResourceBundle rb2 =   

  5.               ResourceBundle.getBundle("com/baobaotao/i18n/fmt_ resource",Locale.CHINA);  

  6. Object[] params = {"John"new GregorianCalendar().getTime()};  

  7.   

  8.   

  9. String str1 = new MessageFormat(rb1.getString("greeting.common"),Locale. US).format(params); ②  

  10. String str2 =new MessageFormat(rb2.getString("greeting.morning"),Locale. CHINA).format(params);  

  11. String str3 =new MessageFormat(rb2.getString("greeting.afternoon"),Locale. CHINA).format(params);  

  12. System.out.println(str1);  

  13. System.out.println(str2);  

  14. System.out.println(str3);  



運行以上的代碼,將輸出如下信息:

引用

How are you!John,today is 1/9/07 4:11 PM
早上好!John,如今是下午4:11
下午好!John,如今是2007年1月9日



MessageSource

Spring定義了訪問國際化信息的MessageSource接口,並提供了幾個易用的實現類。首先來了解一下該接口的幾個重要方法:

  • String getMessage(String code, Object[] args, String defaultMessage, Locale locale)

  • code表示國際化資源中的屬性名;args用於傳遞格式化串佔位符所用的運行期參數;當在資源找不到對應屬性名時,返回defaultMessage參數所指定的默認信息;locale表示本地化對象;


  • String getMessage(String code, Object[] args, Locale locale)

  •    throws NoSuchMessageException


  • 與上面的方法相似,只不過在找不到資源中對應的屬性名時,直接拋出NoSuchMessageException異常;


  • String getMessage(MessageSourceResolvable resolvable, Locale locale)

  •    throws NoSuchMessageException


  • MessageSourceResolvable 將屬性名、參數數組以及默認信息封裝起來,它的功能和第一個接口方法相同。





MessageSource的類結構

MessageSource分別被HierarchicalMessageSource和ApplicationContext接口擴展,這裏咱們主要看一下HierarchicalMessageSource接口的幾個實現類,如圖5-7所示:



HierarchicalMessageSource接口添加了兩個方法,創建父子層級的MessageSource結構,相似於前面咱們所介紹 的HierarchicalBeanFactory。該接口的setParentMessageSource (MessageSource parent)方法用於設置父MessageSource,而getParentMessageSource()方法用於返回父 MessageSource。

HierarchicalMessageSource接口最重要的兩個實現類是ResourceBundleMessageSource和 ReloadableResourceBundleMessageSource。它們基於Java的ResourceBundle基礎類實現,容許僅經過 資源名加載國際化資源。ReloadableResourceBundleMessageSource提供了定時刷新功能,容許在不重啓系統的狀況下,更 新資源的信息。StaticMessageSource主要用於程序測試,它容許經過編程的方式提供國際化信息。而 DelegatingMessageSource是爲方便操做父MessageSource而提供的代理類。

ResourceBundleMessageSource

該實現類容許用戶經過beanName指定一個資源名(包括類路徑的全限定資源名),或經過beanNames指定一組資源名。在代碼清單 5-18中,咱們經過JDK的基礎類完成了本地化的操做,下面咱們使用ResourceBundleMessageSource來完成相同的任務。讀者可 以比較二者的使用差異,並體會Spring所提供的國際化處理功能所帶給咱們的好處:

代碼清單5-18  經過ResourceBundleMessageSource配置資源

Xml代碼  收藏代碼

  1. <bean id="myResource"  

  2. class="org.springframework.context.support.ResourceBundleMessageSource">  

  3.     <!--①經過基名指定資源,相對於類根路徑-->  

  4.     <property name="basenames">    

  5.        <list>  

  6.           <value>com/baobaotao/i18n/fmt_resource</value>  

  7.        </list>  

  8.     </property>  

  9.   </bean>   



啓動Spring容器,並經過MessageSource訪問配置的國際化資源,如代碼清單 5 19所示:

代碼清單5-19  訪問國際化消息:ResourceBundleMessageSource

Java代碼  收藏代碼

  1. String[] configs = {"com/baobaotao/i18n/beans.xml"};  

  2. ApplicationContext ctx = new ClassPathXmlApplicationContext(configs);  

  3.   

  4. //①獲取MessageSource的Bean  

  5. MessageSource ms = (MessageSource)ctx.getBean("myResource");   

  6. Object[] params = {"John"new GregorianCalendar(). getTime()};  

  7.   

  8. //②獲取格式化的國際化信息  

  9. String str1 = ms.getMessage("greeting.common",params,Locale.US);  

  10. String str2 = ms.getMessage("greeting.morning",params,Locale.CHINA);  

  11. String str3 = ms.getMessage("greeting.afternoon",params,Locale.CHINA);  

  12. System.out.println(str1);  

  13. System.out.println(str2);  

  14. System.out.println(str3);  



比較代碼清單5-19中的代碼,咱們發現最主要的區別在於咱們無須再分別加載不一樣語言、不一樣國家/地區的本地化資源文件,僅僅經過資源名就能夠加 載整套的國際化資源文件。此外,咱們無須顯式使用MessageFormat操做國際化信息,僅經過MessageSource# getMessage()方法就能夠完成操做了。這段代碼的運行結果與代碼清單5 17的運行結果徹底同樣。

ReloadableResourceBundleMessageSource

前面,咱們提到該實現類比之於ResourceBundleMessageSource的惟一區別在於它能夠定時刷新資源文件,以便在應用程序不 重啓的狀況下感知資源文件的變化。不少生產系統都須要長時間持續運行,系統重啓會給運行帶來很大的負面影響。這時,經過該實現類就能夠解決國際化信息更新 的問題。請看下面的配置:

代碼清單5-20  經過ReloadableResourceBundleMessageSource配置資源

Xml代碼  收藏代碼

  1. <bean id="myResource"   

  2. lass="org.springframework.context.support. ReloadableResourceBundleMessageSource">  

  3.    <property name="basenames">  

  4.       <list>  

  5.         <value>com/baobaotao/i18n/fmt_resource</value>  

  6.       </list>  

  7.    </property>  

  8.    <!--① 刷新資源文件的週期,以秒爲單位-->  

  9.    <property name="cacheSeconds" value="5"/>   

  10.  </bean>  



在上面的配置中,咱們經過cacheSeconds屬性讓ReloadableResourceBundleMessageSource每5秒鐘 刷新一次資源文件(在真實的應用中,刷新週期不能過短,不然頻繁的刷新將帶來性能上的負面影響,通常不建議小於30分鐘)。cacheSeconds默認 值爲-1表示永不刷新,此時,該實現類的功能就蛻化爲ResourceBundleMessageSource的功能。

咱們編寫一個測試類對上面配置的ReloadableResourceBundleMessageSource進行測試:

代碼清單5-21  刷新資源:ReloadableResourceBundleMessageSource

Java代碼  收藏代碼

  1. String[] configs = {"com/baobaotao/i18n/beans.xml"};  

  2. ApplicationContext ctx = new ClassPathXmlApplicationContext(configs);  

  3.   

  4. MessageSource ms = (MessageSource)ctx.getBean("myResource");  

  5. Object[] params = {"John"new GregorianCalendar().getTime()};  

  6.   

  7. for (int i = 0; i < 2; i++) {  

  8.     String str1 = ms.getMessage("greeting.common",params,Locale.US);      

  9.     System.out.println(str1);  

  10.     Thread.currentThread().sleep(20000); //①模擬程序應用,在此期間,咱們更改資源文件   

  11. }  



在①處,咱們讓程序睡眠20秒鐘,在這期間,咱們將fmt_resource_zh_CN.properties資源文件的greeting.common鍵值調整爲:

引用

---How are you!{0},today is {1}---



咱們將看到兩次輸出的格式化信息分別對應更改先後的內容,也即本地化資源文件的調整被自動生效了:

引用

How are you!John,today is 1/9/07 4:55 PM
---How are you!John,today is 1/9/07 4:55 PM---



容器級的國際化信息資源

在如圖5-7所示的MessageSource類圖結構中,咱們發現ApplicationContext實現了MessageSource的接口。也就是說ApplicationContext的實現類自己也是一個MessageSource對象。

將ApplicationContext和MessageSource整合起來,乍一看挺讓人費解的,Spring這樣設計的意圖到底是什麼呢? 原來Spring認爲:在通常狀況下,國際化信息資源應該是容器級。咱們通常不會將MessageSource做爲一個Bean注入到其餘的Bean中, 相反MessageSource做爲容器的基礎設施向容器中全部的Bean開放。只要咱們考察一下國際化信息的實際消費場所就更能理解Spring這一設 計的用意了。國際化信息通常在系統輸出信息時使用,如Spring MVC的頁面標籤,控制器Controller等,不一樣的模塊均可能經過這些組件訪問國際化信息,所以Spring就將國際化消息做爲容器的公共基礎設施 對全部組件開放。

既然通常狀況下咱們不會直接經過引用MessageSource Bean使用國際信息,那如何聲明容器級的國際化信息呢?咱們其實在5.1.1節講解Spring容器的內部工做機制時已經埋下了伏筆:在介紹容器啓動過 程時,咱們經過代碼清單5-1對Spring容器啓動時的步驟進行剖析,④處的initMessageSource()方法所執行的工做就是初始化容器中 的國際化信息資源:它根據反射機制從BeanDefinitionRegistry中找出名稱爲「messageSource」且類型爲 org.springframework.context.MessageSource的Bean,將這個Bean定義的信息資源加載爲容器級的國際化信 息資源。請看下面的配置:

代碼清單5-22  容器級資源的配置

Xml代碼  收藏代碼

  1. <!--①註冊資源Bean,其Bean名稱只能爲messageSource -->  

  2. <bean id="messageSource"   

  3.       class="org.springframework.context.support.ResourceBundleMessageSource">  

  4.   <property name="basenames">  

  5.      <list>  

  6.        <value>com/baobaotao/i18n/fmt_resource</value>  

  7.      </list>  

  8.   </property>  

  9. </bean>  



下面,咱們經過ApplicationContext直接訪問國際化信息,如代碼清單5 23所示:

代碼清單5-23  經過ApplicationContext訪問國際化信息

Java代碼  收藏代碼

  1. String[] configs = {"com/baobaotao/i18n/beans.xml"};  

  2. ApplicationContext ctx = new ClassPathXmlApplicationContext(configs);  

  3. //①直接經過容器訪問國際化信息  

  4. Object[] params = {"John"new GregorianCalendar().getTime()};  

  5.    

  6. String str1 = ctx.getMessage("greeting.common",params,Locale.US);  

  7. String str2 = ctx.getMessage("greeting.morning",params,Locale.CHINA);     

  8. System.out.println(str1);  

  9. System.out.println(str2);  



運行以上代碼,輸出如下信息:

引用

How are you!John,today is 1/9/07 5:24 PM
早上好!John,如今是下午5:24

假設MessageSource Bean名字沒有命名爲「messageSource」,以上代碼將拋出NoSuchMessageException異常。

相關文章
相關標籤/搜索