最後我打算分析一下WebWork2.x中的輸入校檢部分,校檢數據通常包括客戶端檢查和服務端檢查兩種,在WebWork2.x中都有很好的支持,首先來分析服務端,服務端的校檢類全部來自於com.opensymphony.xwork.validator包,服務端的所有校檢工作都是通過一個ValidationInterceptor攔截器來進行攔截的,所以說Interceptor在WebWork2.x中的地位就相當於我們心中的“神”,他是用來拯救一切的,有點誇張了,哈哈!
下面請欣賞ValidationInterceptor攔截器的代碼
public class ValidationInterceptor extends AroundInterceptor {
protected void after(ActionInvocation dispatcher, String result) throws Exception {
}
//獲取Action,然後調用ActionValidatorManager來進行檢查工作
protected void before(ActionInvocation invocation) throws Exception {
Action action = invocation.getAction();
String context = invocation.getProxy().getActionName();
…
ActionValidatorManager.validate(action, context);
}
}
別走開,接著看ActionValidatorManager,由於這個類有點復雜,只做主要的分析,其他則忽略
public class ActionValidatorManager {
protected static final String VALIDATION_CONFIG_SUFFIX = "-validation.XML";
//用於將校檢信息緩存起來
private static final Map validatorCache = Collections.synchronizedMap(new HashMap());
private static final Map validatorFileCache = Collections.synchronizedMap(new HashMap());
private static final Log LOG = LogFactory.getLog(ActionValidatorManager.class);
…
//建立一個DelegatingValidatorContext,用於獲取設置資源,如:錯誤提示信息等
public static void validate(Object object, String context) throws ValidationException {
ValidatorContext validatorContext = new DelegatingValidatorContext(object);
validate(object, context, validatorContext);
}
//
public static void validate(Object object, String context, ValidatorContext validatorContext) throws ValidationException {
//建立一個校檢列表
List validators = getValidators(object.getClass(), context);
Set shortcircuitedFIElds = null;
//遍歷這個列表
for (Iterator iterator = validators.iterator(); iterator.hasNext();) {
Validator validator = (Validator) iterator.next();
validator.setValidatorContext(validatorContext);
…
//調用校檢類,注意所有的自定義校檢類必須從validator接口中實現
validator.validate(object);
}
…
}
至於客戶端校檢,由於操作全部來自於com.opensymphony.webwork.validators包,其他的所有校檢類都從ScriptValidationAware接口下繼承,由於時間的關系我在這裡不做分析了,各位如有興趣,自己去研究吧!
其實WebWork2.x裡面還有很多相關的細節調用,在此我不能一一描述,各位如果有興趣的話,也不妨來看看源碼。
今天就到這裡了啊,至於WebWork2.x的標簽我就不想看了,不知道是什麼原因我就是不太喜歡標簽啊,下個Java Web應用我一定用WebWork2.x來進行開發,這麼好的一個Framework不用太可惜了啊!
Email: [email protected]
Blog: http://blog.csdn.Net/zhuam