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

Struts原理与实践(6)

2007-01-25 14:12 357 查看
www.javabc.com本文我们来讨论一下Struts中的输入校验问题。我们知道,信息系统有垃圾进垃圾出的特点,为了避免垃圾数据的输入,对输入进行校验是任何信息系统都要面对的问题。在传统的编程实践中,我们往往在需要进行校验的地方分别对它们进行校验,而实际上需要校验的东西大多都很类似,如必需的字段、日期、范围等等。因此,应用程序中往往到处充斥着这样一些显得冗余的代码。而与此形成鲜明对照的是Struts采用Validator框架(Validator框架现在是JakartaCommons项目的一部分)来解决校验问题,它将校验规则代码集中到外部的且对具体的应用程序中立的.xml文件中,这样,就将那些到处出现的校验逻辑从应用程序中分离出来,任何一个Struts应用都可以使用这个文件,同时还为校验规则的扩展提供了便利。更难能可贵的是由于Validator框架将校验中要用到的一些消息等信息与资源绑定有机结合在一起,使得校验部分的国际化编程变得十分的便捷和自然。Validator框架大致有如下几个主要组件:Validators:是Validator框架调用的一个Java类,它处理那些基本的通用的校验,包括required、mask(匹配正则表达式)、最小长度、最大长度、范围、日期等.xml配置文件:主要包括两个配置文件,一个是validator-rules.xml,另一个是validation.xml。前者的内容主要包含一些校验规则,后者则包含需要校验的一些form及其组件的集合。资源绑定:提供(本地化)标签和消息,缺省地共享struts的资源绑定。即校验所用到的一些标签与消息都写在ApplicationResources.properity文件中。Jsptag:为给定的form或者actionpath生成JavaScriptvalidations。ValidatorForm:它是ActionForm的一个子类。为了对Validator框架有一个比较直观的认识,我们还是以前面的登陆例子的输入来示范一下Validator框架的使用过程:首先,找一个validator-rules.xml文件放在mystruts/WEB-INF目录下,下面是该文件中涉及到的required验证部分代码的清单:
<!--①-->
classname="org.apache.struts.validator.FieldChecks"
method="validateRequired"
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.required">
<!--③-->
<![CDATA[<![CDATA[
functionvalidateRequired(form){
varisValid=true;
varfocusField=null;
vari=0;
varfields=newArray();
oRequired=newrequired();
for(xinoRequired){
varfield=form[oRequired[x][0]];

if(field.type=='text'||
field.type=='textarea'||
field.type=='file'||
field.type=='select-one'||
field.type=='radio'||
field.type=='password'){

varvalue='';
//getfield'svalue
if(field.type=="select-one"){
varsi=field.selectedIndex;
if(si>=0){
value=field.options[si].value;
}
}else{
value=field.value;
}

if(trim(value).length==0){

if(i==0){
focusField=field;
}
fields[i++]=oRequired[x][1];
isValid=false;
}
}
}
if(fields.length>0){
focusField.focus();
alert(fields.join('/n'));
}
returnisValid;
}

//Trimwhitespacefromleftandrightsidesofs.
functiontrim(s){
returns.replace(/^/s*/,"").replace(//s*$/,"");
}

]>

①节的代码是引用一个服务器边的验证器,其对应的代码清单如下:
publicstaticbooleanvalidateRequired(Objectbean,
ValidatorActionva,Fieldfield,
ActionErrorserrors,
HttpServletRequestrequest){

Stringvalue=null;
if(isString(bean)){
value=(String)bean;
}else{
value=ValidatorUtil.getValueAsString(bean,field.getProperty());
}

if(GenericValidator.isBlankOrNull(value)){
errors.add(field.getKey(),Resources.getActionError(request,va,field));
returnfalse;
}else{
returntrue;
}
}

②节是验证失败后的出错信息,要将对应这些键值的信息写入到ApplicationResources.properity文件中,常见的错误信息如下:
#Standarderrormessagesforvalidatorframeworkchecks
errors.required={0}isrequired.
errors.minlength={0}cannotbelessthan{1}characters.
errors.maxlength={0}cannotbegreaterthan{1}characters.
errors.invalid={0}isinvalid.
errors.byte={0}mustbeabyte.
errors.short={0}mustbeashort.
errors.integer={0}mustbeaninteger.
errors.long={0}mustbealong.
errors.float={0}mustbeafloat.
errors.double={0}mustbeadouble.
errors.date={0}isnotadate.
errors.range={0}isnotintherange{1}through{2}.
errors.creditcard={0}isaninvalidcreditcardnumber.
errors.email={0}isaninvalide-mailaddress.

③节的代码用于客户边的JavaScript验证其次,在validation.xml文件中配置要验证的form极其相应的字段,下面是该文件中的代码:
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEform-validationPUBLIC"-//ApacheSoftwareFoundation
//DTDCommonsValidatorRulesConfiguration1.0//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">
<form-validation>

<formname='userInfoForm'>

mask
^/w

minlength
2

maxlength
16

minlength
2

maxlength
16

</form>

</form>

这里要注意的是:该文中的和中的键值都是取自资源绑定中的。前面还讲到了出错信息也是写入ApplicationResources.properity文件中,因此,这就为国际化提供了一个很好的基础。再次,为了使服务器边的验证能够进行,将用到的formBean从ActionForm的子类改为ValidatorForm的子类,即:
将publicclassUserInfoFormextendsActionForm改为:publicclassUserInfoFormextendsValidatorForm到此,进行服务器边的验证工作已经一切准备得差不多了,此时,只要完成最后步骤就可以实验服务器边的验证了。但大多数情况下,人们总希望把这些基本的简单验证放在客户边进行。为了能进行客户边的验证,我们还要对logon.jsp文件做适当的修改。将

改为

在标签后加上:

最后,对struts的配置文件struts-config.xml作适当的修改:
1、将

改为

其作用是要求进行校验2、将下列代码放在struts-config.xml文件中的标签前。其作用是将用于校验的各个组件结合在一起。

到此为止,我们的一切工作准备就绪,您可以享受自己的劳动成果了,试着输入各种组合的用户名和口令,看看它们的验证效果。仔细体会你会发现,服务器边的验证要更全面一些,比如对password的字符长度的验证。参考文献:
《StrutsinAction》TedHustedCedricDumoulinGeorgeFranciscusDavidWinterfeldt著
《ProgrammingJakartaStruts》ChuckCavaness著本文作者:张永美罗会波湖北省当阳市国税局可通过lhbf@sina.com与他们联系
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: