一、 在对应的 Form Baens 中重写 validate 方法
在 struts-config.xml 文件中, action 节点下有“ validate ”这样一个属性。在 struts 框架中,默认属性是 validate=”true” 。所以如果想通过 Form Baens 的重载 validate 方法来验证数据的话,可以不用理会这一点。
题外话:如果你在
struts-config.xml
文件中,设置
validate="false"
的话,
validate
方法将不起作用。这一点同样对
Validate
框架来验证数据起作用。
二、 通过 Validate 框架来验证数据
1 、 首先在 struts-config.xml 文件中,追加如下代码:
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames"
value="/WEB-INF/validator-rules.xml,/WEB-INF/validations.xml"/>
<set-property property="stopOnFirstError" value="false"/>
</plug-in>
2 、然后编写自己的 Form Baens ,有两种方式可供选择:
① 写的 formBaen 需要继承
ValidatorForm
,而不是第一种方法中的
ActionForm
public class UserForm extends ValidatorForm {
private String userId = "";
private String password = "";
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserId() {
return userId;
}
。。。。。。
然后配置 struts-config 文件
<form-bean name="userForm"
type="com.wxhx.presentation.UserForm"/>
② 配置 struts-config 文件
<form-beans>
<form-bean name=" userForm"
type="org.apache.struts.validator.DynaValidatorForm">
<form-property name=" userId" type="java.lang.String"/>
<form-property name="password" type="java.lang.String"/>
</form-bean>
</form-beans>
3 、配置
validation.xml
文件
<formset>
<form name="userForm"> ----
这里的
userForm
是
Form Beans
的名字
<field
property="userId"
depends="required">
<arg key="userForm.userId"/>
</field>
<field
property="password"
depends="required,mask">
<arg key="userForm.password"/>
<var>
<var-name>mask</var-name>
<var-value>^[0-9a-zA-Z]*$</var-value>
</var>
</field>
</form>
</formset>
其中
key="userForm.userId"
和
key="userForm.password"
需要在资源文件中配置
这里需要说明一点,例如:
<arg key="userForm.password" resource="false"/>
如果多了
resource="false"
这句话,那么它不会再从资源文件中去取,而是直接用
key
值来表示。
以上是通过
validatorForm- or DynaValidatorForm
来实现 Validate 验证的
(附)
现在有这样一个问题, Form Beans 可以被多个 Action 应用,而每个 Action 可能需要的验证字段都不一样。而在
validation.xml
中配置的验证方式(如
<form name="userForm">
)是对这个 Form Beans 进行的。这样的话,如何来验证呢?
你的 Form Beans 可以继承
ValidatorActionForm
(当然可以直接配置
DynaValidatorActionForm
)。如下所示:
public class UserForm extends ValidatorActionForm {
...
}
或是
<form-bean name=" userForm "
type="org.apache.struts.validator.DynaValidatorActionForm">
...
</form-bean>
struts-config 文件配置如下:
<action-mappings>
<action path="/technology/createUser"
type="com.wxhx.minihr.CreateUserAction"
name="userForm"/>
<action path="/technology/editUser"
type="com.wxhx.minihr.EditUserAction"
name="userForm"/>
</action-mappings>
validation.xml 文件配置如下:
<formset>
<form name="/technology/ createUser ">
----
这里的采用的是
action
的
path
路径
<field property="city"
depends="required">
<arg0 key="prompt.city"/>
</field>
</form>
<form name="/technology/editUser ">
<field property="state"
depends="required">
<arg0 key="prompt.state"/>
</field>
</form>
</formset>
关于 validator-rules.xml ,定义了常用的一些规则,当然也可以自己追加新的规则。
这里经常会看到
msg="errors.required"
字样,也是通过资源文件中配置的,默认的资源如下:
# -- validator --
errors.invalid={0} is invalid.
errors.maxlength={0} can not be greater than {1} characters.
errors.minlength={0} can not be less than {1} characters.
errors.range={0} is not in the range {1} through {2}.
errors.required={0} is required.
errors.byte={0} must be an byte.
errors.date={0} is not a date.
errors.double={0} must be an double.
errors.float={0} must be an float.
errors.integer={0} must be an integer.
errors.long={0} must be an long.
errors.short={0} must be an short.
errors.creditcard={0} is not a valid credit card number.
errors.email={0} is an invalid e-mail address.
这在 struts-blank 的例子中会有,在开发项目的时候,注意这些默认资源
关于自己定义规则,以后再作研究
三、 结合上面的两种验证
如果即在 Form Beans 中重载了 validate 方法,又启用了 Validate 框架,那会是什么效果呢?
由于要启用 Validate 框架, Form Beans 需要继承 ValidatorForm ,查看 ValidatorForm 的源代码,发现 validate 方法已经作了处理(真是为 Validate 框架所服务的)。
那么在 Form Beans 中重载了 validate 方法的话,就会覆盖原有 ValidatorForm 中对应的功能,所以如果想一起用的话,需要在 Form Beans 的 validate 方法中调用 errors = super.validate(mapping, request); 这句代码是启用 Validate 框架所要做的工作,然后可以判断 errors 再作下一步的处理。
当然也可以先做 Form Beans 中的 validate 方法,然后启用 Validate 框架,要看具体情况而定。
四、 启用客户端验证
也是结合
validation.xml
来验证的,我把
validation.xml
相关的内容在复制下来,便于看清楚:
<formset>
<form name="userForm"> ----
这里的
userForm
是
Form Beans
的名字
<field
property="userId"
depends="required">
<arg key="userForm.userId"/>
</field>
<field
property="password"
depends="required,mask">
<arg key="userForm.password"/>
<var>
<var-name>mask</var-name>
<var-value>^[0-9a-zA-Z]*$</var-value>
</var>
</field>
</form>
</formset>
在需要 客户端验证的jsp 中加上这么一句<html:javascript formName=" userForm "/>
其中 formName 就是 validation.xml 中 <form name="userForm"> 所对应的内容
在需要 客户端验证的jsp 中加上这么一句<html:javascript formName=" userForm "/>
其中 formName 就是 validation.xml 中 <form name="userForm"> 所对应的内容
②在 <html:form 中追加一个属性 οnsubmit="return validateUserForm(this);"
它的语法为: return validate + struts-config.xml 中定义的 form-bean 名称 + (this);
③追加 <scriptlanguage="Javascript1.1" src="staticJavascript.jsp"></script>
staticJavascript.jsp 的内容为:
<%@ page language="java" %>
<%-- set document type to Javascript(addresses a bug in Netscape according
to a web resource --%>
<%@ page contentType="application/x-javascript" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<html:javascript dynamicJavascript="false" staticJavascript="true"/>
这只是一种方式,还有其他简洁的(具体为啥这样,不是很明白,希望得到高人指点)
比如:追加 οnsubmit="return validateUserForm(this);"
<html:javascript formName="userForm" staticJavascript="true"/>
自定义validator
这是一个展示你怎样才能比较两个字段是否有一样的值的例子。比如“用户改变他们的口令“一般会有口令字段和一确认字段。
<validator name="identical"
classname="study.struts.lesson02.validator.IdentityValidator"
method="validateIdentical"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends="required" msg="errors.identical" />
classname="study.struts.lesson02.validator.IdentityValidator"
method="validateIdentical"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionMessages,
org.apache.commons.validator.Validator,
javax.servlet.http.HttpServletRequest"
depends="required" msg="errors.identical" />
public class IdentityValidator {
public static boolean validateIdentical(java.lang.Object bean,
org.apache.commons.validator.ValidatorAction va,
org.apache.commons.validator.Field field, ActionMessages errors,
org.apache.commons.validator.Validator validator,
javax.servlet.http.HttpServletRequest request) {
org.apache.commons.validator.ValidatorAction va,
org.apache.commons.validator.Field field, ActionMessages errors,
org.apache.commons.validator.Validator validator,
javax.servlet.http.HttpServletRequest request) {
String value2 = ValidatorUtils.getValueAsString(bean, field
.getProperty());
String property1 = field.getVarValue("firstProperty");
String value1 = ValidatorUtils.getValueAsString(bean, property1);
if (!GenericValidator.isBlankOrNull(value2)) {
if (value2.equals(value1)) {
return true;
}
.getProperty());
String property1 = field.getVarValue("firstProperty");
String value1 = ValidatorUtils.getValueAsString(bean, property1);
if (!GenericValidator.isBlankOrNull(value2)) {
if (value2.equals(value1)) {
return true;
}
}
errors.add(field.getProperty(), Resources.getActionMessage(request, va,
field));
errors.add(field.getProperty(), Resources.getActionMessage(request, va,
field));
return false;
}
}
}
}
<field property="password2"
depends="identical">
<arg0 key="page.register.lable.password2" />
<arg0 name="identical" key="page.register.lable.password2"/>
<arg1 name="identical" key="page.register.lable.password1"/>
<var>
<var-name>firstProperty</var-name>
<var-value>password1</var-value>
</var>
</field>
depends="identical">
<arg0 key="page.register.lable.password2" />
<arg0 name="identical" key="page.register.lable.password2"/>
<arg1 name="identical" key="page.register.lable.password1"/>
<var>
<var-name>firstProperty</var-name>
<var-value>password1</var-value>
</var>
</field>