爱读书的旅行者 2011-01-05
http://35java.com/zhibo/forum.php?mod=viewthread&tid=366&extra=page%3D4
Struts校验可以分为两种类型:Annotation型,XML配置型
Annotation型主要使用Annotation来配置Action中的属性,这里我们做过多的介绍,需要看的请参看我的其他相关文章。XML配置型主要是指,使用XML来描述配置信息,之后提供给Struts框架做校验。使用Struts2,XML配置型的校验可以使用三种方式:普通的服务器端校验方式,客户纯JavaScript方式端校验,和Ajax方式的校验。
普通的服务器端校验方式:
客户端提交信息到服务器,在服务器上使用XML配置信息,校验客户端提交的信息,错误的情况下,返回input页面,显示校验错误信息。
客户端纯JavaScript校验方式:
在输入画面上,根据XML文件中的配置内容生成对应的JavaScript校验脚本,在提交数据的时候首先使用这些生成的JavaScript校验输入信息,错误情况下在画面上显示错误信息,不需要向服务器提交内容,只有输入数据校验正确的情况下才向服务器提交请求。这种方式的校验不支持所有Struts2内置的校验,只支持一部分校验:
requiredvalidator
requiredstringvalidator
stringlengthvalidator
regexvalidator
emailvalidator
urlvalidator
intvalidator
doublevalidator
Ajax方式校验
在提交请求的时候,首先使用AJAX的方式将数据提交到服务器,在校验出错的情况下在页面显示错误信息,但是不刷新页面,在校验成功的情况下,才向服务器提交请求。
三种方式比较
普通的服务端校验方式客户端纯JavaScriptAjax方式
位置服务器客户端服务器
是否刷新页面是否否
校验代码JavaJavaScriptJava
具体实现1定义Action类
Action.java
2定义配置文件
Action-validation.xml
3在struts.xml中定义action,注意由于使用了validation,所以必须定义input名字的result。
<actionname=""class="">
<result></result>
<resultname="input"></result>
</action>
4定义JSP页面的Form,例如:
<s:formaction="quizAction">
<s:textfieldlabel="Name"name="name"/>
<s:textfieldlabel="Age"name="age"/>
<s:textfieldlabel="Favoritecolor"name="answer"/>
<s:submit/>
</s:form>
与“普通的服务端校验方式”基本相同,但是需要在form定义的时候添加validate="true",例如:
<s:formaction="quizAction"validate="true">
<s:textfieldlabel="Name"name="name"/>
<s:textfieldlabel="Age"name="age"/>
<s:textfieldlabel="Favoritecolor"name="answer"/>
<s:submit/>
</s:form>
与“普通的服务端校验方式”基本相同,但是需要做如下修改:
1安装dojoplugin
2JSP中使用dojoplugin
<%@taglibprefix="sx"uri="/struts-dojo-tags"%>
3在head内部追加head标签(引入dojo的js库)
<sx:head/>
4修改form定义
<s:formmethod="post"theme="ajax"action="quizAjax"id="form">
<s:textfieldlabel="Name"name="name"/>
<s:textfieldlabel="Age"name="age"/>
<s:textfieldlabel="Favoritecolor"name="answer"/>
<sx:submitvalidate="true"/>
</s:form>
说明:struts-dojo-plugin在2.1.0的时候可能会Release。现在使用需要从Subversion中去除2.1.0SNAPSHOT代码:
svnhttp://svn.apache.org/repos/asf/struts/struts2/trunk
代码示例
//QuizAction类
packageexample;
importcom.opensymphony.xwork2.ActionSupport;
/**
*CreatedbyIntelliJIDEA.
*User:[email protected]
*Date:2007-9-8
*Time:13:58:16
*TochangethistemplateuseFile|Settings|FileTemplates.
*/
public
classQuizActionextendsActionSupport{
private
staticfinallongserialVersionUID=
-7505437345373234225L;
privateStringname;
private
intage;
privateStringanswer;
publicStringgetName(){
returnname;
}
public
voidsetName(Stringname){
this.name=name;
}
public
intgetAge(){
returnage;
}
public
voidsetAge(intage){
this.age=age;
}
publicStringgetAnswer(){
returnanswer;
}
public
voidsetAnswer(Stringanswer){
this.answer=answer;
}
publicStringexecute(){
returnSUCCESS;
}
}
//QuizValidation.xml校验配置文件
<!DOCTYPEvalidatorsPUBLIC"-//OpenSymphonyGroup//XWorkValidator1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<fieldname="name">
<field-validatortype="requiredstring">
<message>Youmustenteraname</message>
</field-validator>
</field>
<fieldname="age">
<field-validatortype="int">
<paramname="min">13</param>
<paramname="max">19</param>
<message>Onlypeopleages13to19maytakethisquiz</message>
</field-validator>
</field>
</validators>
//struts.xml配置文件
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEstrutsPUBLIC
"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<packagename="example"namespace="/example"extends="struts-default">
<actionname="quizAction"class="example.QuizAction">
<resultname="input">/example/quiz-ajax.jsp</result>
<result>/example/quiz-success.jsp</result>
</action>
</package>
</struts>
//JSP文件
<%--
CreatedbyIntelliJIDEA.
User:[email protected]
Date:2007-9-8
Time:14:02:17
TochangethistemplateuseFile|Settings|FileTemplates.
--%>
<%@pagecontentType="text/html;charset=UTF-8"language="java"
%>
<%@taglibprefix="s"uri="/struts-tags"
%>
<html>
<head><title>QuizActionValidation</title></head>
<body>
<s:formaction="quizAction"namespace="/example"validate="true">
<s:textfieldlabel="Name"name="name"/>
<s:textfieldlabel="Age"name="age"/>
<s:textfieldlabel="Favoritecolor"name="answer"/>
<s:submit/>
</s:form>
</body>
</html>
特别说明(AjaxValidation):
为什么使用AJAX校验?
纯的JavaScript校验不刷新页面,但是也不能使用所有的Struts2校验方法;服务端校验可以使用所有Struts2的校验方法,但是需要刷新页面。
Struts2Ajax校验,既不需要刷新页面,又可以使用Struts2内置的所有的校验方法,所以我们比较倾向于使用Ajax校验。
现在(2007/09/08)Struts2的最新版本为2.0.9,还不支持dojo-plugin,所以还没有办法使用Ajax校验。所以要想使用AjaxValidation必须使用Struts2.1.0SNAPSHOT版本。