Ryan's Java world!

something about Java and opensource!

BlogJava 首页 新随笔 联系 聚合 管理
  51 Posts :: 25 Stories :: 59 Comments :: 0 Trackbacks

Spring in Action 笔记 (IV) -- i18n问题和自定义属性编辑器

  BY: icess Blog: http://blog.matrix.org.cn/page/icess 

   在Spring中处理I18N问题和使用Java里面的类基本上是一样的.使用org.springframework.context.support.ResourceBundleMessageSource

然后注入资源文件(一个名字为basename的属性),然后就可以在Context中使用资源文件了, 如下为一个配置示例: test.xml

<?

xml version = "1.0" encoding = "UTF-8" ?>

<!

DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "spring-beans.dtd" >

<

beans >

< bean id = "messageSource" class = "org.springframework.context.support.ResourceBundleMessageSource" >

< property name = "basename" >

<!-- 注意此处设置 资源 名字 和路径 -->

< value > test/i18n/test </ value >

</ property >

</ bean >

</

beans >

下面为资源文件 test.properties

name =

\u51B0\u96E8

sex =

\u5148\u751F

test_zh.properties

name =

\u51B0\u96E8

sex =

\u5148\u751F

test_en_US.properties

name =

ice rain

sex =

male

下面是一个简单的测试类:

package

test.i18n;

import

java.util.Locale;

import

org.springframework.context.ApplicationContext;

import

org.springframework.context.support.ClassPathXmlApplicationContext;

public

class TestI18n {

/**

* @param args

*/

  public static void main(String[] args) {

    // TODO Auto-generated method stub

    ApplicationContext context =

new ClassPathXmlApplicationContext( "test/i18n/test.xml" );

    String text = context.getMessage(

"sex" , new Object[0], Locale. US );

    String textZH = context.getMessage(

"sex" , new Object[0], Locale. CHINA );

    System.

out .println(text + " 中文:" +textZH);

  }

}

很简单,这样就可以了.

下面来看看Spring中的属性自定义编辑器,这个和Hibernate中的自定义属性差不多 的. 例如下面我们要看到了例子,映射一个电话号码,有areaCode,prefix和 number, 如果不使用自定义属性编辑器那么就要分别注入上面的3个代码,麻烦. 如果使用自定义属性编辑器,直接注入一个-分开的数字序列就可以了 如

888-666-9999

.在下面的例子中的Contact.java类有个PhoneNumber属性,里面保存了上面的3个代码,两个类的代码如下:

package  test.propertyEditor;

public class  Contact {
   private  PhoneNumber phoneNumber;
   private  String name;
  
   public  Contact() {}
  
   public  String getName() {
     return  name;
   }

   public void  setName(String name) {
     this .name = name;
   }

   public  PhoneNumber getPhoneNumber() {
     return  phoneNumber;
   }

   public void  setPhoneNumber(PhoneNumber phoneNumber) {
     this .phoneNumber = phoneNumber;
   }
  
}

PhoneNumber.java

package  test.propertyEditor;

public class  PhoneNumber {
   private  String areaCode;
   private  String prefix;
   private  String number;
   public  PhoneNumber() {
    
   }
   public  PhoneNumber(String areaCode,String prefix,String number) {
     this .areaCode = areaCode;
     this .prefix = prefix;
     this .number = number;
   }
   public  String getAreaCode() {
     return  areaCode;
   }
   public void  setAreaCode(String areaCode) {
     this .areaCode = areaCode;
   }
   public  String getNumber() {
     return  number;
   }
   public void  setNumber(String number) {
     this .number = number;
   }
   public  String getPrefix() {
     return  prefix;
   }
   public void  setPrefix(String prefix) {
     this .prefix = prefix;
   }
}

然后定义一个用来编辑PhoneNumber的编辑器PhoneEditor.java 如下:

package  test.propertyEditor;

import  java.beans.PropertyEditorSupport;

public class  PhoneEditor  extends  PropertyEditorSupport {
   public void  setAsText(String textValue) {
     String stripped = stripNonNumber(textValue);
    
     String areaCode = stripped.substring( 0 , 3 );
     String prefix = stripped.substring( 3 , 6 );
     String number = stripped.substring( 6 );
     PhoneNumber phone =  new  PhoneNumber(areaCode,prefix,number);
    
     setValue(phone);
   }
  
   private  String stripNonNumber(String original) {
     StringBuilder allNumeric =  new  StringBuilder();
    
     for ( int  i =  0 ; i < original.length(); i ++) {
       char  c = original.charAt(i);
       if (Character.isDigit(c)) {
         allNumeric.append(c);
       }
     }
     return  allNumeric.toString();
   }
}

继承java里面的属性编辑器,实现里面的一个方法就可以了, 下面就是在配置文件中注册该编辑器.如下:

testPropertyEditor.xml

<?

xml version = "1.0" encoding = "UTF-8" ?>

<!

DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "spring-beans.dtd" >

<

beans >

< bean id = "customEditorConfigurer" class = "org.springframework.beans.factory.config.CustomEditorConfigurer" >

< property name = "customEditors" >

< map >

< entry key = "test.propertyEditor.PhoneNumber" >

< bean id = "phoneEditor" class = "test.propertyEditor.PhoneEditor" ></ bean >

</ entry >

</ map >

</ property >

</ bean >

<!-- 如果不注册上面自定义Editor的实现, 需要注册一个PhoneNumber的bean,设置其属性然后再注册

Contact的PhoneNumber的属性

-->

< bean id = "contact" class = "test.propertyEditor.Contact" >

< property name = "phoneNumber" >

< value > 888-666-9999 </ value >

</ property >

</ bean >

</

beans >

最后来测试一下注册的结果是否正确:

package  test.propertyEditor;

import  org.springframework.context.ApplicationContext;
import  org.springframework.context.support.ClassPathXmlApplicationContext;

public class  TestPropertyEditor {

   /**
    @param  args
    */
   public static void  main(String[] args) {
     // TODO Auto-generated method stub
     ApplicationContext context =  new  ClassPathXmlApplicationContext( "test/propertyEditor/testPropertyEditor.xml" );
     Contact c = (Contact) context.getBean( "contact" );
    
     System.out.println(c.getPhoneNumber().getAreaCode());
     System.out.println(c.getPhoneNumber().getPrefix());
     System.out.println(c.getPhoneNumber().getNumber());
   }

}

ok, 很简单,下一次来看看,Spring提供的一下比较有意思的功能.如定时,发送Email等.

posted on 2006-05-29 11:24 冰雨 阅读(3016) 评论(0)  编辑  收藏 所属分类: Spring

只有注册用户登录后才能发表评论。


网站导航:
 

JSF中文技术文摘