关于struts中validate的几种情况(转)
说明:这里采用了struts版本为 struts-1.2.7 ,是在 struts-blank 的基础上演示的,为了以后的学习和参考用。
一、 在对应的 Form Beans 中重载 validate 方法
在 struts-config.xml 文件中, action 节点下有“ validate ”这样一个属性。在 struts 框架中,默认属性是 validate=”true” 。所以如果想通过 Form Beans 的重载 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 Beans ,有两种方式可供选择:
① 写的 formBean 需要继承 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"/>
② 动态formBean
<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"> 所对应的内容
②在 <html:form 中追加一个属性 onsubmit="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"/>
这只是一种方式,还有其他简洁的(具体为啥这样,不是很明白,希望得到高人指点)
比如:追加 onsubmit="return validateUserForm(this);"
<html:javascript formName="userForm" staticJavascript="true"/>