锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
聽 BY: icess Blog: http://blog.matrix.org.cn/page/icess聽
聽聽 鍦⊿pring涓鐞咺18N闂鍜屼嬌鐢↗ava閲岄潰鐨勭被鍩烘湰涓婃槸涓鏍風殑.浣跨敤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\u751Ftest_zh.properties
name =
\u51B0\u96E8
sex =
\u5148\u751Ftest_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);聽 }
}
寰堢畝鍗?榪欐牱灝卞彲浠ヤ簡.
涓嬮潰鏉ョ湅鐪婼pring涓殑灞炴ц嚜瀹氫箟緙栬緫鍣?榪欎釜鍜孒ibernate涓殑鑷畾涔夊睘鎬у樊涓嶅 鐨? 渚嬪涓嬮潰鎴戜滑瑕佺湅鍒頒簡渚嬪瓙,鏄犲皠涓涓數璇濆彿鐮?鏈?font size="2">areaCode,prefix鍜?number, 濡傛灉涓嶄嬌鐢ㄨ嚜瀹氫箟灞炴х紪杈戝櫒閭d箞灝辮鍒嗗埆娉ㄥ叆涓婇潰鐨?涓唬鐮?楹葷儲. 濡傛灉浣跨敤鑷畾涔夊睘鎬х紪杈戝櫒,鐩存帴娉ㄥ叆涓涓?鍒嗗紑鐨勬暟瀛楀簭鍒楀氨鍙互浜?濡?/p>
888-666-9999
.鍦ㄤ笅闈㈢殑渚嬪瓙涓殑Contact.java綾繪湁涓狿honeNumber灞炴?閲岄潰淇濆瓨浜嗕笂闈㈢殑3涓唬鐮?涓や釜綾葷殑浠g爜濡備笅:
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;
聽聽
}
}
鐒跺悗瀹氫箟涓涓敤鏉ョ紪杈慞honeNumber鐨勭紪杈戝櫒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鐨勫疄鐜? 闇瑕佹敞鍐屼竴涓狿honeNumber鐨刡ean,璁劇疆鍏跺睘鎬х劧鍚庡啀娉ㄥ唽
Contact鐨凱honeNumber鐨勫睘鎬?/p>
-->
< bean id = "contact" class = "test.propertyEditor.Contact" >
< property name = "phoneNumber" >
< value > 888-666-9999 </ value >
</ property >
</ bean >
</
beans >鏈鍚庢潵嫻嬭瘯涓涓嬫敞鍐岀殑緇撴灉鏄惁姝g‘:
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鎻愪緵鐨勪竴涓嬫瘮杈冩湁鎰忔濈殑鍔熻兘.濡傚畾鏃?鍙戦丒mail絳?
Spring in Action 絎旇(III)
By: icess blog: http://blog.matrix.org.cn/page/icess
榪欐鏉ョ湅鐪嬩嬌鐢⊿pring鐨凥ibernate妯℃澘鏉ユ搷浣滄暟鎹? Spring鎻愪緵浜咹ibernate鐨勪竴灞傚寘瑁?浣縃ibernate浣跨敤璧鋒潵鏇村姞鏂逛究,灝ゅ叾鏄粨鍚圚ibernate Annotation鏃? 閰嶇疆鏂囦歡鏇村皯,緇存姢鏇村姞綆鍗? 涓嬮潰鏉ョ湅鐪嬪惂.
涓嬮潰鏄竴涓祴璇曟暟鎹疄浣撶被TestData.java 鍜屽墠涓綃囨彁鍒扮殑瀹炰綋綾諱竴鏍?鍙笉榪囩敤浜咥nnotation娉ㄩ噴.聽
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;
聽聽
}
}
涓嬮潰鏄祴璇旽ibernate妯℃澘鐨勭被, 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鎺ュ彛,瀵逛簬榪欐牱綆鍗曠殑鏌ヨ,鍙互浣跨敤涓嬮潰鐢盚ibernateTemplate聽鎻愪緵鐨勬洿綆鍗曠殑鏂規硶
聽聽
public聽
TestData聽getTestData2(
final聽int聽
id)聽{
聽聽聽聽
return聽
(TestData)聽hibernateTemplate.get(TestData.class,聽id);
聽聽
}
聽聽
/*聽濡傛灉涓婇潰鐨勪袱澶勬柟娉曚嬌鐢↙oad聽鏂規硶鐨勬椂,聽鎶涘嚭寤惰繜鍔犺澆灞炴у紓甯?聽Spring綆$悊Session鐨勯棶棰?聽搴旇鏄疭pring鐢ㄥ畬Session聽鐒跺悗灝卞叧闂簡,
聽聽聽
*聽鎵浠ヤ笉鍙互寤惰繜鍔犺澆,聽涔熷氨涓嶅彲浠ヤ嬌鐢╨oad聽鏂規硶浜?,?????聽涓轟粈涔????*/
聽聽
聽聽
//聽鍏朵粬鎿嶄綔鏁版嵁鏂規硶聽濡?聽鎻掑叆,淇敼....聽鍜屼嬌鐢℉ibernate聽session聽宸笉澶?聽HibernateTemplate鍙槸Session鐨勫寘瑁?/font>
}
鍙互鐪嬪埌浣跨敤Hibernate妯℃澘鏉ユ搷浣滄暟鎹?鏄涔堢畝鍗?
娉ㄦ剰: 涓婇潰娉ㄩ噴涓?鎻愬埌浜嗗湪浣跨敤Load鏂規硶鏃跺?浼氭湁闂, Session in view 鏃跺欎嬌鐢╨oad鏄笉浼氬嚭闂鐨? 榪欓噷Spring鎻愪緵鐨勬柟娉曞簲璇ユ槸鎸夌収Hibernate鐨勮涔夊啓鐨勫惂.
涓嬮潰灝辨槸鐢ㄦ潵嫻嬭瘯涓婇潰鐨勭被鏄惁姝e父宸ヤ綔鐨勬祴璇曠被浜?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 宸ュ叿綾繪潵鎿嶄綔Derby鏁版嵁搴?
鐢?/span>
浠ヤ笂瀹炰緥鍙互鐪嬪嚭,鍦⊿pring涓嬌鐢℉ibernate,鏁堢巼鏇撮珮涓浜? 浣犱笉榪欐牱璁や負鍚?
鍚屾椂
Spring涔熸彁渚涗簡 JDO絳夊叾浠栦竴浜涙暟鎹搷浣滄鏋剁殑鍖呰,浣跨敤涓婂熀鏈笂聽鏄竴鏍風殑榪欓噷灝變笉鍦ㄨ榪頒簡.
涓嬩竴嬈℃垜浠潵鐪嬬湅Spring鐨処18N澶勭悊,鍜岃嚜瀹氫箟灞炴х紪杈戝櫒鐨勫疄鐜?
By : icess ,鎴戠殑閮ㄨ惤鏍?http://blog.matrix.org.cn/page/icess
鍦ㄨ冭瘯鍓嶅寙鍖嗙湅浜嗕竴閬峉pring in Action 涔熸病鏈夎褰曚粈涔?鑰冭瘯緇撴潫浜?瑕佹姄绱ф椂闂存暣鐞嗕竴涓?瑕佷笉鐒跺氨蹇樹簡.^_^:
鏁寸悊涓涓嬫垜鐩墠鍙兘浼氱敤鍒扮殑妯″潡, 瀵逛簬閭d簺鐜板湪鏍規湰鐢ㄤ笉鍒扮殑鍐啲榪樻槸絳夋湁鏃墮棿鍐嶇爺絀跺惂!
絎竴涓綋鐒舵槸鏈緇忓吀鐨凥elloWorld 浜?, 鍛靛懙,綆鍗?浣嗘槸璇存槑浜嗗師鐞?
瀹氫箟涓涓湇鍔℃帴鍙?/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"));
聽聽聽聽
//聽浣跨敤涓嶅悓鐨勬柟娉曞緱鍒癰ean.聽(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();
聽聽
}
}
榪樻湁閲嶈鐨勯厤緗枃浠跺涓?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 >鍛靛懙灝辮繖涔堢畝鍗?瀹炵幇浜?greeting 灞炴х殑 Ioc.
榪欐槸Spring 涓ゅぇ鍩烘湰鏀煴鍏朵竴鐨勫伐浣滃師鐞? 鍏充簬AoP鐨勫唴瀹?鍦ㄨ繖閲屼笉浣滆璁?鍥犱負鐜板湪鎴戜嬌鐢ˋoP鐨勫湴鏂逛笉鏄緢澶?綆鍗曠殑搴旂敤鏄緢綆鍗曠殑鍟?^_^.
涓嬮潰涓綃囨垜浠潵鐪嬬湅 鍦╯pring鍖呰涓嬬殑jdbc璁塊棶. 璇︾粏鎯呭喌涔熷彲浠?b>鍙傝冭繖閲?/a>