简单验证从本质上说就是在服务端来验证客户端提交的form中的数据这种验证只是对form中的数据规则进行检查如必须输入用户ID价格不能小于或是对email格式的验证在这个验证过程中并不需要访问数据库因此简单验证需要在用户提交form后并且在服务器处理form中的数据之前进行
在进行完简单验证后如果form中的数据不合法程序就会forward到指定的JSP页(一般是包含form的页面)并显示相应的错误信息如果form中的数据完全正确程序就会继续执行
一在validate方法中进行简单验证
在上一篇文章中我们知道Strutsx通过ActionForm的子类来封装了客户端提交的form中的数据而服务端程序只需要通过ActionForm的子类的对象实例就可以访问form中的数据而如果不使用ActionForm类就必须通过request对象来获得form中的数据通过这种封装机制可以使代码更容易理解然而ActionForm类不仅可以封装form中的数据还可以通过ActionForm类的validate方法来验证form中的数据validate方法的定义如下
publicActionErrorsvalidate(ActionMappingmappingHttpServletRequestrequest)
当客户端向服务端提交form后Servlet引擎首先通过ActionForm的子类的对象实例装载form中的数据然后再调用validate方法进行验证validate方法返回了一个ActionErrors对象这个对象相当于一个Map如果ActionErrors中没有错误信息Servlet引擎就认为form中的数据是正确的这时服务端程序就会继续执行如果ActionErrors中有错误信息程序就会跳转到指定的错误页面下面让我们通过一个完整的例子来演示一下如何通过validate方法来验证form中的数据实现这个例子需要如下五步
「第步」建立JSP页面
在这一步将建立一个叫simpleValidationjsp的页面这个JSP页面用于采集用户的输入信息在<samples工程目录>中建立一个simpleValidationjsp文件并编写如下的代码
<%@pagepageEncoding=GBK%>
<%@tagliburi=htmlprefix=html%>
<html>
<head>
<title>注册信息(测试简单验证)</title>
<styletype=text/css>
text{
height:px;
width:px;
}
</style>
</head>
<body>
<html:formaction=simpleValidation>
<tablewidth=%>
<tr>
<tdalign=rightwidth=%>用户名</td>
<tdwidth=%>
<html:textproperty=userstyleClass=text/>
<fontcolor=red><html:errorsproperty=errorUser/></font>
</td>
</tr><tr/><tr/>
<tr>
<tdalign=right>登录密码</td>
<td>
<html:passwordproperty=passwordstyleClass=text/>
<fontcolor=red><html:errorsproperty=errorPassword/></font>
</td>
</tr><tr/><tr/>
<tr>
<tdalign=right>重复登录密码</td>
<td>
<html:passwordproperty=passwordstyleClass=text/>
<fontcolor=red><html:errorsproperty=errorPassword/></font>
</td>
</tr><tr/><tr/>
<tr>
<tdalign=right>电子邮件</td>
<td>
<html:textproperty=emailstyleClass=text/>
<fontcolor=red><html:errorsproperty=errorEmail/></font>
</td>
</tr><tr/><tr/>
<tr>
<tdalign=right><br>${requestScopesuccess}</td>
<tdalign=left><br><html:submitvalue=提交/></td>
</tr>
</table>
</html:form>
</body>
</html>
在启动Tomcat后在IE的地址栏中输入如下的URL
当通过上面的URL访问simpleValidationjsp时并不能正确显示用户信息采集界面原因是<htmlform>标签使用了一个simpleValidation当JSP转换成Servlet时这个动作必须在strutsconfigxml文件中正确定义否则将抛出一个javaxservletjspJspException异常
「第步」建立simpleValidation动作
由于本例的着重点是简单验证因此simpleValidation动作并不需要处理更多的工作一个动作对应于一个动作类这个动作类一般是orgapachestrutsactionAction类的子类simpleValidation动作只做如下两项工作
设置验证成功后在目标页中显示的信息字符串(保存在request的属性中)
跳转到目标页
simpleValidation动作对应的动作类是SimpleValidationAction在<samples工程目录>srcaction目录中建立一个SimpleValidationActionjava文件并输入如下的代码
packageaction;
importjavaxservlethttp*;
importorgapachestrutsaction*;
publicclassSimpleValidationActionextendsAction
{
publicActionForwardexecute(ActionMappingmappingActionFormform
HttpServletRequestrequestHttpServletResponseresponse)
throwsException
{
requestsetAttribute(success提交成功!);//设置在目标页中显示的信息字符串
returnmappingfindForward(simple);//跳转到目录页(simple所指的JSP页)
}
}
在编写SimpleValidationAction类时应注意如下八点
要想在ActionForm类中进行验证必须在ActionForm类的子类中覆盖validate方法
validate方法在ActionForm类的对象实例装载完用户提交的数据后调用因此在调用validate方法时ActionForm类的属性值已经是用户提交的信息了所以可以直接使用这些属性值进行验证
在validate方法中验证用户提交的数据时要使用ActionErrors类的实例对象返回错误信息 ActionErrors类的构造方法的第二个参是一个ActionMessage类的对象实例而不是错误描述信息
ActionMessage类的构造方法的参数并不是错误描述信息而是错误描述信息的key具体的信息在Java属性文件中(将在下一步实现)
使用ActionForm的属性可以非常好地验证字符串类型但对于其他的数据类型(如整型)的某些验证却不太适合如当用户提交数据时本该提交一个整数但用户却提交了一个非整数信息对于这种情况在ActionForm类的对象实例中这个用户提交的数据的值为虽然使用ActionForm类的属性无法准确验证这种情况但我们可以使用validate方法的第二个参数request的getParameter方法直接获得客户端提交的数据来进行验证
如果ActionErrors对象中有错误信息在JSP中需要使用<htmlerrors>标签显示错误信息
Struts实际上是将ActionErrors对象以orgapachestrutsactionERROR作为键值保存在了request的属性中因此<htmlerrors>标签实际上是从request的属性中获得的错误信息描述如我们也可以通过如下的Java代码来获得produceID属性的错误描述信息
<%
javautilIterator<orgapachestrutsactionActionMessage>it=
((orgapachestrutsactionActionErrors)request
getAttribute(orgapachestrutsactionERROR))get(productID);
outprintln(((orgapachestrutsutilPropertyMessageResources)request
getAttribute(orgapachestrutsactionMESSAGE))getMessage(errorproductIDblanknull));
%>
「第步」建立Java属性文件
Java属性文件相当于资源文件以key = value形式保存了在程序中需要的字符串信息Java属性文件的扩展名为properties在<samples工程目录>src目录中建立一个struts目录在struts目录中建立一个ErrorDescriptionproperties文件并输入如下的内容
ErrorDescriptionproperties
erroruserblank=Usercantbenull
errorpasswordblank=Passwordcantbenull
nfirmation=Passworddoesntmatchconfirmation
erroremailblank=Emailcantbenull
erroremailinvalid=Itisnotavalidemailaddress
「第步」配置strutsconfigxml文件
在本例中需要配置strutsconfigxml文件的三个标签<formbean><action>和<messageresources>
配置<formbean>标签
这个标签用来定义ActionForm在<formbeans>标签中加入如下所示的<formbean>标签
<formbeanname=simpleValidationFormtype=actionformSimpleValidationForm/>
配置<action>标签
这个标签用来定义Struts中的动作类在<actionmappings>标签中加入如下所示的<action>标签
<actionname=simpleValidationFormpath=/simpleValidation scope=requesttype=actionSimpleValidationAction
input=simpleValidationjsp>
<forwardname=simplepath=simpleValidationjsp/>
</action>
<action>标签中的属性含义描述如下
name表示ActionForm的名称也就是<formbean>标签中的name属性的值
path表示Struts动作必须以/开头
scope表示ActionForm类的对象实例(在本例中是SimpleValidationForm类的对
象实例)保存的范围这个属性值只能取request和session默认值是session如果scope的值为request表示将SimpleValidationForm类的对象实例以simpleValidationForm作为键值保存到了request的属性中如果scope的值为session表示不将SimpleValidationForm类的对象实例保存到request的属性中但不管scope的值是request还是sessionStruts都会将SimpleValidationForm类的对象实例保存到session的属性中
type表示SimpleValidationAction类的全名
input表示如果客户端提交的数据未通过简单验证后要跳转到的页面也就是在
SimpleValidationForm类的validate方法中返回的ActionErrors对象中含有错误描述信息Struts会自动跳转到input属性所指的JSP页面
<action>标签中的子标签<forward>定义了可以在动作类(在本例中就是SimpleValidationAction类)中读取的forward页的URL
配置<messageresources>标签
这个标签用来定义程序中所使用的属性文件在strutsconfigxml文件的<strutsconfig>根节点中加入如下内容
<messageresourcesparameter=strutsErrorDescription/>
其中parameter属性表示属性文件的路径在本例中属性文件ErrorDescriptionproperties位于struts目录中因此parameter属性的值为strutsErrorDescription扩展名properties不用写其中也可以使用/或代替
下面我们测试一下这个例子程序首先启动Tomcat然后在IE中输入如下的URL
访问上面的URL后的界面如图所示
图
在不输入任何信息的情况下点击确定按钮后的界面如图所示
图