1. 注意事项
1.1. 1.0不兼容validator.
1.2. . messageReource 在1.1与1.0中有不同的配置方式:
--1.0 web.xml <init-param> <param-name>application</param-name> <param-value>org.apache.struts.webapp.example.ApplicationResources</param-value> </init-param>
--1.1 struts-config.xml <message-resources parameter="org.apache.struts.webapp.example.ApplicationResources"/>
|
2. Validator实现
2.1. validation.xml配置:
formset 可以含有language, country 等属性对应java.util.Locale class
formset 配置:
form name:对应的表单name,必须与<html:javascript> 中formName属性以及struts-config中ActionForm名称相同。
<field property="username" //property是字段名称,对应ActionForm属性 depends="required, minlength,maxlength,idcard"> //depends是validator-rules.xml中的规则名称name <arg0 key="prompt.username"/> //错误信息参数,错误信息文件由message-resources标签指示。参数最多4个 <arg1 key="${var:minlength}" name="minlength" resource="false"/> //resource=false说明直接以key的值作为值,而不到message-resources文件中查找对应值 //var为下面定义的变量 <arg2 key="${var:maxlength}" name="maxlength" resource="false"/> <arg3 key="${var:idcardlength}" name="idcard" resource="false"/> <var> <var-name>maxlength</var-name> //变量名 <var-value>16</var-value>//变量值 </var> <var> <var-name>minlength</var-name> <var-value>3</var-value> </var> <var> <var-name>idcardlength</var-name> <var-value>15</var-value> </var> </field> |
2.2. jsp页面设置:
<html:javascript> 标签
dynamicJavascript:动态脚本呈现的形式是只有depends中出现的规则的对象将RENDER到页面,当在页面中采用οnsubmit="return validateXXX()"等脚本时,该validateXXX方法虽然能够找到,但在validateXXX方法内部调用的方法(validator-rules.xml中CDATA内容)的脚本不会产生,除非设置了staticJavascript=true。只能自己写validateXXX方法的内部方法实现。注意此处的validateXXX方法是自动生成的,是在formName前加上”validate”形成的默认校验函数,可以采用其它名称,只需设置method属性。
staticJavascript:静态脚本将validator-rules.xml中CDATA内容写到页面上。但不会自动生成validateXXX方法及其对象。
只有两者结合起来,才能生成一个不需要自己在JSP上编码的脚本验证。STRUTS框架自动采用脚本对象的方式生成验证。
2.3. 自动表单验证ActionForm实现:
注意:此方式不是Struts validator
两种方式:
前提: struts-config.xml action 中 validate=true
(1)继承: ValidatorForm
action name 属性 (struts-config.xml)对应form name 属性(validator.xml)
(2)继承: validatorActionForm
action path 属性(struts-config.xml)对应form name 属性(validator.xml)
继承后的类实现validate 方法,在该方法中写入需要进行的服务器端校验。该方法将先于EXECUTE方法执行。所返回的error将存入request中,用<html:errors>显示出来,页面将返回到input form,该form由struts-config.xml中actionmapping input 标签指示。
2.4. Struts Validator实现:
Struts提供了VALIDATOR来简便实现校验,包括客户端和服务器端,实现步骤如下:
首先按照2.1 ,2.2 配置好xml和JSP页面。然后如2.3所述创建继承于ValidatorForm的ActionForm类。
以上例中的idcard为例配置validator-rules.xml
<validator name="idcard" classname="org.apache.struts.webapp.example.QiuchunChecks" method="validateIDCard" methodParams="java.lang.Object, org.apache.commons.validator.ValidatorAction, org.apache.commons.validator.Field, org.apache.struts.action.ActionErrors, javax.servlet.http.HttpServletRequest" depends="" msg="errors.idcard">
<javascript><![CDATA[ function validateIDCard(form) { var isValid = true; var focusField = null; var i = 0; var fields = new Array(); oIdCard = new idcard(); for (x in oIdCard) { var field = form[oIdCard[x][0]];
if (field.type == 'text' ) {
var iMin = parseInt(oIdCard[x][2]("idcardlentgh")); if ((trim(field.value).length > 0) && (field.value.length != iMin) && (field.value.substring(0,5)!="51010")) { if (i == 0) { focusField = field; } fields[i++] = oIdCard[x][1]; isValid = false; } } } if (fields.length > 0) { focusField.focus(); alert(fields.join('/n')); } return isValid; }]]> </javascript>
</validator> |
<javascript>中为客户端脚本。
然后创建QiuchunChecks.java
package org.apache.struts.webapp.example;
import java.io.Serializable; import java.util.Date; import java.util.Locale; import javax.servlet.http.HttpServletRequest;
import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.commons.validator.Field; import org.apache.commons.validator.GenericTypeValidator; import org.apache.commons.validator.GenericValidator; import org.apache.commons.validator.ValidatorAction; import org.apache.commons.validator.ValidatorUtil; import org.apache.struts.action.ActionErrors; import org.apache.struts.validator.*;
public class QiuchunChecks implements Serializable {
/** * Commons Logging instance. */ private static final Log log = LogFactory.getLog(QiuchunChecks.class);
public static final String FIELD_TEST_NULL = "NULL"; public static final String FIELD_TEST_NOTNULL = "NOTNULL"; public static final String FIELD_TEST_EQUAL = "EQUAL";
/** * 检查是否是正确的身份证号码,满足条件:长度为参数idcardlength的值,开头为51010,参数idcardlength在前面的validation.xml配置中 * A <code>Null</code> will be considered an error. * * @param bean The bean validation is being performed on. * @param va The <code>ValidatorAction</code> that is currently being performed. * @param field The <code>Field</code> object associated with the current * field being validated. * @param errors The <code>ActionErrors</code> object to add errors to if any * validation errors occur. * @param request Current request object. * @return True if stated conditions met. */ public static boolean validateIDCard(Object bean, ValidatorAction va, Field field, ActionErrors errors, HttpServletRequest request) {
String value = null; if (isString(bean)) { value = (String) bean; } else { value = ValidatorUtil.getValueAsString(bean, field.getProperty()); }
if (!GenericValidator.isBlankOrNull(value)) { try {
int min = Integer.parseInt(field.getVarValue("idcardlength")); if (value.length()!=min) { errors.add(field.getKey(), Resources.getActionError(request, va, field)); return false; } else{ int numtemp = Integer.parseInt(value); numtemp = Integer.parseInt(value.substring(0,5)); if (numtemp!=51010){ errors.add(field.getKey(), Resources.getActionError(request,va,field)); return false; }
}
} catch (Exception e) { errors.add(field.getKey(), Resources.getActionError(request, va, field)); return false; } }
return true; } } |
配置properties 文件(蓝字为本例使用的message):
# Standard error messages for validator framework checks errors.required={0} is required. errors.minlength={0} cannot be less than {1} characters. errors.maxlength={0} cannot be greater than {2} characters. errors.invalid={0} is invalid. errors.byte={0} must be an byte. errors.short={0} must be an short. errors.integer={0} must be an integer. errors.long={0} must be an long. errors.float={0} must be an float. errors.double={0} must be an double. errors.date={0} is not a date. errors.range={0} is not in the range {1} through {2}. errors.creditcard={0} is not a valid credit card number. errors.email={0} is an invalid e-mail address. errors.idcard={0} is an invalid identity card. IdCard must have {3} length and prefix 51010!
|