三、自定义校验逻辑
毕竟Struts提供的校验逻辑有限,不可能满足所有的开发需要,因此有时必须对其进行扩展。这里举一个实际项目中的例子:校验码检查。现在很多网站为了防止恶意的页面刷新攻击,都使用了图片形式的校验码,如:
表单提交后需要检查校验码(存在request或session里)和用户输入是否一致,代码如下:
1public 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 ^ 阅读(1808)
评论(1) 编辑 收藏 所属分类:
Struts