Ryan's Java world!

          something about Java and opensource!

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            51 Posts :: 25 Stories :: 59 Comments :: 0 Trackbacks

          在JDK 6 中, 利用其提供的service provider interfaces (SPI) 可以做到很好的國(guó)際化處理, 以前你只能使用標(biāo)準(zhǔn)的時(shí)區(qū)和各種符號(hào), 如果你所在的地區(qū)不幸不再這些標(biāo)志時(shí)區(qū)中, 或者貨幣符號(hào)也不在其中, 那么你就無能為力了, 現(xiàn)在有了JDK 6 ,我們可以自定義這些服務(wù)的提供者了.

          為了實(shí)現(xiàn)該功能, 在JDK 6中的java.util.spi 包中有個(gè)LocaleServiceProvider 類( http://java.sun.com/javase/6/docs/api/java/util/spi/LocaleServiceProvider.html ), 該類是提供該服務(wù)的基類.  在JDK 6中有幾個(gè)具體的服務(wù)實(shí)現(xiàn) ,分布在java.text.spi, 和java.util.spi包中, 分布規(guī)則為, 如果類XXX在java.text包中, 則相應(yīng)的XXXProvider類就在java.text.spi'包中. 對(duì)于java.util也一樣.,

          在java.text.spi 中有如下幾個(gè)類:
          BreakIteratorProvider  CollatorProvider  DateFormatProvider
          DateFormatSymbolsProvider
          DecimalFormatSymbolsProvider
          NumberFormatProvider

          在java.util.spi中有如下幾個(gè)類;

          CurrencyNameProvider LocaleNameProvider TimeZoneNameProvider

          下面來看一個(gè)自定義服務(wù)的例子:

          那自定義時(shí)區(qū)名來舉例, 實(shí)現(xiàn)類如下:

          package cn.hexiao.revealed;

          import java.util.*;
          import java.util.spi.*;

          public class MyTimeZoneNameProvider extends TimeZoneNameProvider {
            public String getDisplayName(String ID, boolean daylight,int style, Locale locale) {
              System.out.println("ID: " + ID);
              return ID;
            }
            public Locale[] getAvailableLocales() {
              return new Locale[] {Locale.US};
            }
          }

           

          只是在返回ID前,打印該ID. 繼承TimeZoneNameProvider 類, 你必須要實(shí)現(xiàn) public Locale[] getAvailableLocales()  方法, 來指定可用的Locale.

          getDisplayName函數(shù)取決于你提供的服務(wù).

          只是提供這么一個(gè)類,還不可以, 你還要把它打包為jar文件, 在該包的根目錄下面還要有一個(gè)META-INF目錄, 該目錄下面還要有個(gè)services目錄, 在services目錄下面有一個(gè)以java.util.spi.TimeZoneNameProvider 命名(所提供服務(wù)的全限定類名)的文件,該文件的內(nèi)容為 cn.hexiao.revealed.MyTimeZoneNameProvider(服務(wù)提供者的全限定類名). 然后使用

          jar cvf Zones.jar META-INF/* cn/* 命令打包,

          把打包后的文件放到j(luò)re的 lib/ext 目錄下. (如果你使用JDK的jar允許程序,就要放到JDK目錄下的jre目錄中的lib/ext目錄下).

          下面來完成一個(gè)測(cè)試程序, 看看效果:

          import java.util.*;
          public class Zones {
            public static void main(String args[]) {
              TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
              System.out.println(tz.getDisplayName(Locale.US));
              System.out.println(tz.getDisplayName(Locale.UK));
            }
          }

          允許該程序, 可以看到如下結(jié)果,

          G:\JDK6>java Zones
          ID: America/Los_Angeles
          ID: America/Los_Angeles
          ID: America/Los_Angeles
          ID: America/Los_Angeles
          America/Los_Angeles
          Pacific Standard Time

          JSF中午論壇: http://www.hexiao.cn/jsf/index.php 

          我們提供的自定義服務(wù)生效了, ^_^, Enjoy It ! 

          posted on 2007-04-20 12:50 冰雨 閱讀(1390) 評(píng)論(0)  編輯  收藏 所屬分類: Java

          JSF中文技術(shù)文摘
          主站蜘蛛池模板: 社旗县| 青浦区| 剑川县| 黔东| 芦山县| 依安县| 宜春市| SHOW| 靖西县| 遂宁市| 自治县| 晴隆县| 新津县| 大关县| 红安县| 湘阴县| 乾安县| 威远县| 枞阳县| 青海省| 阜平县| 犍为县| 登封市| 崇文区| 西平县| 易门县| 英超| 永安市| 潼南县| 沿河| 南投市| 丰镇市| 汪清县| 澄迈县| 黔江区| 丰城市| 奉化市| 霍林郭勒市| 红安县| 新绛县| 屏边|