毕竟Struts提供的校验逻辑有限,不可能满足所有的开发需要,因此有时必须对其进行扩展。这里举一个实际项目中的例子:校验码检查。现在很多网站为了防止恶意的页面刷新攻击,都使用了图片形式的校验码,如:

表单提交后需要检查校验码(存在request或session里)和用户输入是否一致,代码如下:

public class MyValidator
{
private static Logger logger = Logger.getLogger(Constants.CON_LOGGER_NAME);
public static boolean validateCodeInput(Object obj,ValidatorAction action,Field field,
ActionMessages errors,HttpServletRequest req)
{
String code = (String)req.getSession().getAttribute(Constants.SESSION_CHECKSUM_CODE);
String input = ValidatorUtils.getValueAsString(obj,field.getProperty());
logger.debug("Code: " + code + ", input: " + input);
if(code.equalsIgnoreCase(input))
return true;
else
{
errors.add(field.getKey(),Resources.getActionMessage(req,action,field));
return false;
}
}
}
<validator name="codeinput"
classname="consultII.web.utils.MyValidator"
method="validateCodeInput"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
javax.servlet.http.HttpServletRequest"
msg="errors.code"/>
<field property="input" depends="required,codeinput"/>
<field property="input" depends="required,codeinput"/>
req.getSession().setAttribute(Constants.SESSION_CHECKSUM_CODE,code);这样就OK了。
由于Validator的代码在服务器端被执行,因此如果校验请求频繁的话将会对服务器端造成不小的性能压力。考虑到这个问题,Struts中提供的校验方法可以被转译成JavaScript代码嵌入页面,这样校验将在客户端进行。
使用时,只要在页面中嵌入两条Struts html标签库中的标签:
<html:javascript formName = "formName" />
<html:form action = "
" onsubmit = "return validateFormName(this);" />