即興的靈感

          思維是一種藝術(shù); 藝術(shù)需要靈感。

          博客好友

          最新評(píng)論

          Spring筆記之八(Internationalization of spring)

          ??? 國(guó)際化支持在實(shí)際開(kāi)發(fā)中可能是最常用的特性,本文分析Spring的 ApplicationContext 提供國(guó)際化支持, 其提供了更加強(qiáng)大的功能,如信息的自動(dòng)裝配以及熱部署功能(配置文件修改后自動(dòng)讀取,而無(wú)需重新啟動(dòng)應(yīng)用程序)。
          ??? 目前Spring中提供了兩個(gè) MessageSource接口的實(shí)現(xiàn),即ResourceBundleMessageSourceReloadableResourceBundleMessageSource,后者提供了無(wú)需重啟即可重新加載配置信息的特性。

          ???
          ??? 在下面的配置文件中,通過(guò)MessageResource的一個(gè)實(shí)現(xiàn)類org.springframework.context.support.ResourceBundleMessageSource來(lái)獲得國(guó)際化的信息。
          ?1?<beans>
          ?2?<description>Spring?Quick?Start</description>
          ?3?<bean?id="messageSource"
          ???? class
          ="org.springframework.context.support.ResourceBundleMessageSource" >
          ?4?<property?name="basenames">
          ?5?<list>
          ?6?<value>messages</value>
          ?7?</list>
          ?8?</property>
          ?9?</bean>
          10?</beans>
          11?

          這里聲明了一個(gè)名為 messageSource Bean 注意: 對(duì)于Message定義,Bean ID必須為messageSource,這是目前Spring的編碼規(guī)約),對(duì)應(yīng)類為ResourceBundleMessageSource

          而其中的basename屬性用來(lái)設(shè)定資源信息文件的前置文件名稱,在本例中為messagesSpring會(huì)自動(dòng)在CLASSPATH根路徑中按照如下順序搜尋資源信息文件并進(jìn)行加載(以Localezh_CN為例,其實(shí)Spring在實(shí)際上調(diào)用了JDKResourceBundle讀取配置文件) :

          messages_zh_CN.properties

          messages_zh.properties

          messages.properties

          messages_zh_CN.class <!--[endif]-->

          messages_zh.class

          messages.class

          <!--[if !supportLists]--> 資源配置信息文件中的內(nèi)容

          1? messages_zh_CN.properties:
          2?userinfo=當(dāng)前登錄用戶:?[{0}]?登錄時(shí)間:[{1}]

          3? messages_en_US.properties:
          4?userinfo=Current?Login?user:?[{0}]?Login?time:[{1}]

          5?

          ??測(cè)試代碼:
          1?ApplicationContext?ctx =
          ???????????????
          new ?FileSystemXmlApplicationContext( " bean.xml "
          );
          2?Object[]?arg?=?new
          ?Object[]
          3?{?"Erica"
          ,?Calendar.getInstance().getTime()
          4?
          };
          5?//以系統(tǒng)默認(rèn)Locale加載信息(對(duì)于中文WinXP而言,默認(rèn)為zh_CN)

          6?String?msg?=?ctx.getMessage("userinfo" ,?arg);
          7?System.out.println("Message?is?===>?"+
          msg);
          8?

          代碼中,我們將一個(gè)Object數(shù)組arg作為參數(shù)傳遞給ApplicationContext.getMessage方法,這個(gè)參數(shù)中包含了出現(xiàn)在最終文字信息中的可變內(nèi)容,ApplicationContext? 將根據(jù)參數(shù)中的Locale信息對(duì)其進(jìn)行處理(如針對(duì)不同?? Locale設(shè)定日期輸出格式),并用其替換配置文件中的{n}標(biāo)識(shí)(n代表參數(shù)數(shù)組中的索引,從1? 開(kāi)始)。

          運(yùn)行上面的代碼,得到以下輸出的內(nèi)容:
          ?? Message is ===> |
          ì〃¤?°|ì???¨???: [Erica] |ì???¨o〃¤??:[07-9-27 上午1:27]

          針對(duì)ResourceBundle的編碼過(guò)程中發(fā)生的問(wèn)題。這是由于轉(zhuǎn)碼過(guò)程中產(chǎn)生的編碼問(wèn)題引發(fā)的。比較簡(jiǎn)單的解決辦法是通過(guò)JDK提供的轉(zhuǎn)碼工具native2ascii.exe? 進(jìn)行轉(zhuǎn)換。執(zhí)行:native2ascii messages_zh_CN.properties msg.txt。 再用msg.txt文件替換Messages_zh_CN.properties?????? 文件。

          ?? 再次運(yùn)行示例代碼,得到正確輸出:

          ?? Message is ===> 當(dāng)前登錄用戶: [Erica] 登錄時(shí)間:[07-9-27 上午1:30]

          嘗試在代碼中指定不同的Locale參數(shù):

          String msg = ctx.getMessage("userinfo", arg, Locale.US);再次運(yùn)行,可以看到:

          Message is ===> Current Login user: [Erica] Login time::[9/27/07 1:35AM]

          可見(jiàn),前者根據(jù)當(dāng)前默認(rèn)Locale"zh_CN"getMessage方法自動(dòng)加載了messages_zh_CN.properties文件;后者 getMessage 方法根據(jù)指定編碼"en_US"加載了messages_en_US.properties文件。






          ?
          鳳凰涅槃/浴火重生/馬不停蹄/只爭(zhēng)朝夕
          ???? 隱姓埋名/低調(diào)華麗/簡(jiǎn)單生活/完美人生

          posted on 2007-09-27 01:00 poetguo 閱讀(1421) 評(píng)論(1)  編輯  收藏 所屬分類: Spring

          評(píng)論

          # re: Spring筆記之八(Internationalization of spring) 2007-09-27 10:46 千里冰封

          支持一下學(xué)習(xí)SPRING的  回復(fù)  更多評(píng)論   

          主站蜘蛛池模板: 贡觉县| 正宁县| 吴堡县| 札达县| 赤城县| 湖北省| 和平区| 芜湖市| 云浮市| 年辖:市辖区| 葵青区| 明星| 武功县| 新源县| 扎囊县| 信阳市| 英德市| 吉水县| 宁城县| 根河市| 富蕴县| 义马市| 额济纳旗| 乌恰县| 鹤峰县| 镶黄旗| 科技| 兰西县| 南溪县| 澳门| 乐都县| 白河县| 肇东市| 湖北省| 绥江县| 靖州| 清苑县| 秀山| 廊坊市| 夏津县| 崇州市|