Ryan's Java world!

          something about Java and opensource!

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            51 Posts :: 25 Stories :: 59 Comments :: 0 Trackbacks

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

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

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

          在java.util.spi中有如下幾個類;

          CurrencyNameProvider LocaleNameProvider TimeZoneNameProvider

          下面來看一個自定義服務的例子:

          那自定義時區名來舉例, 實現類如下:

          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 類, 你必須要實現 public Locale[] getAvailableLocales()  方法, 來指定可用的Locale.

          getDisplayName函數取決于你提供的服務.

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

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

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

          下面來完成一個測試程序, 看看效果:

          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));
            }
          }

          允許該程序, 可以看到如下結果,

          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 

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

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

          JSF中文技術文摘
          主站蜘蛛池模板: 夏邑县| 黔西| 黄骅市| 东辽县| 重庆市| 上高县| 长沙县| 中山市| 清新县| 高密市| 旌德县| 霍林郭勒市| 增城市| 界首市| 大悟县| 北宁市| 巍山| 邹平县| 东光县| 于都县| 崇礼县| 舞阳县| 泾源县| 盐山县| 将乐县| 天峨县| 文昌市| 长宁县| 安西县| 迁安市| 宣城市| 靖安县| 宾川县| 亚东县| 子长县| 饶平县| 颍上县| 比如县| 宁明县| 广灵县| 浪卡子县|