三、自定義校驗邏輯
畢竟Struts提供的校驗邏輯有限,不可能滿足所有的開發需要,因此有時必須對其進行擴展。這里舉一個實際項目中的例子:校驗碼檢查。現在很多網站為了防止惡意的頁面刷新攻擊,都使用了圖片形式的校驗碼,如:

表單提交后需要檢查校驗碼(存在request或session里)和用戶輸入是否一致,代碼如下:
1
public class MyValidator
{
2
private static Logger logger = Logger.getLogger(Constants.CON_LOGGER_NAME);
3
4
public static boolean validateCodeInput(Object obj,ValidatorAction action,Field field,
5
ActionMessages errors,HttpServletRequest req)
{
6
String code = (String)req.getSession().getAttribute(Constants.SESSION_CHECKSUM_CODE);
7
String input = ValidatorUtils.getValueAsString(obj,field.getProperty());
8
9
logger.debug("Code: " + code + ", input: " + input);
10
if(code.equalsIgnoreCase(input))
11
return true;
12
else
{
13
errors.add(field.getKey(),Resources.getActionMessage(req,action,field));
14
return false;
15
}
16
}
17
} 注釋:
1、第1行:MyValidator沒有任何父類,運行時Validator通過reflection生成對象
2、第4行:校驗方法可隨意命名,通過reflection調用,但參數必須按照規范
3、第6行:從session中取出圖片中的字符串
4、第7行:得到用戶輸入的值,Struts在這里用Field類對表單字段進行了封裝,而Field具體封裝的字段在validation.xml中定義,見
上篇validator-rules.xml中的定義:
1
<validator name="codeinput"
2
classname="consultII.web.utils.MyValidator"
3
method="validateCodeInput"
4
methodParams="java.lang.Object,
5
org.apache.commons.validator.ValidatorAction,
6
org.apache.commons.validator.Field,
7
org.apache.struts.action.ActionMessages,
8
javax.servlet.http.HttpServletRequest"
9
msg="errors.code"/>
10
validation.xml中的定義:
<field property="input" depends="required,codeinput"/>

<field property="input" depends="required,codeinput"/>在servlet中將校驗碼存入session傳遞給Validator:
req.getSession().setAttribute(Constants.SESSION_CHECKSUM_CODE,code);
這樣就OK了。
四、將校驗邏輯轉譯成JavaScript代碼
由于Validator的代碼在服務器端被執行,因此如果校驗請求頻繁的話將會對服務器端造成不小的性能壓力。考慮到這個問題,Struts中提供的校驗方法可以被轉譯成JavaScript代碼嵌入頁面,這樣校驗將在客戶端進行。
使用時,只要在頁面中嵌入兩條Struts html標簽庫中的標簽:
1
<html:javascript formName = "formName" />
2
<html:form action = "
" onsubmit = "return validateFormName(this);" /> 其中第一行定義了需要轉譯的FormBean名,這里是“formName”,第二行在該FormBean封裝的表單上添加onsubmuit事件,而該事件調用的函數會在JSP請求到客戶端時由Validator框架自動生成,命名規則為“validateXXX”,其中“XXX”就是第一行中的formName屬性的值,這里是“formName”,因此生成的函數名為“validateFormName”。
關于為自定義的Validator(如上文的MyValidator)創建JS代碼,我沒有實現過,感興趣的話可以去Struts官網上找一下相關文檔。
posted on 2006-03-07 18:38
^ Mustang ^ 閱讀(1821)
評論(1) 編輯 收藏 所屬分類:
Struts