您的位置:首页 > 编程语言 > Java开发

struts中的验证框架的使用

2016-03-17 10:24 926 查看

步骤

**

1 环境配置:

**

首先要为struts加入Validator支持

lib包:加入validator所需的jar包

配置文件:struts-config.xml里加入



由于Validator是Struts的一个插件,因此,就需要在struts-config.xml文件中按着Struts插件的方式来安装Validator框架。打开struts-config.xml文件,在元素中加入一个子元素,如下面的代码所示

<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
</plug-in>


其中元素设置了插件中使用的pathnames属性的值。在pathnames属性值中包含了两个xml文件。

(1)validator-rules.xml:在这个文件中声明了Validator框架的预定义验证。这个文件可以在Struts的发行包的lib目录中可以找到这个文件。在使用MyEclipse为Web工程添加Struts功能后,会自动将这个文件加到WEB-INF目录中。

(2)validator.xml:这个文件定义了要验证的对象。实际上,在这个文件中,包含了一个或多个ActionForm的子类及其要验证的属性和验证规则。因此,这个文件就相当于validate方法。在Validator框架中,可以有多个定义验证对象的xml文件(可以将不同的ActionForm的子类分散到不同的xml文件中),中间用逗号(,)隔开,如下面的代码所示:

<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml, /WEB-INF/validator1.xml,
/WEB-INF/validator2.xml, /WEB-INF/validator3.xml" />
</plug-in>


在这里你也可以直接使用MyEclipse添加struts支持,这样会自动生成以下文件:



打开validator-rules.xml文件:

<!--
$Id: validator-rules.xml,v 1.1.2.1 2006/07/01 20:50:46 eugene-proddev Exp $

This file contains the default Struts Validator pluggable validator
definitions.  It should be placed somewhere under /WEB-INF and
referenced in the struts-config.xml under the plug-in element
for the ValidatorPlugIn.

<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml,
/WEB-INF/validation.xml"/>
</plug-in>

These are the default error messages associated with
each validator defined in this file.  They should be
added to your projects ApplicationResources.properties
file or you can associate new ones by modifying the
pluggable validators msg attributes in this file.

# Struts Validator Error Messages
errors.required={0} is required.
errors.minlength={0} can not be less than {1} characters.
errors.maxlength={0} can not be greater than {1} characters.
errors.invalid={0} is invalid.

errors.byte={0} must be a byte.
errors.short={0} must be a short.
errors.integer={0} must be an integer.
errors.long={0} must be a long.
errors.float={0} must be a float.
errors.double={0} must be a double.

errors.date={0} is not a date.
errors.range={0} is not in the range {1} through {2}.
errors.creditcard={0} is an invalid credit card number.
errors.email={0} is an invalid e-mail address.

Note: Starting in Struts 1.2.0 the default javascript definitions have
been consolidated to commons-validator. The default can be overridden
by supplying a <javascript> element with a CDATA section, just as
in struts 1.1.

-->


来解释一下其中的含义:

这个文件包含struts验证框架默认的验证准则的定义,它应该被放在/WEB-INF下,且使用插件注入的当时在struts-config.xml注入 ,使用plug-in标签。

这里有些默认的错误消息和验证准则相对应,加到你定义的资源文件中或者关联一个新的,修改验证消息的属性。

在validator框架中使用JavaScript

  1 默认情况下,validator框架在服务器端执行表单验证。也可以在客户端验证。

如果在客户端验证,需要使用struts的标签,他能在jsp页面中生成用于客户端验证的JavaScript的脚本。

在validator-rules.xml文件的元素中配置元素默认struts框架的validator-rules.xml文件已经包含了javascript子元素。也可以将这些javascript集中放到一个validator.js的文件中,在页面中引入代码

<script language=”Javascript1.1″ src=”js/validator.js”>< /script>


2 在Jsp页面中包含< html:javascript>

< html:javascript formName=”loginForm”>


这个标签的form的name属性制定需要验证的表单名字,他能够访问为表单配置的验证规则的javascript元素,把包含的脚本写到jsp页面中,生成validateLoginForm的函数,负责执行验证逻辑或

<html:javascript dynamicJavascript=”true” staticJavascript=”true” formName=”userForm”/>


3 对需要验证的表单定义onsubmit事件

4 代码

<html:form  method=”post”  action=”regist.do” onsubmit=”return validateUserForm(this)”>




< html:form action=”manageContract.do” onsubmit=”return validateContractForm(this);”>


5 用户在表单上提交后,就会调用

  标签生成的js脚本validateLoginForm函数,执行验证。如果验证失败,就会弹出对话框提示,

  不会提交的服务器端。

**

2 使用Validator框架的一个例子

**

在本节将举一个例子来演示如何使用Validator框架来验证数据。我们需要按着如下的六步来完成这个例子:

【第1步】建立FirstValidatorForm类(ValidatorForm的子类)

在工程目录\src\actionform目录中建立一个FirstValidatorForm.java文件,代码如下:

package actionform;

import org.apache.struts.validator.ValidatorForm;

public class FirstValidatorForm extends ValidatorForm // 必须从ValidatorForm继承
{
private String name;
private String age;
private String email;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public String getAge() {
return age;
}

public void setAge(String age) {
this.age = age;
}
}


要注意的是,要想使用Validator框架验证数据,Form类就必须从ValidatorForm继承,而不能从ActionForm继承。这是因为ValidatorForm类是从ActionForm继承的,在ValidatorForm类中已经覆盖了validate方法来自动进行验证工作,因此,我们在ValidatorForm的子类中就不用写validate方法了。

【第2步】建立ValidatorAction类(Action的子类)

在工程目录\src\action目录中建立一个ValidatorAction.java文件,代码如下:

package action;

import javax.servlet.http.*;
import org.apache.struts.action.*;

public class ValidatorAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
response.setCharacterEncoding("GBK");
try {
response.getWriter().println("验证成功!");
} catch (Exception e) {
}
return null;
}
}


ValidatorAction类是一个空的Struts动作类(除了输出一行“验证成功!”字符串)。这个动作是为了正常运行含有Struts元素的JSP程序所编写的。在以后的代码中会经常使用到这个Struts动作类。

【第3步】配置struts-config.xml文件

配置FirstValidatorForm和ValidatorAction的代码如下所示

<form-bean name="firstValidatorForm" type=" actionform.FirstValidatorForm" />
<action name="firstValidatorForm" path="/firstValidator" scope="request"
type=" action.ValidatorAction" input="/firstValidator.jsp" />


其中firstValidator.jsp是用户录入信息的界面,也是显示错误信息的界面。

【第4步】建立firstValidator.jsp

在Web根目录建立一个firstValidator.jsp文件,代码如下:

<%@ page pageEncoding="GBK"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<html>
<head>
<title>第一个Validator程序</title>
</head>
<body>
<html:form action="firstValidator">
姓 名:
<html:text property="name" />  
<font color="red">
<html:errors property="name" />
</font>
<p>
年 龄:
<html:text property="age" />  
<font color="red">
<html:errors property="age" />
</font>
<p>
EMail:
<html:text property="email" />  
<font color="red">
<html:errors property="email" />
</font>
<p>
<html:submit value="提交" />
</html:form>
</body>
</html>


从firstValidator.jsp中可以看出,不管是否使用Validator框架进和验证,对于JSP代码来说是完全一样的。仍然是使用元素来显示错误信息。但要注意,在使用Validator框架时,标签的property属性的值就是所对应ValidatorForm的子类的属性名。

【第5步】配置validator.xml文件

在本例中只使用了一个XML文件(validator.xml)来配置要验证的对象。validator.xml的代码如下:

<?xml version="1.0" encoding="GBK" ?>
<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">
<form-validation>
<formset>
<form name="firstValidatorForm">
<field property="name" depends="required,maxlength,minlength,mask">
<msg name="required" key="error.name.blank" />
<msg name="minlength" key="error.name.minLength" />
<msg name="maxlength" key="error.name.maxLength" />
<msg name="mask" key="error.name.alphanum" />

<arg name="minlength" key="${var:minlength}" position="0"
resource="false" />
<arg name="maxlength" key="${var:maxlength}" position="0"
resource="false" />
<var>
<var-name>minlength</var-name>
<var-value>5</var-value>
</var>
<var>
<var-name>maxlength</var-name>
<var-value>10</var-value>
</var>
<var>
<var-name>mask</var-name>
<var-value>^[a-zA-Z0-9]*$</var-value>
</var>
</field>
<field property="age" depends="required,integer,intRange">
<msg name="required" key="error.age.blank" />
<msg name="integer" key="error.age.integer" />
<msg name="intRange" key="error.age.intRange" />

<arg name="intRange" key="${var:min}" position="0" resource="false" />
<arg name="intRange" key="${var:max}" position="1" resource="false" />
<var>
<var-name>min</var-name>
<var-value>18</var-value>
</var>
<var>
<var-name>max</var-name>
<var-value>60</var-value>
</var>
</field>
<field property="email" depends="required,email">
<msg name="required" key="error.email.blank" />
<msg name="email" key="error.email.invalid" />
</field>
</form>
</formset>
</form-validation>


validator.xml文件中的所有配置都放到元素中。在元素中有一个子元素,这个元素可以定义多个元素,这个元素用来定义要验证的ValidatorForm类的子类。其中name属性值就是元素中的name属性值。

元素用来定义某个属性的约束条件,如第一个元素定义了name属性必须存在(required)、必须要满足最小长度(minlength)和最大长度(maxlength)以及还要通过mask所指的正则表达式的验证。

元素用来定义出错信息在属性文件中的Key(所有的出错信息都在属性文件中)。元素用来向出错信息中的参数传递参数值。元素用来定义变量名和变量值。

【第6步】在ErrorDescription.properties文件中添加错误信息

打开ErrorDescription.properties文件,在文件的后面添加如下的内容:

error.name.blank = 姓名不能为空
error.name.minLength = 姓名的长度不能小于{0}
error.name.maxLength = 姓名的长度不能大于{0}
error.name.alphanum = 姓名必须由字母和数字组成
error.age.blank = 年龄不能为空
error.age.integer = 年龄必须为数字
error.age.intRange = 年龄必须在{0}和{1}之间


启动Tomcat,在IE中输入如下的URL来测试程序:

http://localhost:8080/samples/%20firstValidator.jsp

在输入一些错误信息后,点击“提交”按钮,将出现类似下图的效果。



**

3 一些问题:

**

3.1关于验证的执行问题

执行流程,我简单叙述一下:

1 通过验证页面的form:action=“/xxx.do”定位到struts-config.xml中的action

2 通过action中的name=“xxxForm”定位到配置文件中的form

3 通过form:type=“”定位到继承了ValidatorForm的ActionForm

4 这个ActionForm会自动调用validate()方法进行验证,而验证规则是在

validation-rules.xml和validation.xml两个文件中有定义

5 去validation-rules.xml和validation.xml两个文件中验证

6 验证中需要引用资源文件中的定义

7 执行完验证,会调用action中的execute方法,返回验证通过

可以参见下图:



在这里我也贴出没有继承ValidatorForm的执行流程,下面我会对ActionForm做一个详细的解释,这里贴出来主要是牵涉到两个问题;

1 验证页面怎么显示错误信息的,牵涉到标签的使用

2 资源文件中绑定的错误信息,去哪了,其实是内部执行了类似于下图中的new errors方法绑定键值对,然后在通过标签在验证页面输出的



3.2 关于ActionForm的一些问题

先简单说一下Struts中ActionForm和ValidatorForm,ActionForm和

DynaActionForm的区别

ActionForm和ValidatorForm区别:

下面看一个csdn的问题:

问:

一个 ActionForm继承了ValidatorForm 就不用写具体的验证了吗?

答:

是的,但是你需要提供

validation-rules.xml 和 validation.xml

ValidatorForm会调用validate() 方法进行验证,而验证规则是在以上两个文件定义

说明:

1.相同点:ActionForm和ValidatorForm都不是动态的Form,所以一定一个form对应一个FormBean类;

2.不同点:如果是继承了ValidatorForm的话,就不必在FormBean中加入validate()方法(应该说是不必覆盖其方法),而实际上是调用了validate()方法进行验证,而验证规则是在validation-rules.xml和validation.xml两个文件中有定义.

PS: 在实践中得出结论:

如果在ValidatorForm中重写了validate方法,则程序不会从validation-rules.xml和validation.xml两个文件中进行验证.而是执行重写了的validate方法里面的内容.如果不重写此方法,则仍然会执行此方法,而此方法中默认会从上述两个文件中进行验证.

所以,我们多数从继承了ValidatorForm的类中看到没有validate方法,取而代之是修改成的validator方法(在视频教程中,作者是把validate改成validator,其它都没有改变).目的是去除掉一个重写的validate方法,而且validator方法也不会被使用,巧妙的屏蔽了通过validate方法来验证的功能.

PS2: 在实践中得出结论:

服务器验证和客户端验证(通过javascript)的区别:

1.客户端验证,由于暴露代码,会降低安全性,服务器验证相对安全.

2.客户端验证减缓服务器负担.

3.值得一提的区别是:在按确定提交表单的时候,是先进行验证,如果验证成功,则继续使用validate方法进行验证.如果验证不成功,则中止验证过程,不会使用validate方法.

ActionForm和DynaActionForm区别

1.dyna是动态的,由actionform继承而来,之所以有这个东西是因为,它特点是不需要FormBean,而是在struts-config.xml中通过form-property来设置form的表单字段属性.优势是减少在大型开发过程中formbean的增加而显得程序臃肿,给维护和升级带来极大的不便.

2.需要注意的是: 在JSP或Action中访问动态ActionForm时与标准的ActionFrom有所不同,标准ActionForm为每个属性均提供了一对getXXX()/setXXX()方法,通过调用getxxx()/setxxx()方法即可读取或设置ActionForm某个属性.而DynaActionForm则把所有的属性保存在一个Map类对象中,只能通过get()和put()来存取其属性值.

如,从动态表单实例中读取会员的注册信息:

String username=form.get(“username”).toString();

String password=form.get(“password’).toString();

String phone=form.get(“phone”).toString();

String email=form.get(“email”).toString();

String address=form.get(“address”).toString();

具体解释可以看这个链接:

/article/7736572.html

3.3 关于html:errors与html:messages标签的问题

可以看这篇文章:

/article/7736573.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: