ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>
 BY: icess Blog: http://blog.matrix.org.cn/page/icessÂ
  在Springä¸å¤„ç†I18N问题和ä‹É用Java里é¢çš„类基本上是一æ ïLš„.使用org.springframework.context.support.ResourceBundleMessageSource
ç„¶åŽæ³¨å…¥èµ„æºæ–‡äšg(一个åå—䨓basename的属æ€?,然厞®±å¯ä»¥åœ¨Contextä¸ä‹Éç”¨èµ„æºæ–‡ä»¶äº†, 如下ä¸ÞZ¸€ä¸ªé…¾|®ç¤ºä¾? 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\u751Ftest_zh.properties
name =
\u51B0\u96E8
sex =
\u5148\u751Ftest_en_US.properties
name =
ice rain
sex =
male䏋颿˜¯ä¸€ä¸ªç®€å•çš„‹¹‹è¯•¾c?
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); }
}
很简å?˜q™æ ·ž®±å¯ä»¥äº†.
䏋颿¥çœ‹çœ‹Springä¸çš„属性自定义¾~–辑å™?˜q™ä¸ªå’ŒHibernateä¸çš„自定义属性差ä¸å¤š çš? 例如䏋颿ˆ‘们è¦çœ‹åˆîCº†ä¾‹å,æ˜ å°„ä¸€ä¸ªç”µè¯å·ç ?æœ?font size="2">areaCode,prefixå’?number, 如果ä¸ä‹É用自定义属性编辑器那么ž®Þp¦åˆ†åˆ«æ³¨å…¥ä¸Šé¢çš?个代ç ?éºÈƒ¦. 如果使用自定义属性编辑器,直接注入一ä¸?分开的数å—åºåˆ—å°±å¯ä»¥äº?å¦?/p>
888-666-9999
.在下é¢çš„例åä¸çš„Contact.java¾cÀLœ‰ä¸ªPhoneNumber属æ€?里é¢ä¿å˜äº†ä¸Šé¢çš„3个代ç ?两个¾cÈš„代ç 如下:
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();
 Â
}
}
¾l§æ‰¿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的属�/p>
-->
< bean id = "contact" class = "test.propertyEditor.Contact" >
< property name = "phoneNumber" >
< value > 888-666-9999 </ value >
</ property >
</ bean >
</
beans >æœ€åŽæ¥‹¹‹è¯•一下注册的¾l“æžœæ˜¯å¦æ£ç¡®:
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½{?
Spring in Action ½W”è®°(III)
By: icess blog: http://blog.matrix.org.cn/page/icess
˜q™æ¬¡æ¥çœ‹çœ‹ä‹É用Springçš„Hibernateæ¨¡æ¿æ¥æ“作数æ? Springæä¾›äº†Hibernate的一层包è£?使Hibernate使用èµäh¥æ›´åŠ æ–¹ä¾¿,ž®¤å…¶æ˜¯ç»“åˆHibernate Annotationæ—? é…置文äšgæ›´å°‘,¾l´æŠ¤æ›´åŠ ½Ž€å? 䏋颿¥çœ‹çœ‹å§.
䏋颿˜¯ä¸€ä¸ªæµ‹è¯•æ•°æ®å®žä½“ç±»TestData.java å’Œå‰ä¸€½‹‡æåˆ°çš„实体¾cÖM¸€æ ?åªä¸˜q‡ç”¨äº†Annotation注释.Â
packageÂ
test.orm.hibernate.model;
importÂ
javax.persistence.Basic;
importÂ
javax.persistence.Entity;
importÂ
javax.persistence.Id;
importÂ
javax.persistence.Table;
@Entity
@Table(name =Â
"test"
,schema =Â
"APP"
)
public classÂ
TestData {
 Â
private intÂ
id;
 Â
privateÂ
String name;
 Â
publicÂ
TestData(
intÂ
id, String name) {
   Â
this
.id = id;
   Â
this
.name = name;
 Â
}
 Â
publicÂ
TestData()Â {}
 Â
 Â
@Id
 Â
public intÂ
getId()Â {
   Â
returnÂ
id;
 Â
}
 Â
public voidÂ
setId(
intÂ
id)Â {
   Â
this
.id = id;
 Â
}
 Â
@Basic
 Â
publicÂ
String getName() {
   Â
returnÂ
name;
 Â
}
 Â
public voidÂ
setName(String name) {
   Â
this
.name = name;
 Â
}
}
䏋颿˜¯æµ‹è¯•Hibernate模æ¿çš„ç±», TestHibernateTemplate.java
packageÂ
test.orm.hibernate;
importÂ
java.sql.SQLException;
importÂ
org.hibernate.HibernateException;
importÂ
org.hibernate.Session;
importÂ
org.springframework.orm.hibernate3.HibernateCallback;
importÂ
org.springframework.orm.hibernate3.HibernateTemplate;
importÂ
test.orm.hibernate.model.TestData;
public classÂ
TestHibernateTemplate {
 Â
privateÂ
HibernateTemplate hibernateTemplate;
 Â
 Â
publicÂ
TestHibernateTemplate()Â {}
 Â
publicÂ
HibernateTemplate getHibernateTemplate() {
   Â
returnÂ
hibernateTemplate;
 Â
}
 Â
public voidÂ
setHibernateTemplate(HibernateTemplate hibernateTemplate) {
   Â
this
.hibernateTemplate = hibernateTemplate;
 Â
}
 Â
 Â
//‹¹‹è¯•使用HibernateTemplateæ¥æ“作数æ?/font>
 Â
publicÂ
TestData getTestData(
final intÂ
id)Â {
   Â
returnÂ
(TestData)Â hibernateTemplate.execute(
newÂ
HibernateCallback()Â {
     Â
publicÂ
Object doInHibernate(Session s)Â
throwsÂ
HibernateException, SQLException {
       Â
// TODO Auto-generated method stub
       Â
returnÂ
s.get(TestData.class, id);
     Â
}
     Â
   Â
});
 Â
}
//Â Â ä¸Šé¢æŸ¥è¯¢æ•°æ®çš„æ–¹æ³• ä‹É用了HibernateCallBack接å£,对于˜q™æ ·½Ž€å•的查询,å¯ä»¥ä½¿ç”¨ä¸‹é¢ç”±HibernateTemplate æä¾›çš„æ›´½Ž€å•çš„æ–ÒŽ³•
 Â
publicÂ
TestData getTestData2(
final intÂ
id)Â {
   Â
returnÂ
(TestData) hibernateTemplate.get(TestData.class, id);
 Â
}
 Â
/* 如果上é¢çš„两处方法ä‹É用Load æ–ÒŽ³•的时,Â æŠ›å‡ºå»¶è¿ŸåŠ è²å±žæ€§å¼‚å¸? Spring½Ž¡ç†Session的问é¢? 应该是Spring用完Session 然厞®±å…³é—了,
  Â
* 所以ä¸å¯ä»¥å»¶è¿ŸåŠ è², 也就ä¸å¯ä»¥ä‹É用load æ–ÒŽ³•äº?,????? ä¸ÞZ»€ä¹????*/
 Â
 Â
// 其他æ“ä½œæ•°æ®æ–ÒŽ³• å¦? æ’å…¥,修改.... 和ä‹É用Hibernate session 差ä¸å¤? HibernateTemplateåªæ˜¯Session的包è£?/font>
}
å¯ä»¥çœ‹åˆ°ä½¿ç”¨Hibernateæ¨¡æ¿æ¥æ“作数æ?是多么简å?
注æ„: ä¸Šé¢æ³¨é‡Šä¸?æåˆ°äº†åœ¨ä½¿ç”¨Loadæ–ÒŽ³•æ—¶å€?会有问题, Session in view 时候ä‹É用load是ä¸ä¼šå‡ºé—®é¢˜çš? ˜q™é‡ŒSpringæä¾›çš„æ–¹æ³•应该是按照Hibernateçš„è¯ä¹‰å†™çš„å§.
下颞®±æ˜¯ç”¨æ¥‹¹‹è¯•上é¢çš„ç±»æ˜¯å¦æ£å¸¸å·¥ä½œçš„æµ‹è¯•ç±»äº?TestApp.java
packageÂ
test.orm.hibernate;
importÂ
org.springframework.context.ApplicationContext;
importÂ
org.springframework.context.support.ClassPathXmlApplicationContext;
importÂ
test.jdbc.DatabaseUtils;
importÂ
test.orm.hibernate.model.TestData;
public classÂ
TestApp {
 Â
/**
  Â
*Â
@paramÂ
args
  Â
*/
 Â
public static voidÂ
main(String[]Â args)Â {
   Â
// TODO Auto-generated method stub
   Â
DatabaseUtils dataUtils =Â
newÂ
DatabaseUtils();
   Â
dataUtils.connect();
   Â
System.out.println(
"Open database:!"
);
   Â
ApplicationContext context =Â
newÂ
ClassPathXmlApplicationContext(
"test/orm/hibernate/spring-hibernate.xml"
);
   Â
   Â
TestHibernateTemplate hibernateTemplate = (TestHibernateTemplate) context.getBean(
"testDao"
);
   Â
   Â
System.out.println(
"name : "Â
);
   Â
TestData data = hibernateTemplate.getTestData(
9
);
   Â
System.out.println(
"name : "Â
+Â data.getName());
   Â
data = hibernateTemplate.getTestData2(
3
);
   Â
System.out.println(
"name 2: "Â
+Â data.getName());
   Â
   Â
   Â
dataUtils.disconnect();
   Â
 Â
}
}
 
注æ„: 本测试ä¸ç”¨åˆ°äº†ä¸Šä¸€½‹‡ä‹É用到çš?font color="#000000">DatabaseUtils.java 工具¾cÀL¥æ“作Derbyæ•°æ®åº?
ç”?/span>
以上实例å¯ä»¥çœ‹å‡º,在Springä¸ä‹É用Hibernate,效率更高一äº? ä½ ä¸˜q™æ ·è®¤äØ“å?
åŒæ—¶
Spring也æä¾›äº† JDO½{‰å…¶ä»–ä¸€äº›æ•°æ®æ“作框架的包装,使用上基本上 是一æ ïLš„˜q™é‡Œž®×ƒ¸åœ¨è¯¦˜qîCº†.
下一‹Æ¡æˆ‘们æ¥çœ‹çœ‹Springçš„I18N处ç†,和自定义属性编辑器的实çŽ?
By : icess ,æˆ‘çš„éƒ¨è½æ ?http://blog.matrix.org.cn/page/icess
在考试å‰åŒ†åŒ†çœ‹äº†ä¸€éSpring in Action 也没有记录什ä¹?考试¾l“æŸäº?è¦æŠ“ç´§æ—¶é—´æ•´ç†ä¸€ä¸?è¦ä¸ç„¶å°±å¿˜äº†.^_^:
æ•´ç†ä¸€ä¸‹æˆ‘ç›®å‰å¯èƒ½ä¼šç”¨åˆ°çš„æ¨¡å—, 对于那些现在æ ÒŽœ¬ç”¨ä¸åˆ°çš„冬冬˜q˜æ˜¯½{‰æœ‰æ—‰™—´å†ç ”½I¶å§!
½W¬ä¸€ä¸ªå½“然是最¾l典的HelloWorld äº?, 呵呵,½Ž€å?但是说明了原ç?
定义一个æœåŠ¡æŽ¥å?/p>
packageÂ
test.helloworld;
public interfaceÂ
GreetingService {
 Â
public voidÂ
sayGreeting();
}
䏋颿˜¯å…¶å®žçް:
packageÂ
test.helloworld;
public classÂ
GreetingServiceImplÂ
implementsÂ
GreetingService {
 Â
privateÂ
String greeting;
 Â
publicÂ
GreetingServiceImpl()Â {}
 Â
publicÂ
GreetingServiceImpl(String greeting) {
   Â
this
.greeting = greeting;
 Â
}
 Â
public voidÂ
sayGreeting()Â {
   Â
//  Auto-generated method stub
   Â
System.out.println(greeting);
 Â
}
 Â
 Â
public voidÂ
setGreeting(String greeting) {
   Â
this
.greeting = greeting;
 Â
}
}
然厞®±æ˜¯‹¹‹è¯• IoC 的测试代ç ?
packageÂ
test.helloworld;
importÂ
org.springframework.beans.factory.BeanFactory;
importÂ
org.springframework.beans.factory.xml.XmlBeanFactory;
importÂ
org.springframework.context.ApplicationContext;
importÂ
org.springframework.context.support.ClassPathXmlApplicationContext;
importÂ
org.springframework.core.io.FileSystemResource;
public classÂ
HelloApp {
 Â
/**
  Â
*Â
@paramÂ
args
  Â
*/
 Â
public static voidÂ
main(String[]Â args)Â {
   Â
// TODO Auto-generated method stub
//    BeanFactory factory;
//    factory = new XmlBeanFactory(new FileSystemResource("src/test/helloworld/hello.xml"));
   Â
// 使用ä¸åŒçš„æ–¹æ³•得到bean. (BeanFactory or ApplicationContext)
   Â
ApplicationContext context =Â
newÂ
ClassPathXmlApplicationContext(
"test/helloworld/hello.xml"
);
   Â
   Â
   Â
GreetingService greetingService = (GreetingService) context.getBean(
"greetingService"
);
//    GreetingService greetingService = (GreetingService) factory.getBean("greetingService");
   Â
greetingService.sayGreeting();
 Â
}
}
˜q˜æœ‰é‡è¦çš„é…¾|®æ–‡ä»¶å¦‚ä¸?hello.xml
<?
xml version = "1.0" encoding = "UTF-8" ?><!
DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd" >
<
beans >< bean id = "greetingService" class = "test.helloworld.GreetingServiceImpl" >
< property name = "greeting" >
< value > ice rain ! </ value >
</ property >
</ bean >
</
beans >呵呵ž®Þp¿™ä¹ˆç®€å?实现äº?greeting 属性的 Ioc.
˜q™æ˜¯Spring 两大基本支柱其一的工作原ç? 关于AoP的内å®?在这里ä¸ä½œè®¨è®?å› äØ“çŽ°åœ¨æˆ‘ä‹É用AoPçš„åœ°æ–¹ä¸æ˜¯å¾ˆå¤?½Ž€å•的应用是很½Ž€å•çš„å•?^_^.
下é¢ä¸€½‹‡æˆ‘们æ¥çœ‹çœ‹ 在spring包装下的jdbc讉K—®. 详细情况也å¯ä»?b>å‚考这é‡?/a>