分享
 
 
 

Struts Validation框架浅尝1

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

Struts Validation框架浅尝

胡键(james.hu@chinacodeline.com)

西安烁程软件有限公司

2004年3月

前言

早就听说Struts1.1中Validate框架的种种好处,这次借着项目采用了Struts,简单的研究了一下它的用法。在这个过程中体会到了它的好处,但是它也存在着一些小小的问题。在此一并写出与大伙分享。作者使用的环境是Struts1.1。

配置Struts Validation框架

相信正在阅读本文的读者都是对struts有一定经验的,对于struts到哪去下载、如何安装配置就不必笔者多言。此处仅仅只讨论struts validation框架的安装和配置。通常,我们有2种方法来进行这个过程。

- 方法一:

从struts自带的webapps目录下解压struts-balnk.war到项目的web工程目录。这是最简单创建struts工程的方式,在这个工程中就已经包含了一个struts应用的所有需要的开发包和这些包的基本配置,自然也包含了其中的validation框架。它非常适合在项目的初创阶段,我们所需做的就是在这个空白工程中填点什么就可以了。

- 方法二:

对于已经存在的struts工程,如何添加valiadation框架支持所需的步骤也非常简单。

1. 首先在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>

2. 然后在web-inf目录中创建2个文件validator-rules.xml,validation.xml。(这2个文件也可从struts-balnk.war中获取)。

3. 复制validation框架所需要的类包到web-inf/lib下,这些类包是:common-validator.jar。

这样,我们就可以使用struts的validation框架了。

使用validation框架

花了这么多工夫作准备就是为了使用它,在这个部分我们来看看它是如何使用的。在struts1.1出现以前,验证是在formbean的validate方法和action的validate方法中进行。在formbean处,我们进行的主要是界面输入的有效性判断,而在action处,主要是业务逻辑的有效性判断。而在1.1提出的validation框架,个人觉得它更着重于formbean的有效性判断。

Struts的创建者为什么会在struts1.1中提出一个validation框架呢?关于这方面的回答和资料网上已经有太多,归结起来主要就是验证方法的复用、维护、以及开发的效率。在解释之前,通过一个简单的例子来了解validation框架是如何在strtuts中使用的。

问题

这是一个简单的用户管理程序,使用者可以对用户信息进行相应的CRUD操作(增查改删)。其中用户信息包含用户名称、用户地址、用户描述、用户密码。对于以上的各种操作,约束如下:

- 增加和修改:用户名称、用户地址、用户密码、用户密码确认为必填项,同时密码和确认密码2个域的值必须一致。

- 删除和查询:用户名称为必填项。

解决和使用步骤

在此,笔者列出struts1.1和之前版本的异同部分,方便读者进行比较和判断。

1. 创建struts项目的基本环境。

² 在1.1中添加了validation框架的支持,参见上一节的做法。

2. 创建相应的页面,确定页面流程(page flow)。

3. 创建相应的formbean:

² strut1.1版本解决办法:

为了简单起见使用DynaActionForm。又由于使用了validation框架,此处使用DynaValidatorForm。struts-config.xm的内容:

<form-bean name="editForm" type="org.apache.struts.validator.DynaValidatorForm">

<form-property name="id" type="java.lang.Integer"/>

<form-property name="name" type="java.lang.String"/>

<form-property name="pwd1" type="java.lang.String"/>

<form-property name="pwd2" type="java.lang.String"/>

<form-property name="address" type="java.lang.String"/>

<form-property name="desc" type="java.lang.String"/>

</form-bean>

然后,修改web-inf目录下的validation.xml文件内容,其中form的名字和各域的名字必须和struts-config.xml中一致:

<form name="/editForm ">

<field property="name" depends="required">

<arg0 key="editForm.name"/>

</field>

<field property="pwd1" depends="required,mask">

<arg0 key="editForm.password"/>

<var>

<var-name>mask</var-name>

<var-value>^[0-9a-zA-Z]*$</var-value>

</var>

</field>

<field property="pwd2" depends="required,mask">

<arg0 key="editForm.password"/>

<var>

<var-name>mask</var-name>

<var-value>^[0-9a-zA-Z]*$</var-value>

</var>

</field>

<field property="address" depends="required ">

<arg0 key="editForm.address"/>

</field>

</form>

² 1.1之前的解决办法

老老实实地写ActionForm的子类,覆盖validate方法。

4. 创建相应的Action,同时Action的validate属性置为true,以启用validation框架。

5. 书写ApplicationResources.properties,添加错误信息。

² struts1.1

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.

editForm.name= name.

editForm.password= password.

editForm.address= address

² 1.1之前的解决方法,与之类似。

6. 在相应的jsp中添加<html:errors/>。

从整个使用过程来看,就验证部分而言,使用struts1.1的开发效率大大的得到了提高,而且通过validator-rules.xml使验证方法能被不同的formbean复用,而且可维护性也大大的得到提高。通过mask,使得单个页面域的验证非常灵活。

但是细心的读者可能也发现了这个验证文件仅仅指明2个password域是必填的,但并没有满足他们必须是相等的这种情形的判断,对于这一点,我们可使用自定义的validator并将它添加到validator-rules.xml文件中来完成。

创建自定义的validator

对于validator的创建,可以归结为3步:

1. 创建validator类,validator必须包含一个以valid开始的方法,并且它的函数签名必须如下:

validXXX(java.lang.Object,

org.apache.commons.validator.ValidatorAction,

org.apache.commons.validator.Field, org.apache.struts.action.ActionErrors,

javax.servlet.http.HttpServletRequest, javax.servlet.ServletContext)

在本例中,自定义的Validator如下(摘至Struts提供的例子,用来提供2个域的相等性检查):

public class CustomValidator {

public CustomValidator() {

super();

}

public static boolean validateTwoFields( Object bean,

ValidatorAction va, Field field, ActionErrors errors, HttpServletRequest request) {

String value = ValidatorUtil.getValueAsString(bean, field.getProperty());

String sProperty2 = field.getVarValue("secondProperty");

String value2 = ValidatorUtil.getValueAsString(bean, sProperty2);

if (!GenericValidator.isBlankOrNull(value)) {

try {

if (!value.equals(value2)) {

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;

}

}

2. 添加到validator-rules.xml文件中:

<validator name="twofields" classname="examples.validator.CustomValidator"

method="validateTwoFields" methodParams="java.lang.Object,

org.apache.commons.validator.ValidatorAction, org.apache.commons.validator.Field,

org.apache.struts.action.ActionErrors, javax.servlet.http.HttpServletRequest"

msg="errors.twofields" />

在对应的属性文件中添加对应的消息(errors.twofiled)。

3. 在validation.xml中使用:

<field property="pwd1" depends="required,twofields">

<arg0 key="editForm.password" />

<arg1 name="twofields" key=" editForm.password2" />

<var>

<var-name>secondProperty</var-name>

<var-value>pwd2</var-value>

</var>

</field>

通过自定义validator,validation框架的可扩展性大大的得到提高。而且也使得不同的验证方法能够很好的得到复用

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有