锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
鐪嬬湅Hibernate Validator 鏄庝箞鍋氱殑鍚?涓瑙佸埌濂?鐩鎬俊浣犲氨浼氳: Oh God, 榪欏氨鏄垜闇瑕佺殑.
浠諱綍鑾峰緱Matrix鎺堟潈鐨勭綉绔欙紝杞澆璇蜂繚鐣欎互涓嬩綔鑰呬俊鎭拰閾炬帴錛?/span>
浣滆咃細icess(浣滆呯殑blog:http://blog.matrix.org.cn/page/icess)
鍏抽敭瀛楋細Hibernate Validator
鐢ˋnnotations 緇欑被鎴栬呯被鐨勫睘鎬у姞涓婄害鏉?constraint),鍦ㄨ繍琛屾湡媯鏌ュ睘鎬у兼槸寰堜紭闆呯殑.Hibernate Validator灝辨槸榪欐牱鐨勪竴涓鏋?璇ユ鏋舵槸鍗佸垎瀹規槗鐨?灝卞儚鍙傝冩枃妗d腑瀹gО鐨勯偅鏍?,鍑犱箮娌℃湁浠涔堝涔犳洸綰?Validator 鏄竴涓獙璇佹鏋?涓嶉渶瑕佸拰Hibernate鐨勫叾浠栭儴鍒嗙粦瀹氬氨鍙互浣跨敤,鍙鍦ㄤ綘鐨勯」鐩腑娣誨姞Hibernate-annotations.jar搴撳氨鍙互浜?閭d箞涓嬮潰灝辮鎴戜滑鐪嬬湅鎬庝箞浣跨敤鍚?
Person.java 綾?/font>
/*
聽
*聽Created聽on聽2006-1-12 Person.java
聽
*聽@author聽
聽
*/
package聽
test.annotation.validator;
import聽
org.hibernate.validator.Length;
import聽
org.hibernate.validator.Min;
import聽
org.hibernate.validator.Valid;
銆
//@Serializability聽 //嫻嬭瘯鑷畾涔夌害鏉?/font>
public聽class聽
Person聽{
聽聽
private聽
String聽name;
聽聽
private聽int聽
age;
聽聽
private聽
Address聽address;
聽聽
聽聽
public聽
Person()聽{}
聽聽
聽聽
@Valid //娉ㄦ剰姝ゅ
聽聽
public聽
Address聽getAddress()聽{
聽聽聽聽
return聽
address;
聽聽
}
聽聽
public聽void聽
setAddress(Address聽address)聽{
聽聽聽聽
this
.address聽=聽address;
聽聽
}
聽聽
聽聽
@Min(value聽=聽
1
)
聽聽
public聽int聽
getAge()聽{
聽聽聽聽
return聽
age;
聽聽
}
聽聽
public聽void聽
setAge(
int聽
age)聽{
聽聽聽聽
this
.age聽=聽age;
聽聽
}
聽聽
聽聽
@Length(min聽=聽
4
)
聽聽
public聽
String聽getName()聽{
聽聽聽聽
return聽
name;
聽聽
}
聽聽
public聽void聽
setName(String聽name)聽{
聽聽聽聽
this
.name聽=聽name;
聽聽
}
}
銆
Address.java 綾?/font>
/*
聽
*聽Created聽on聽2006-1-12 Address.java
聽
*聽@author聽
聽
*/
package聽
test.annotation.validator;
import聽
org.hibernate.validator.Length;
import聽
org.hibernate.validator.Max;
import聽
org.hibernate.validator.Min;
public聽class聽
Address聽{
聽聽
private聽
String聽street;
聽聽
private聽int聽
num;
聽聽
聽聽
public聽
Address()聽{}
聽聽
聽聽
@Min(value聽=聽
1
)
聽聽
@Max(value聽=聽
100
)
聽聽
public聽int聽
getNum()聽{
聽聽聽聽
return聽
num;
聽聽
}
聽聽
public聽void聽
setNum(
int聽
num)聽{
聽聽聽聽
this
.num聽=聽num;
聽聽
}
聽聽
聽聽
@Length(min聽=聽
3
,max聽=聽
8
)
聽聽
public聽
String聽getStreet()聽{
聽聽聽聽
return聽
street;
聽聽
}
聽聽
public聽void聽
setStreet(String聽street)聽{
聽聽聽聽
this
.street聽=聽street;
聽聽
}
}
涓婇潰鏄袱涓敤 Validator Annotations 娉ㄩ噴鐨?綾? 姣忎釜灞炴ч兘鐢?綰︽潫闄愬埗浜?聽 涓嬮潰鐪嬬湅嫻嬭瘯鐨勭被鍚?
TestValidator.java 綾?/code>
/*
聽
*聽Created聽on聽2006-1-12
聽
*聽@author聽icerain
聽
*/
package聽
test.annotation.validator;
import聽
org.hibernate.validator.ClassValidator;
import聽
org.hibernate.validator.InvalidValue;
public聽class聽
TestValidator聽{
聽聽
public聽void聽
test()聽{
聽聽聽聽
Address聽add聽=聽
new聽
Address();
聽聽聽聽
add.setNum(
0
);
聽聽聽聽
add.setStreet(
"1"
);
聽聽聽聽
聽聽聽聽
Person聽p聽=聽
new聽
Person();
聽聽聽聽
p.setAddress(add);
聽聽聽聽
p.setAge(
0
);
聽聽聽聽
p.setName(
"ice"
);
聽聽聽聽
聽聽聽聽
/******************Test聽validator聽********/
聽聽聽
// 娉ㄦ剰璇ュ鍙獙璇佷簡Person 涓轟簡璇存槑 @Valid 娉ㄩ噴鐨勪嬌鐢?/font>
聽聽聽聽
ClassValidator<Person>聽classValidator聽=聽
new聽
ClassValidator<Person>聽(Person.
class
);
聽聽聽聽
InvalidValue[]聽validMessages聽=聽classValidator.getInvalidValues(p);
聽聽聽聽
for聽
(InvalidValue聽value聽:聽validMessages)聽{
聽聽聽聽聽聽
聽聽聽聽
System.out.println(
"InvalidValue聽鐨勯暱搴︽槸:"聽
+聽validMessages.length
聽聽聽聽聽聽聽聽
+
"聽.聽楠岃瘉娑堟伅鏄?聽"聽
+聽value.getMessage()聽
聽聽聽聽聽聽聽聽
+聽
"聽.聽PropertyPath聽鏄?"聽
+聽value.getPropertyPath()
聽聽聽聽聽聽聽聽
+
"聽.\n\t聽PropertyName聽鏄?聽"聽
+value.getPropertyName()
聽聽聽聽聽聽聽聽
+聽
"Value聽鏄?聽"聽
+聽value.getValue()
聽聽聽聽聽聽聽聽
+
"聽Bean聽鏄?聽"
+聽value.getBean()
聽聽聽聽聽聽聽聽
+
"\n\t聽BeanClass聽鏄?"聽
+聽value.getBeanClass());
聽聽聽聽
}
聽聽
}
聽聽
聽聽
public聽static聽void聽
main(String[]聽args)聽{
聽聽聽聽
new聽
TestValidator().test();
聽聽
}
}
銆
紼嬪簭鐨勮緭鍑哄涓? InvalidValue 鐨勯暱搴︽槸:4 . 楠岃瘉娑堟伅鏄? 蹇呴』澶т簬絳変簬 1 . PropertyPath 鏄?age . PropertyName 鏄? age. Value 鏄? 0 Bean 鏄? test.annotation.validator.Person@dd87b2 BeanClass 鏄?class test.annotation.validator.Person InvalidValue 鐨勯暱搴︽槸:4 . 楠岃瘉娑堟伅鏄? 闀垮害蹇呴』浠嬩簬 4 涓?2147483647 涔嬮棿 . PropertyPath 鏄?name . PropertyName 鏄? name. Value 鏄? ice Bean 鏄? test.annotation.validator.Person@dd87b2 BeanClass 鏄?class test.annotation.validator.Person InvalidValue 鐨勯暱搴︽槸:4 . 楠岃瘉娑堟伅鏄? 蹇呴』澶т簬絳変簬 1 . PropertyPath 鏄?address.num . PropertyName 鏄? num. Value 鏄? 0 Bean 鏄? test.annotation.validator.Address@197d257 BeanClass 鏄?class test.annotation.validator.Address InvalidValue 鐨勯暱搴︽槸:4 . 楠岃瘉娑堟伅鏄? 闀垮害蹇呴』浠嬩簬 3 涓?8 涔嬮棿 . PropertyPath 鏄?address.street . PropertyName 鏄? street. Value 鏄? 1 Bean 鏄? test.annotation.validator.Address@197d257 BeanClass 鏄?class test.annotation.validator.Address 鍙互鐪嬪嚭涓嶆弧瓚崇害鏉熺殑鍊奸兘琚寚鍑轟簡. 鍚屾椂璇ュ彞: 鎴戜滑鍙獙璇佷簡 Person. 鍦≒erson閲岄潰鐨凙ddress鐨勫睘鎬?鐢變簬鏈?code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New',Courier">@Valid Annotations 鎵浠?Address鐨勭浉鍏沖睘鎬т篃琚満鑱旈獙璇佷簡 . InvalidValue 鐨勯暱搴︽槸:2 . 楠岃瘉娑堟伅鏄? 蹇呴』澶т簬絳変簬 1 . PropertyPath 鏄?age . PropertyName 鏄? age. Value 鏄? 0 Bean 鏄? test.annotation.validator.Person@18fef3d BeanClass 鏄?class test.annotation.validator.Person InvalidValue 鐨勯暱搴︽槸:2 . 楠岃瘉娑堟伅鏄? 闀垮害蹇呴』浠嬩簬 4 涓?2147483647 涔嬮棿 . PropertyPath 鏄?name . PropertyName 鏄? name. Value 鏄? ice Bean 鏄? test.annotation.validator.Person@18fef3d BeanClass 鏄?class test.annotation.validator.PersonClassValidator<Person>聽classValidator聽=聽new聽ClassValidator<Person>聽(Person.class);
濡傛灉 鎶?/span>
@Valid Annotations 鍘繪帀,緇撴灉濡備笅:
鍙互鐪嬪嚭 娌℃湁楠岃瘉 Address.
褰撶劧浜?,浣犺繕鍙互鍙獙璇佷竴涓睘鎬?, 娌℃湁蹇呰楠岃瘉鏁翠釜綾?鍙渶瑕佸湪璋冪敤
classValidator.getInvalidValues(p,"age")鏂規硶鏃?鍔犱笂浣犺楠岃瘉鐨勫睘鎬у氨鍙互浜?濡傛垜浠彧鎯抽獙璇乤ge 灞炴?鎶婁唬鐮佹敼涓哄涓嬫墍紺?
InvalidValue[] validMessages = classValidator.getInvalidValues(p,"age"); /
/鍙獙璇乤ge 灞炴?/font>
榪愯緇撴灉濡備笅:
InvalidValue 鐨勯暱搴︽槸:1 . 楠岃瘉娑堟伅鏄? 蹇呴』澶т簬絳変簬 1 . PropertyPath 鏄?age .
PropertyName 鏄? age. Value 鏄? 0 Bean 鏄? test.annotation.validator.Person@1457cb
BeanClass 鏄?class test.annotation.validator.Person
鍙槸楠岃瘉浜?age 灞炴?
鎬庝箞鏍?,寰堢畝鍗曞惂. 鍏充簬 Hibernate Validator 鍐呭緩鐨勯獙璇丄nnotations 澶у鍙互鐪嬬湅 API 鎴栬?鍙傝冩枃妗?涓枃鐗堟垜姝e湪緲昏瘧涓?璇瘋闂垜鐨?Blog 鑾峰緱鏈鏂頒俊鎭?.
濡傛灉浣犺鍐欒嚜宸辯殑綰︽潫鍛?, 浣犱笉鐢ㄦ媴蹇?,榪欎篃鏄緢瀹規槗鐨?
浠諱綍綰︽潫鏈変袱閮ㄥ垎緇勬垚: [綰︽潫鎻忚堪絎?鍗蟲敞閲奭the constraint descriptor (the annotation) 鍜孾綰︽潫validator 鍗?瀹炵幇綾籡 the constraint validator (the implementation class).涓嬮潰鎴戜滑鎵╁睍Hibernate Test suit 涓殑涓涓猅est 鏉ヨ瑙d竴涓?
棣栧厛: 瑕佸0鏄庝竴涓?/span>
constraint descriptor .濡備笅:
package聽
test.annotation.validator;
import聽
java.lang.annotation.Documented;
import聽static聽
java.lang.annotation.ElementType.TYPE;
import聽static聽
java.lang.annotation.ElementType.FIELD;
import聽static聽
java.lang.annotation.ElementType.METHOD;
import聽
java.lang.annotation.Retention;
import聽static聽
java.lang.annotation.RetentionPolicy.RUNTIME;
import聽
java.lang.annotation.Target;
import聽
org.hibernate.validator.ValidatorClass;
/**
聽
*聽Dummy聽sample聽of聽a聽bean-level聽validation聽annotation
聽
*
聽
*聽
@author聽
Emmanuel聽Bernard
聽
*/
@ValidatorClass(SerializabilityValidator.
class
)
@Target({METHOD,FIELD,TYPE})
@Retention(RUNTIME)
@Documented
public聽
@interface聽Serializability聽{
聽聽
int聽
num()聽
default聽
11
;
聽聽
String聽message()聽
default聽
"bean聽must聽be聽serialiable"
;
}
@ValidatorClass(SerializabilityValidator.
class
) 鎸囧嚭浜?
constraint validator 綾?
@Target({METHOD,FIELD,TYPE})
@Retention(RUNTIME)
@Documented聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽
榪欏嚑涓垜灝變笉鐢ㄨВ閲婁簡鍚?
Serializability聽閲岄潰澹版槑浜嗕竴涓?message 鏄劇ず綰︽潫鐨勬彁紺轟俊鎭? num 鍙槸涓轟簡璇存槑涓涓柟闈?鍦ㄨ繖閲岄潰娌℃湁瀹為檯鐢ㄩ旂敤 .
鐒跺悗灝辨槸 瀹炵幇涓涓?/span>
constraint validator 綾?璇ョ被瑕佸疄鐜?/span>Validator<ConstraintAnnotation>.榪欓噷鏄?/span>SerializabilityValidator.java 濡備笅:
//$Id:聽SerializabilityValidator.java,v聽1.3聽2005/11/17聽18:12:11聽epbernard聽Exp聽$
constraint descriptor 閲岄潰鐨勫睘鎬?濡備笂闈㈡垜浠0鏄庣殑 num
package聽
test.annotation.validator;
import聽
java.io.Serializable;
import聽
org.hibernate.validator.Validator;
/**
聽
*聽Sample聽of聽a聽bean-level聽validator
聽
*
聽
*聽
@author聽
Emmanuel聽Bernard
聽
*/
public聽class聽
SerializabilityValidator聽
implements聽
Validator<Serializability>,聽Serializable聽{
聽聽
public聽boolean聽
isValid(Object聽value)聽{
聽聽聽
//榪欓噷鍙槸Validator 閲岄潰鐨?瀹炵幇楠岃瘉瑙勫垯鐨?鏂規硶. value 鏄楠岃瘉鐨勫?
聽聽聽聽
System.out.println(
"IN聽SerializabilityValidator聽isValid:"
+value.getClass()+
":聽"聽
+value.toString());
聽聽聽聽
return聽
value聽instanceof聽Serializable;
聽聽}
聽聽public聽void聽initialize(Serializability聽parameters)聽{
聽聽聽聽//聽鍦ㄨ繖閲屽彲浠?鍙栧緱
聽聽聽聽
System.out.println(
"IN聽SerializabilityValidator:聽parameters:"
+聽parameters.num()聽);
聽聽
}
}
鐒跺悗鍦ㄤ綘鐨勭被涓簲鐢ˊSerializability聽 灝卞彲浠ョ害鏉熶竴涓被瀹炵幇
Serializable 鎺ュ彛浜? 濡備笅:
鍦ㄦ垜浠殑Person.java綾?娣誨姞@Serializability聽 Annotations ,鎶奝erson.java 涓殑
//@Serializability //嫻嬭瘯鑷畾涔夌害鏉?娉ㄩ噴鍘繪帀灝眔k浜?
InvalidValue 鐨勯暱搴︽槸:3 . 楠岃瘉娑堟伅鏄?
bean must be serialiable
. PropertyPath 鏄?null .
PropertyName 鏄? null. Value 鏄? test.annotation.validator.Person@1a73d3c Bean 鏄? test.annotation.validator.Person@1a73d3c
BeanClass 鏄?class test.annotation.validator.Person
榪愯緇撴灉濡備笅:
鐜板湪鎶奝erson綾誨疄鐜?java.io.Serializable 鎺ュ彛 鍒欐病鏈夊嚭鐜?楠岃瘉閿欒娑堟伅.
娑堟伅鐨勫浗闄呭寲涔熸槸寰堢畝鍗曠殑,鎶?/span>
Serializability聽 涓殑message 鏀逛負浠}鎵╀綇鐨?灞炴ф枃浠剁殑Key灝卞彲浠ヤ簡
public聽
@interface聽Serializability聽{
聽聽
int聽
num()聽
default聽
11
;
聽聽
String聽message()聽
default聽
"{Serializable}";
//"bean聽must聽be聽serialiable";
//娑堟伅鐨勫浗闄呭寲
}
鐒跺悗緙栬緫璧勬枡鏂囦歡. 娉ㄦ剰 璇ヨ祫婧愭枃浠朵腑瑕佸寘鎷?Hibernate Validator 鍐呭緩鐨勮祫婧? 鍙互鍦ㄨorg\hibernate\validator\resources 鍖呴噷闈㈢殑璧勬簮鏂囦歡鍩虹涓婁慨鏀?,鍦ㄦ墦鍖呴噷闈?榪欐牱灝卞彲浠ヤ簡. 鑷繁鎵撳寘鍙兘涓嶅お鏂逛究.浣犲彲浠ユ妸璇ュ寘閲岄潰鐨勬枃浠跺鍒跺嚭鏉?鐒跺悗鏀懼埌浣犺嚜宸辯殑欏圭洰鍖呬笅鍦ㄨ嚜宸辯紪杈? 璇ユ祴璇曚腑 鎴戞槸鏀懼湪 test\resources 鍖呬笅鐨?
鐒跺悗鍦?璧勬簮鏂囦歡涓坊鍔?
Serializable = '''''' 榪欎箞涓琛? 鏍蜂緥濡備笅:
#DefaultValidatorMessages.properties (DefaultValidatorMessages_zh.properties 涓嶅啀鍒楀嚭^_^)
銆
#涓嬮潰鏄?Hibernate Validator 鍐呭緩鐨勫浗闄呭寲娑堟伅
validator.assertFalse= assertion failed
validator.assertTrue= assertion failed
validator.future= must be a future date
validator.length= length must be between {min} and {max}
validator.max= must be less than or equal to {value}
validator.min= must be greater than or equal to {value}
validator.notNull= may not be null
validator.past= must be a past date
validator.pattern= must match "{regex}"
validator.range= must be between {min} and {max}
validator.size= size must be between {min} and {max}
#涓嬮潰鏄嚜瀹氫箟鐨勬秷鎭?/font>
Serializable= Bean not Serializable聽 //鍔犱笂鑷繁瀹氫箟鐨勫浗闄呭寲娑堟伅.
鍦ㄦ瀯閫?/span>
ClassValidator
鏃惰娣諱笂 璧勬簮鏂囦歡 濡備笅:(鍦ㄦ祴璇曠被涓?
ClassValidator<Person> classValidator = new ClassValidator<Person> (Person.class,ResourceBundle.getBundle("test.resources.DefaultValidatorMessages"));//鍔犺澆璧勬簮
榪欐牱灝卞彲浠ヤ簡 .聽 褰撶劧 浣犺繕鍙互 鏇存敼 Hibernate Validator 鐨勬秷鎭?涓嶆槸鍦ㄤ笂闈㈢殑璧勬簮鏂囦歡涓洿鎺ヤ慨鏀?/font>
validator.length = ... 絳夌瓑
) , 榪樿寰?Validator 娉ㄩ噴涓湁涓?message 鍏冪礌鍚? 浣犱互鍓嶇敤鐨勯兘鏄粯璁ゅ?鐜板湪浣犲彲浠ヨ涓轟綘鑷繁瀹氫箟鐨勪簡.
濡?validator.length 鎴戞妸浠栨敼涓?"璇ュ瓧絎︿覆鐨勯暱搴︿笉絎﹀悎瑙勫畾鑼冨洿鑼冨洿". 鍦ㄨ祫婧愭枃浠朵腑娣誨姞涓琛岄敭鍊煎睘鎬у(key瀹氫箟涓?"myMsg")濡備笅:
myMsg=璇ュ瓧絎︿覆鐨勯暱搴︿笉絎﹀悎瑙勫畾鑼冨洿鑼冨洿
騫朵笖榪樿鍦?/font> @Length 娉ㄩ噴涓彁渚沵essage鐨勫紩鐢ㄧ殑key 濡備笅 @Length(min = 4,message = "{ myMsg }")
鍐嶄竴嬈¤繍琛屾祴璇?,鎴戜滑灝卞彲浠ョ湅鍒頒笂闈袱鏉¤嚜瀹氫箟緇戝畾鐨勬秷鎭簡 .濡備笅:
InvalidValue 鐨勯暱搴︽槸:3 . 楠岃瘉娑堟伅鏄?/font>: Bean 涓嶆槸 鍙?Serializable . PropertyPath 鏄?null .
PropertyName 鏄? null. Value 鏄? test.annotation.validator.Person@1bd4722 Bean 鏄? test.annotation.validator.Person@1bd4722
BeanClass 鏄?class test.annotation.validator.Person
InvalidValue 鐨勯暱搴︽槸:3 . 楠岃瘉娑堟伅鏄?/font>: 璇ュ瓧絎︿覆鐨勯暱搴︿笉絎﹀悎瑙勫畾鑼冨洿鑼冨洿 . PropertyPath 鏄?name .
PropertyName 鏄? name. Value 鏄? ice Bean 鏄? test.annotation.validator.Person@1bd4722
BeanClass 鏄?class test.annotation.validator.Person
鎬庝箞鏍?姣斾綘鎯寵薄鐨勭畝鍗曞惂.
OK 涓婇潰鎴戜滑璁ㄨ浜?
Hibernate Validator 鐨勪富瑕佺敤娉? 浣嗘槸 璇ユ鏋舵湁浠涔堢敤鍛? ^_^
鐪嬪埌榪欓噷鍏跺疄涓嶇敤鎴戝湪澶氳浜?澶у閮界煡閬撴庝箞鐢?浠涔堟椂鍊欑敤. 浣滀負涓綃囦粙緇嶆ф枃绔犳垜榪樻槸鍦ㄦ緇欏嚭涓涓渶甯哥敤鐨勪緥瀛愬惂,鏇村ソ鐨勪嬌鐢ㄦ柟寮忓ぇ瀹舵參鎱㈡寲鎺樺惂.
姣斿 : 浣犵幇鍦ㄥ湪寮鍙戜竴涓漢鍔涜祫婧?HR)緋葷粺 (鍏跺疄鏄垜浠珽RP璇劇▼鐨勪竴涓綔涓?^_^), 閲岄潰瑕佸鐞嗗ぇ閲忕殑鏁版嵁,灝ゅ叾鏄湪杈撳叆鍚勭璧勬枡鏃?濡?鐧昏鍛樺伐淇℃伅. 濡傛灉浣犲叕鍙哥殑鍛樺伐鐨勫勾榫勮姹傛槸18 -- 60 閭d箞浣犳墍杈撳叆鐨勫勾榫勫氨涓嶈兘瓚呭嚭榪欎釜鑼冨洿. 浣犲彲鑳戒細璇磋繖寰堝鏄撳晩 , 涓嶇敤Validator灝卞彲浠ヨВ鍐沖晩.榪欎繚鎸佹暟鎹墠楠岃瘉灝卞彲浠ュ暒 濡俰f ( e.getAge() > 60 || e.getAge() < 18 ) ........ 緇欏嚭閿欒淇℃伅 鐒跺悗鎻愮ず閲嶆柊杈撳叆涓嶅氨OK鍟?鐢ㄥ緱鐫 鍏村笀鍔ㄤ紬鐨勬潵涓涓夋柟妗嗘灦鍚?
鏄晩 褰撳氨楠岃瘉榪欎竴涓睘鎬ф椂, 娌℃湁蹇呰鍟?! 浣嗘槸涓涓湡姝g殑HR 緋葷粺,浼氬彧鏈変竴涓睘鎬ц楠岃瘉鍚? 鎭愭曡鏈塏澶氬惂
浣犺鏄瘡涓涓兘閭f牱 鍐欎竴孌甸獙璇佷唬鐮?鏄笉鏄緢鐑﹀晩 ,鍐典笖涔熶笉鏂逛究浠g爜閲嶇敤. 鐜板湪鑰冭檻涓浜?Validator 鏄笉鏄洿楂樻晥鍟?鎷︽埅鍒?綰︽潫榪濅緥鐨?灞炴?灝卞彲浠ョ洿鎺ュ緱鍒?鍥介檯鍖栫殑娑堟伅 鍙互鎶婅娑堟伅鏄劇ず鍒頒竴涓脊鍑哄璇濇涓?鎻愮ず鏇存聽 !
Validator鐨勭敤澶勪笉鍙繖涓縐?,浣犲彲浠ユ兂鍒板浣曠敤鍛?! 嬈㈣繋鍙戣〃浣犵殑楂樿!!
OK 鍒版 鎴戜滑鐨?Hibernate Validator 涔嬫梾灝辮鍏堝憡涓孌佃惤浜?. 甯屾湜榪欐槸浠や綘蹇冩椃紲炴$殑涓嬈″瘨鍐箣鏃?
鎶婁綘瀛﹀埌鐨勫簲鐢ㄥ埌浣犵殑欏圭洰涓惂,涓瀹氫細鎻愰珮浣犵殑鐢熶駭鐜囩殑. 鐩鎬俊鎴?,娌¢敊鐨劼?^_^ !
浠諱綍鑾峰緱Matrix鎺堟潈鐨勭綉绔欙紝杞澆璇蜂繚鐣欎互涓嬩綔鑰呬俊鎭拰閾炬帴錛?/span>
浣滆咃細icess(浣滆呯殑blog:http://blog.matrix.org.cn/page/icess)
鍏抽敭瀛楋細Hibernate Validator
鎴戝湪鍓嶉潰涓綃囨枃绔?lt;Hibernate Annotations 瀹炴垬-- 浠?hbm.xml 鍒?Annotations>:
涓?鏈夊緢澶氬紑鍙戣呭湪璋堣涓彁鍒?鏈夋病鏈夊繀瑕佷粠 hbm.xml 寰 Annotations 涓婅漿縐? 閭d箞鍦ㄨ繖綃囨枃绔犱腑鎴戜滑灝辨潵璁ㄨ涓涓?hbm.xml 涓?Annotations鐨勪紭緙虹偣,鐪嬬湅閭g鎯呭喌鏈閫傚悎浣?
棣栧厛,璁ㄨ涓涓?xml 閰嶇疆鏂囦歡鐨勪紭鐐? 涓漢璁や負涓昏浼樼偣灝辨槸褰撲綘鏀瑰彉搴曞眰閰嶇疆鏃?涓嶉渶瑕佹敼鍙樺拰閲嶆柊緙栬瘧浠g爜,鍙渶瑕佸湪xml 涓洿鏀瑰氨鍙互浜?渚嬪 Hibernate.cfg.xml 褰撲綘瑕佹洿鏀瑰簳灞傛暟鎹簱鏃? 鍙鏇存敼閰嶇疆鏂囦歡灝卞彲浠ヤ簡.Hibernate浼氫負浣犲仛濂藉埆鐨勪簨鎯?
閭d箞xml鐨勭己鐐瑰憿,涓漢璁や負鏈変互涓嬪嚑鐐?
鎻忚堪絎﹀錛屼笉瀹規槗璁板繂,鎺屾彙 瑕佹繁鍏ヤ簡瑙h繕鏈夌湅DTD鏂囦歡
鏃犳硶鍋氳嚜鍔ㄦ牎楠岋紝闇瑕佷漢宸ユ煡鎵?
璇誨彇鍜岃В鏋恱ml閰嶇疆瑕佹秷鑰椾竴瀹氭椂闂達紝瀵艱嚧搴旂敤鍚姩鎱紝涓嶄究浜庢祴璇曞拰緇存姢
褰撶郴緇熷緢澶ф椂錛屽ぇ閲忕殑xml鏂囦歡闅句互綆$悊
榪愯涓繚瀛榵ml閰嶇疆闇瑕佹秷鑰楅澶栫殑鍐呭瓨
鍦∣/R Mapping鐨勬椂鍊欓渶瑕佸湪java鏂囦歡鍜寈ml閰嶇疆鏂囦歡涔嬮棿浜ゆ浛錛屽澶т簡宸ヤ綔閲?
鍏朵腑絎竴 浜岀偣 鍊熷姪浜庡厛榪涚殑IDE 鍙兘涓嶆槸浠涔堥棶棰? 浣嗘槸瀵瑰垵瀛﹁呰繕鏄釜闂 ^_^.
涓嬮潰鎴戜滑鐪嬬湅 Annotations鐨?鐗規у惂! 鍙互瑙e喅xml閬囧埌鐨勯棶棰?鏈変互涓嬩紭鐐?/p>
鎻忚堪絎﹀噺灝戙備互鍓嶅湪xml閰嶇疆涓線寰闇瑕佹弿榪癹ava灞炴х殑綾誨瀷錛屽叧緋葷瓑絳夈傝屽厓鏁版嵁鏈韓灝辨槸java璇█錛屼粠鑰岀渷鐣ヤ簡澶ч噺鐨勬弿榪扮
緙栬瘧鏈熸牎楠屻傞敊璇殑鎵規敞鍦ㄧ紪璇戞湡闂村氨浼氭姤閿欍?
鍏冩暟鎹壒娉ㄥ湪java浠g爜涓紝閬垮厤浜嗛澶栫殑鏂囦歡緇存姢宸ヤ綔
鍏冩暟鎹緙栬瘧鎴恓ava bytecode錛屾秷鑰楃殑鍐呭瓨灝戯紝璇誨彇涔熷緢蹇紝鍒╀簬嫻嬭瘯鍜岀淮鎶?
鍏充簬 鏄犲皠鏂囦歡鏄嬌鐢?hbm.xml 鏂囦歡榪樻槸浣跨敤 Annotations 鎴戜滑鏉ョ湅鐪?鑰呯殑鎬ц兘鍚? 鍏堝0鏄庝竴涓?涓漢璁や負鏄犲皠鏂囦歡涓鏃﹂厤緗ソ灝變笉浼氬湪寰堝ぇ紼嬪害涓婃敼鍙樹簡.鎵浠ヤ嬌鐢▁ml鏂囦歡騫朵笉浼氬甫鏉ュ緢澶х殑濂藉.濡傛灉浣犺涓?鏄犲皠鏂囦歡鍦ㄤ綘鐨勯」鐩腑涔熺粡甯稿彉鍖?姣斿涓鍒桽tring鏁版嵁 ,浠婂ぉ浣犱嬌鐢?length="16" 鏄庡ぉ浣犺涓?璇ユ暟鎹殑闀垮害搴旇鏇撮暱鎵嶈兘婊¤凍涓氬姟闇姹?浜庢槸鏀逛負length="128" 絳夌瓑綾諱技鐨勯棶棰?. 濡傛灉浣犵粡甯告湁榪欐柟闈㈢殑鍙樺姩鐨勮瘽,涓嬮潰鐨勬瘮杈冧綘鍙互涓嶇敤鐪嬩簡 , 浣犲簲璇ヤ嬌鐢?xml鏂囦歡 鍥犱負Annotations 鏃犳硶寰堝ソ鐨勬弧瓚充綘鐨勮姹?
鐜板湪璁╂垜浠氨鏉ョ湅鐪?鑰呯殑鎬ц兘姣旇緝鍚?
(璇存槑: 榪欓噷鍙槸姣旇緝鏌ユ壘 鎻掑叆 鐨勬椂闂村揩鎱?娌℃湁姣旇緝闄よ繍琛屾椂闂翠互澶栫殑鍏朵粬鎬ц兘,濡?鍐呭瓨鍗犵敤閲?絳夌瓑)
鍏堟潵鐪嬬湅嫻嬭瘯紼嬪簭鍜岄厤緗?
棣栧厛鍦?Hibernate.cfg.xml 鏂囦歡涓幓鎺変簡
<property name="hibernate.hbm2ddl.auto">update</property>
榪欎竴琛? 鍥犱負鍦ㄥ墠闈㈢殑瀹為獙涓互鍙婂緩绔嬩簡鏁版嵁搴撹〃浜?涓嶅啀闇瑕佹洿鏂頒簡.濡傛灉浣犳槸絎竴嬈¤繍琛岃渚嬪瓙 榪樻槸瑕佽琛岀殑.
Test.java 濡備笅:
/*
聽*聽Created聽on聽2005
聽*聽@author聽
聽*/
package聽test.hibernate.annotation;
import聽org.hibernate.Session;
import聽org.hibernate.Transaction;
public聽class聽Test聽{
聽聽
聽聽public聽static聽void聽main(String聽[]聽args)聽{
聽聽聽聽long聽start聽=聽0;
聽聽聽聽long聽end聽=聽0;
聽聽聽聽start聽=聽System.currentTimeMillis();聽聽//紼嬪簭寮濮嬫椂闂?/font>
聽聽聽聽
聽聽聽聽Session聽s聽=聽HibernateUtil.currentSession();
聽聽聽聽long聽mid聽=聽聽System.currentTimeMillis();聽聽//鍒濆鍖栧畬姣曠殑鏃墮棿 (鍙兘姝ゆ椂騫舵病鏈夊垵濮嬪寲瀹屾瘯^_^)
聽聽聽聽
聽聽聽聽Transaction聽tx聽=聽s.beginTransaction();聽聽聽聽
聽聽聽聽/********************嫻嬭瘯璇誨彇鐨勪唬鐮?***********************/
聽聽聽聽Person聽p聽=聽null;
聽聽聽聽for(int聽i聽=聽1;聽i聽<=聽100;聽i聽++)聽{
聽聽聽聽p聽=聽(Person)聽s.get(Person.class,聽i);
聽聽聽聽System.out.println(p.getName());
聽聽聽聽}
聽聽聽聽System.out.println(p.getName());
聽聽聽 /********************嫻嬭瘯璇誨彇1嬈$殑浠g爜************************/
聽聽聽聽Person聽p聽=聽null;
聽聽聽聽p聽=聽(Person)聽s.get(Person.class,聽1);
聽聽聽聽System.out.println(p.getName());
聽聽聽聽/*********************嫻嬭瘯鎻掑叆鐨勪唬鐮?************************************/
聽聽聽聽/*
聽聽聽聽for聽(int聽i聽=聽0;聽i聽<聽100;聽i聽++)聽{
聽聽聽聽聽聽Person聽p聽=聽new聽Person();
聽聽聽聽聽聽p.setAge(i+1);
聽聽聽聽聽聽p.setName("icerain"+i);
聽聽聽聽聽聽p.setSex("male"+i);
聽聽聽聽聽聽s.save(p);
聽聽聽聽聽聽s.flush();
聽聽聽聽}
聽聽聽聽*/
聽聽聽聽tx.commit();
聽聽聽聽HibernateUtil.closeSession();
聽聽聽聽
聽聽聽聽end聽=聽System.currentTimeMillis();聽//嫻嬭瘯緇撴潫鏃墮棿
聽聽聽聽System.out.println("String[]聽-聽start聽time:聽"聽+聽start);
聽聽聽聽System.out.println("String[]聽-聽end聽time:聽"聽+聽end);
聽聽聽聽System.out.println("Init聽time聽:聽"聽+聽(mid-start)); // 鎵撳嵃鍒濆鍖栫敤鐨勬椂闂?/font>
聽聽聽聽System.out.println("Last聽time聽is聽:"聽+(end聽-聽mid)聽); //鎵撳嵃 鏁版嵁鎿嶄綔鐨勬椂闂?/font>
聽聽聽聽System.out.println("Total聽time聽:聽"聽+(end聽-聽start)); //鎵撳嵃鎬繪椂闂?br />聽聽}
}
Annotations 鍖呬腑鐨凱erson.java 濡備笅
package聽test.hibernate.annotation;
import聽java.util.LinkedList;
import聽java.util.List;
import聽javax.persistence.AccessType;
import聽javax.persistence.Basic;
import聽javax.persistence.Entity;
import聽javax.persistence.GeneratorType;
import聽javax.persistence.Id;
import聽javax.persistence.Table;
import聽javax.persistence.Transient;
/**
聽*聽Person聽generated聽by聽hbm2java
聽*/
@SuppressWarnings("serial")
@Entity(access聽=聽AccessType.PROPERTY)
@Table
public聽class聽Person聽implements聽java.io.Serializable聽{
聽聽private聽Integer聽id;
聽聽private聽String聽name;
聽聽private聽String聽sex;
聽聽private聽Integer聽age;
聽聽private聽List聽list聽=聽new聽LinkedList();
聽聽//聽Constructors
聽聽/**聽default聽constructor聽*/
聽聽public聽Person()聽{
聽聽}
聽聽/**聽constructor聽with聽id聽*/
聽聽public聽Person(Integer聽id)聽{
聽聽聽聽this.id聽=聽id;
聽聽}
聽聽//聽Property聽accessors
聽聽@Id(generate=GeneratorType.AUTO)
聽聽public聽Integer聽getId()聽{
聽聽聽聽return聽this.id;
聽聽}
聽聽public聽void聽setId(Integer聽id)聽{
聽聽聽聽this.id聽=聽id;
聽聽}
聽聽@Basic
聽聽public聽String聽getName()聽{
聽聽聽聽return聽this.name;
聽聽}
聽聽public聽void聽setName(String聽name)聽{
聽聽聽聽this.name聽=聽name;
聽聽}
聽聽@Basic
聽聽public聽String聽getSex()聽{
聽聽聽聽return聽this.sex;
聽聽}
聽聽public聽void聽setSex(String聽sex)聽{
聽聽聽聽this.sex聽=聽sex;
聽聽}
聽聽@Basic
聽聽public聽Integer聽getAge()聽{
聽聽聽聽return聽this.age;
聽聽}
聽聽public聽void聽setAge(Integer聽age)聽{
聽聽聽聽this.age聽=聽age;
聽聽}
聽聽@Transient
聽聽public聽List聽getList()聽{
聽聽聽聽return聽list;
聽聽}
聽聽public聽void聽setList(List聽list)聽{
聽聽聽聽this.list聽=聽list;
聽聽}
}
鍏朵粬鐨勪唬鐮佸嚑涔庢病鏈夋敼鍙?
涓嬮潰鐨勬瘡縐嶇被鍨嬬殑嫻嬭瘯閮芥祴璇曚簡3嬈′互涓? 鍙栦腑闂寸殑嫻嬭瘯鏃墮棿.
嫻嬭瘯鏈哄櫒閰嶇疆:
CPU:聽 AMD Athlon (xp) 2000+
鍐呭瓨: 784880KB
紜洏: 涓夋槦 SP0812N
璇誨彇涓嬈÷犅犵殑姣旇緝:(鍗曚綅: 姣)
浣跨敤Annotations 鐨勬祴璇曟暟鎹?/td> | 浣跨敤Xml鏂囦歡鐨勬祴璇曟暟鎹?/td> | 綆瑕佽鏄?/td> | ||
Init time : | 2444 | Init time : | 2431 | 嫻嬭瘯鍓嶆垜璁や負璇ラ」緇撴灉xml搴旇姣旇緝澶?瑕佽鍙栨槧灝勬枃浠跺晩,瀹為檯鎯呭喌涓嶆槸榪欐牱,涓嶇煡閬撲負浠涔? |
Last time is : | 62 | Last time is : | 85 | 鐩稿樊姣旇緝澶т笉鐭ラ亾涓轟粈涔? |
Total time : | 2506 | Total time : | 2516 | xml鏂囦歡鎬諱綋涓婃參浜嗕竴鐐?/td> |
聽聽 璇誨彇100嬈$殑姣旇緝:
浣跨敤Annotations 鐨勬祴璇曟暟鎹?/td> | 浣跨敤Xml鏂囦歡鐨勬祴璇曟暟鎹?/td> | 綆瑕佽鏄?/td> | ||
Init time : | 2437 | Init time : | 2422 | 鍜屽墠闈㈠垵濮嬪寲宸笉澶?/td> |
Last time is : | 438 | Last time is : | 484 | 鏈夋椂闂村樊 |
Total time : | 2875 | Total time : | 2906 | 涔熸槸xml鏂囦歡鎬諱綋涓婃參浜嗕竴鐐?/td> |
鎻掑叆100嬈$殑姣旇緝:
浣跨敤Annotations 鐨勬祴璇曟暟鎹?/td> | 浣跨敤Xml鏂囦歡鐨勬祴璇曟暟鎹?/td> | 綆瑕佽鏄?/td> | ||
Init time : | 2453 | Init time : | 2469 | 鍜屽墠闈㈠垵濮嬪寲宸笉澶?/td> |
Last time is : | 469 | Last time is : | 656 | 鏈夋椂闂村樊 |
Total time : | 2922 | Total time : | 3125 | 涔熸槸xml鏂囦歡鎬諱綋涓婃參浜嗕竴鐐?/td> |
浠庝笂闈㈢殑涓夋瀵規瘮涓ぇ瀹跺彲浠ョ湅鍒?鍒濆鍖栫殑閮ㄥ垎鍑犱箮涓よ呮槸涓鏍風殑, 鍦ㄦ暟鎹搷浣滀笂闈?浣跨敤xml鏂囦歡 鎬繪槸姣斾嬌鐢ˋnnotations 鎱竴鐐?鍦ㄦ垜浠彧鎿嶇旱涓涓彧鏈夊嚑涓睘鎬х殑灝忔寔涔呭寲綾葷殑鎿嶄綔涓氨鏈?鍑犲崄姣鐨勫樊璺? 鍑犲崄姣鍦ㄨ綆楁満涓畻涓嶇畻寰堝ぇ 澶у搴旇閮界煡閬?鎴戝氨涓嶅湪澶氳浜?
鎬葷粨: 緇忚繃 xml 鏂囦歡 鍜孉nnotations 鐨勪紭緙虹偣鍜?鎬ц兘涓婄殑瀵規瘮.鐜板湪浣跨敤閭d釜浣滀負浣犳寔涔呭寲鏄犲皠絳栫暐.鎴戠浉淇″ぇ瀹墮兘浼氭紜夋嫨鐨?
嫻嬭瘯鍚庤: 緇忚繃澶氭嫻嬭瘯 鎰熻鏈夋椂鍊欏緢涓嶇ǔ瀹?,鏈夌殑鏃跺欏緢紼沖畾涓嶇煡閬撴槸嫻嬭瘯鏈夐棶棰樿繕鏄埆鐨勯棶棰?澶у鍙互鑷繁嫻嬭瘯涓涓? 鏈変粈涔堟柊鐨勫彂鐜?璇峰ぇ瀹惰璁鴻璁?
CREATE TABLE user (瀵逛簬榪欎釜琛ㄦ牸錛屾偍鏈変竴涓猆ser綾誨埆涓庝箣瀵瑰簲錛岃〃鏍間腑鐨勬瘡涓涓瓧孌靛皢瀵瑰簲鑷砋ser瀹炰緥涓婄殑Field鎴愬憳銆?br />
id INT(11) NOT NULL auto_increment PRIMARY KEY,
name VARCHAR(100) NOT NULL default'',
age INT
);
import java.io.Serializable;
import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Session;
import net.sf.hibernate.SessionFactory;
import net.sf.hibernate.Transaction;
public class HibernateSessionUtil implements Serializable
{
publicstaticfinal ThreadLocal tLocalsess = new ThreadLocal();
publicstaticfinal ThreadLocal tLocaltx = new ThreadLocal();
/*
* getting the thread-safe session for using
*/
publicstatic Session currentSession(){
Session session = (Session) tLocalsess.get();
//open a new one, if none can be found.
try{
if (session == null){
session = openSession();
tLocalsess.set(session);
}
}catch (HibernateException e){
thrownew InfrastructureException(e);
}
return session;
}
/*
* closing the thread-safe session
*/
publicstatic void closeSession(){
Session session = (Session) tLocalsess.get();
tLocalsess.set(null);
try{
if (session != null && session.isOpen()){
session.close();
}
}catch (HibernateException e){
thrownew InfrastructureException(e);
}
}
/*
* begin the transaction
*/
publicstatic void beginTransaction(){
Transaction tx = (Transaction) tLocaltx.get();
try{
if (tx == null){
tx = currentSession().beginTransaction();
tLocaltx.set(tx);
}
}catch (HibernateException e){
thrownew InfrastructureException(e);
}
}
/*
* close the transaction
*/
publicstatic void commitTransaction(){
Transaction tx = (Transaction) tLocaltx.get();
try{
if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack())
tx.commit();
tLocaltx.set(null);
}catch (HibernateException e){
thrownew InfrastructureException(e);
}
}
/*
* for rollbacking
*/
publicstatic void rollbackTransaction(){
Transaction tx = (Transaction) tLocaltx.get();
try{
tLocaltx.set(null);
if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack()){
tx.rollback();
}
}catch (HibernateException e){
thrownew InfrastructureException(e);
}
}
privatestatic Session openSession() throws HibernateException{
return getSessionFactory().openSession();
}
privatestatic SessionFactory getSessionFactory() throws HibernateException{
return SingletonSessionFactory.getInstance();
}
}
銆filter涓殑紼嬪紡紕煎涓?/p>
public class HibernateSessionCloser implements Filter{
protected FilterConfig filterConfig = null;
public void init(FilterConfig filterConfig)throws ServletException{
this.filterConfig = filterConfig;
}
public void destroy(){
this.filterConfig = null;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
try{
chain.doFilter(request, response);
}
finally{
try{
HibernateSessionUtil.commitTransaction();
}catch (InfrastructureException e){
HibernateSessionUtil.rollbackTransaction();
}finally{
HibernateSessionUtil.closeSession();
}
}
}
}
鐒跺緦鍦ㄦ搷浣滆硣鏂欏韓涔嬪墠鍔犱笂
HibernateSessionUtil.beginTransaction();
HibernateSessionUtil.currentSession();//鍙栧緱Session
榪欎釜渚嬪瓙浣跨敤浜咹SQL鍋氭暟鎹簱錛宻pring鐨凙OP浣滀負鍩虹錛屼嬌鐢ˋcegi鍋氬畨鍏ㄦ帶鍒剁粍浠躲?br />鑱旂郴浜虹鐞嗙殑web搴旂敤鍦ㄥ惎鍔ㄦ椂鍊欙紝浼氬仛涓緋誨垪鍒濆鍖栧姩浣滐細
1. 璇誨彇web.xml鏂囦歡錛?/p>
2. 騫惰В鏋愭枃浠墮噷鐨勫唴瀹廣?br />a) context-param鍏冪礌銆?br />i. contextConfigLocation灞炴с傝繖涓睘鎬у畾涔変簡spring鎵闇瑕佺殑3涓睘鎬ф枃浠躲傚畠浠垎鍒槸錛歛pplicationContext -acegi-security.xml銆乤pplicationContext-common-business.xml銆?applicationContext-common-authorization.xml
ii. log4jConfigLocation灞炴с傝繖涓睘鎬у畾涔変簡log4j閰嶇疆鏂囦歡銆?/p>
b) filter鍏冪礌銆?br />榪欓噷瀹氫箟浜哸cegi鐨勪竴涓繃婊ゅ櫒銆侫cegi鐨勫ぇ閮ㄥ垎榪囨護鍣ㄩ兘鏄繖鏍烽厤緗殑銆備嬌鐢‵ilterToBeanProxy緇勪歡錛岀粰瀹冧紶閫掍竴涓猼argetClass灞炴с傝繖涓猼argetClass蹇呴』瀹炵幇javax.servlet.Filter鎺ュ彛銆?br />榪欓噷閰嶇疆鐨勬槸FilterChainProxy銆傝繖涓狥ilterChainProxy姣旇緝濂界敤錛屽彲浠ヤ負瀹冨畾涔変竴涓瞗ilter灞炴с傝繖浜沠ilter灝嗕細鎸夌収瀹氫箟鐨勯『搴忚璋冪敤銆備緥濡傦紝
<bean id="filterChainProxy" class="net.sf.acegisecurity.util.FilterChainProxy">
<property name="filterInvocationDefinitionSource">
<value>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/**=httpSessionContextIntegrationFilter,authenticationProcessingFilter,basicProcessingFilter,rememberMeProcessingFilter,anonymousProcessingFilter,securityEnforcementFilter
</value>
</property>
</bean>
榪欎釜榪囨護鍣ㄧ殑mapping鏄?*鈥濄?br />c) listener鍏冪礌銆?br />i. ContextLoaderListener銆傝繖涓槸Spring浣跨敤鏉ュ姞杞芥牴applicationcontext銆傚茍鍒嗗埆瑙f瀽 applicationContext-acegi-security.xml銆乤pplicationContext-common- business.xml銆乤pplicationContext-common-authorization.xml絳夐厤緗枃浠訛紝鎶婄浉鍏崇殑瀵硅薄鍒濆鍖?br />iii. Log4jConfigListener銆傝繖涓槸spring鐢ㄦ潵鍒濆鍖杔og4j緇勪歡鐨刲istener銆?br />iv. HttpSessionEventPublisher銆傝繖涓粍浠跺皢鍙戝竷HttpSessionCreatedEvent鍜孒ttpSessionDestroyedEvent浜嬩歡緇檚pring鐨刟pplicationcontext銆?br />d) servlet鍏冪礌銆?br />i. contacts銆傝繖閲岄噰鐢ㄤ簡spring鐨凪VC妗嗘灦錛?鎵浠ヨ繖涓猻ervlet鏄痵pring MVC鐨勪竴涓牳蹇冩帶鍒跺櫒錛坥rg.springframework.web.servlet.DispatcherServlet錛夈傝繖涓猻ervlet 鍚姩鏃跺欙紝浼氫粠contacts-servlet.xml閲岄潰璇誨彇淇℃伅錛屽茍鍋氱浉鍏崇殑鍒濆鍖栥?br />v. remoting銆備篃鏄痵pring MVC鐨勪竴涓牳蹇冩帶鍒跺櫒銆備笌contacts涓嶅悓錛岃繖涓猻ervlet涓昏鏄彁渚泈eb services鏈嶅姟銆傝繖涓猻ervlet鍚姩鏃跺欙紝 浼氫粠remoting-servlet.xml閲岄潰璇誨彇淇℃伅錛屽茍鍋氱浉鍏崇殑鍒濆鍖栥?br />e) taglib鍏冪礌銆傝繖閲屽畾涔変簡spring鐨勬爣f) 絳懼簱銆?br />3. 瑙f瀽applicationContext-acegi-security.xml銆?br />a) 榪囨護鍣ㄩ摼銆傚畾涔変簡涓涓狥ilterChainProxy錛宐) 騫舵寚c) 瀹氫簡涓緋誨垪鐨勮繃婊ゅ櫒閾俱俬ttpSessionContextIntegrationFilter, authenticationProcessingFilter,basicProcessingFilter,rememberMeProcessingFilter,anonymousProcessingFilter,securityEnforcementFilter
d) 璁よ瘉綆$悊鍣ㄣ傝繖涓鐞嗗櫒鐢盿cegi鎻愪緵銆傝繖涓鐞嗗櫒闇瑕佷竴涓猵roviders鍙傛暟銆傝繖涓猵roviders鍙傛暟鍖呭惈浜嗘彁渚涚郴緇熻璇佺殑瀵硅薄銆?br />i. daoAuthenticationProvider銆備竴鑸敤鎴瘋璇併?br />ii. anonymousAuthenticationProvider銆傚尶鍚嶇敤鎴瘋璇併?br />iv. rememberMeAuthenticationProvider銆傝浣忔垜璁よ瘉銆?/p>
e) 瀵嗙爜鍔犲瘑銆傝繖閲屽畾涔変簡涓涓猘cegi鐨凪d5綆楁硶鍔犲瘑瀵硅薄Md5PasswordEncoder銆?br />f) 瀹氫箟浜嗕竴涓猨dbcDao瀹炵幇綾匯傝繖涓被鐢盿cegi鎻愪緵鐨刵et.sf.acegisecurity.providers.dao.jdbc.JdbcDaoImpl銆傝繖涓璞¢渶瑕佷竴涓猟ataSource鐨勫弬鏁般?br />g) 瀹氫箟daoAuthenticationProvider銆傝繖涓璞$敱acegi鎻愪緵銆傚畠鏈?涓睘鎬э細
authenticationDao銆傝繖閲屾寚鍚戝墠闈㈠畾涔夌殑jdbcDao銆?br />userCache銆傝繖閲屾寚鍚戝悗闈㈠畾涔夌殑user緙撳瓨瀵硅薄銆?br />passwordEncoder銆傝繖閲屾寚鍚戝墠闈㈠畾涔夌殑瀵嗙爜鍔犲瘑瀵硅薄銆?br />h) 鐢ㄦ埛緙撳瓨綆$悊銆?br />涓轟簡緙撳瓨user錛岃繖閲屼嬌鐢╯pring鐨別hcache鏉ョ紦瀛榰ser銆傜紦瀛樻満鍒訛細
i. 瀹氫箟緙撳瓨綆$悊鍣ㄢ曗旵acheManager銆傝繖涓璞℃槸spring鐨凟hCacheManagerFactoryBean瀵硅薄
ii. 瀹氫箟user緙撳瓨瀹為檯鎵ц瀵硅薄鈥曗昒serCacheBackend銆傝繖涓璞℃槸spring鐨凟hCacheFactoryBean銆傚畠鏈変袱涓睘鎬э細
1. cacheManager銆傝繖閲屾寚鍚戝墠闈㈠畾涔夌殑緙撳瓨綆$悊鍣ㄣ?br />2. cacheName銆?br />iii. 瀹氫箟user緙撳瓨鈥曗昒serCache銆傚畠鏄痑cegi鎻愪緵鐨凟hCacheBasedUserCache瀵硅薄銆傚畠鏈変竴涓睘鎬э細
1. cache銆傝繖閲屾寚鍚戠殑鏄墠闈㈠畾涔夌殑userCacheBackend銆?/p>
i) 瀹氫箟鎺ユ敹鏉ヨ嚜DaoAuthenticationProvider鐨勮璇佷簨浠剁殑listener鈥曗昄oggerListener銆?br />j)
4. 瑙f瀽applicationContext-common-business.xml銆?br />a) dataSource.
榪欓噷浣跨敤浜唖pring鐨凞riverManagerDataSource瀵硅薄銆傝繖涓璞℃槸涓涓狫DBC鏁版嵁婧愮殑瀹氫箟銆?br />b) TransactionManager銆傝繖閲屼嬌鐢╯pring鐨凞ataSourceTransactionManager瀵硅薄銆?br />c) 浜嬪姟鎷︽埅鍣ㄣ傝繖閲屼嬌鐢╯pring鐨勪簨鍔℃嫤鎴櫒TransactionInterceptor銆傚畠鏈?涓睘鎬э細
transactionManager銆傝繖涓睘鎬ф寚鍚戝墠闈㈠畾涔夌殑TransactionManager銆?br />transactionAttributeSource銆傝繖涓睘鎬ч噷錛?鎸囧畾浜咰ontactManager鐨勫悇涓柟娉曠殑浜嬪姟鏂歸潰鐨勮姹傘?br />d) DataSourcePopulator銆?br />浣跨敤sample.contact.DataSourcePopulator瀵硅薄錛屽線HSQL閲屽垱寤虹浉鍏崇殑琛ㄧ粨鏋勫拰鏁版嵁銆?br />瀹炵幇鍘熺悊錛欴ataSourcePopulator 瀹炵幇浜嗘帴鍙?InitializingBean銆傚叾涓璦fterPropertiesSet鏂規硶灝嗗湪spring鍒濆鍖朌ataSourcePopulator鍚庤璋冪敤銆?br />e) ContactDao銆傝繖閲屾寚鍚戜竴涓狢ontactDaoSpring瀵硅薄銆傚畠緇ф壙spring鐨?JdbcDaoSupport錛実) 騫跺疄鐜癈ontactDao鎺ュ彛銆傚畠鏄湡姝e疄鐜癑DBC鎿嶄綔鐨勫璞°?br />h) ContactManager銆傝繖閲屼嬌鐢ㄧ殑鏄痵pring鐨凱roxyFactoryBean銆傚畠鏈?涓睘鎬э細
i. ProxyInterfaces銆備唬鐞嗘帴鍙o細sample.contact.ContactManager
ii. InterceptorNames銆傛嫤鎴櫒鍚嶇О銆傚彲浠ユ湁澶氫釜錛宨v. 榪欓噷鍖呮嫭錛歵ransactionInterceptor銆乧ontactManagerSecurity銆乧ontactManagerTarget銆傚叾涓紝v. transactionInterceptor鏄墠闈㈠畾涔夌殑浜嬪姟鎷︽埅鍣ㄣ侰ontactManagerSecurity鍒欐槸鍦?applicationContext-common-authorization.xml閲屽畾涔夌殑鏂規硶璋冪敤鎺堟潈銆?br />i) ContactManagerTarget銆傝繖閲屾寚鍚戠殑鏄痵ample.contact.ContactManagerBackend瀵硅薄銆?ContactManagerBackend瀹炵幇浜咰ontactManager鎺ュ彛鍜孖nitializingBean鎺ュ彛銆傚畠鏈?涓嚜瀹氫箟灞炴э細 contactDao鍜宐asicAclExtendedDao銆傝繖閲屼細璋冪敤ACL鐨凙PI鍘誨仛浜涘垱寤烘潈闄愬拰鍒犻櫎鏉冮檺鐨勫伐浣溿?/p>
鑱旂郴浜虹鐞嗚鏄庝簡涓嬪垪涓績鐨?span lang="EN-US">Acegi瀹夊叏鎺у埗鑳藉姏:
ContactManager
鏈嶅姟灞傚璞?/span>
鍖呭惈涓浜涘彈淇濇姢鐨勫拰鍏紑鐨勬柟娉曘?/span>
/secure
鈥?/span>
URI
璺緞琚嬌鐢?/span>
Acegi
瀹夊叏淇濇姢錛屼嬌寰楁病鏈?/span>
ROLE_USER
瑙掕壊鐨勭敤鎴鋒棤娉曡闂?/span>
.
鑱旂郴浜虹鐞嗙殑涓氬姟鍔熻兘鎻忚堪錛?/span>
1.1. 姣忎釜鐢ㄦ埛鐧誨綍鍚庯紝鍙互鐪嬪埌涓涓仈緋諱漢鍒楄〃銆備緥濡傦紝
id |
Name |
|
||
1 |
John Smith |
john@somewhere.com |
||
2 |
Michael Citizen |
michael@xyz.com |
|
|
3 |
Joe Bloggs |
joe@demo.com |
|
|
4 |
Karen Sutherland |
karen@sutherland.com |
璇存槑錛氱敤鎴鋒病鏈夋潈闄愯闂殑鑱旂郴浜轟俊鎭紝灝嗕笉浼氭樉紺恒?/span>
2.2. 鐢ㄦ埛鍙互澧炲姞鏂扮殑鑱旂郴浜轟俊鎭?/span>
3.3. 濡傛灉鏈夊垹闄ゆ潈闄愶紝鐢ㄦ埛鍙互鐪嬪埌鍦ㄨ仈緋諱漢鍚庨潰鏈変竴涓?/span> Del 鈥濋摼鎺ャ傜敤鎴峰彲浠ョ偣鍑昏繖涓摼鎺ユ潵鍒犻櫎鏌愪釜鑱旂郴浜轟俊鎭?/span>
4.4. 濡傛灉鏈夌鐞嗘潈闄愶紝鐢ㄦ埛鍙互鐪嬪埌鍦ㄨ仈緋諱漢鍚庨潰鏈変竴涓?/span> Admin Permission 鈥濋摼鎺ャ傜敤鎴峰彲浠ョ偣鍑昏繖涓摼鎺ユ潵綆$悊璁塊棶榪欎釜鑱旂郴浜虹殑鏉冮檺銆備緥濡傦紝
sample.contact.Contact@26807f: Id: 1; Name: John Smith; Email: john@somewhere.com
|
|
|
|
|
璇存槑錛氭瘡涓琛岃褰曞寘鍚湁 3 鍒椼?/span>
絎竴鍒楄〃紺烘潈闄愶紝渚嬪錛屸?/span>
-RW-D
鈥濊〃紺哄彲璇匯佸彲鍐欍佸彲鍒犻櫎銆?/span>
絎簩鍒椾篃琛ㄧず鏉冮檺錛屼絾瀹冩槸浠ョ被浼?/span> unix 鏉冮檺鐨勬暟瀛楄〃杈俱備緥濡傦紝鈥?/span> [22] 鈥?/span> , 琛ㄧず鍙銆佸彲鍐欍佸彲鍒犻櫎銆?/span>
絎笁鍒楁槸鐢ㄦ埛鍚嶇О銆?/span>
姣忎竴琛岃褰曞悗闈㈤兘鏈変竴涓?/span> Del 鈥濋摼鎺ャ傜偣鍑昏繖涓摼鎺ワ紝鍙互鍒犻櫎鎺夋寚瀹氱敤鎴峰榪欎釜鑱旂郴浜轟俊鎭殑鏉冮檺銆?/span>
5.5. 鐢ㄦ埛鍙互涓烘煇涓仈緋諱漢淇℃伅娣誨姞鏉冮檺銆備緥濡傦紝