struts2校验(二):声明式验证(基于xml配置验证)(2)

[size=medium][b]Struts2校验框架的本质[/b]
展开xwork-2.0.4.jar中的com.opensymphony.xwork2.validator.validators包里面发现有很多的校验类
因此,我们知道,我们现在所使用的这种校验框架,实际上就是由Struts2已经给我们提供好的一些类
这些类来校验客户端的表单的输入请求,这些类,这些校验,都是由Struts2已经内置好的了,我们可以直接使用
然后打开包里面的[color=red]default.xml[/color]文件,就可以知道<field-validator>中type是取值于default.xml文件的
expression和fieldexpression都是用于OGNL表达式的判断,分别返回Action级别和Field级别的错误
conversion用于格式转换出现错误时的判断。stringlength判断字符串长度。regex用于正则表达式的判断

[b]struts的validate框架验证流程 [/b]
(用配置xml文件进行验证、基于验证框架的输入校验)
1. 编写校验配置文件:命名规则:action类名-validatin.xml.
2. 一个action对应多个逻辑处理方法:指定校验某个特定方法的方式:
<ActionClassName>-<ActionAliasName>-validation.xml 其中<ActionAliasName>就是struts.xml中<ation>的name属性值
3. 配置文件存放位置:[color=red]和action文件同目录[/color]
4. 验证规则:先加载action类名-validatin.xml,然后加载action类名-name属性名-validatin.xml文件。
5. 校验器的配置风格:两种:字段校验器,非字段校验器。

[color=red]Action配置中一定要设置input返回页面 ,添加验证只要创建验证的xml文件[/color]

[b]-1-.创建xml文件名 [/b]
验证Action中全部方法
在Action同包下,创建:ActionClassName-validation.xml ([color=red]要和需要校验的Action放在同一目录下[/color])
验证Action中单个方法
ActionClassName-ActionAliasName-validation.xml
-2-在不需要进行验证的方法加上annotation,即在方法前加上[color=red]@SkipValidation。[/color]
[color=red]<1>. 导入SkipValidation类[/color]
import org.apache.struts2.interceptor.validation.SkipValidation;
[color=red]<2>. 在不需要验证的方法前使用标注@SkipValidation忽略验证[/color],如:
@SkipValidation
public String beforeAdd(){
return "beforeSave";
}
-3- <action name=...>
<interceptor-ref name="[color=red]defaultStack[/color]">
[color=red] <param name="validation.excludeMethods">*</param>
<param name="validation.includeMethods">需要验证的方法名称,以逗号分隔</param>[/color]
</interceptor-ref>
</action>


【字段校验】

---- field-validator
---- 字段优先,我去校验谁(字段),我用谁(校验器)来校验

数据校验文件以<validators>为根元素;
字段型校验器是以属性为单位的,内容模板:[/size]
<validators>  
<field name="">
<field-validator type="">
<param name=""></param>
<message></message>
</field-validator>
</field>
</validators>


[size=medium]【非字段校验】
---- validator
---- 校验器优先,我用谁(校验器)来校验,我去校验谁(字段)

非字段型校验器是以校验器为单位的,内容模板:[/size]
<validator type="">  
<param name="fieldName"></param>
<param name=""></param>
<message></message>
</validator>


[size=medium]****** 这两种只是 表现形式不同,底层是相同的,都是把错误信息放到fielderror中[/size]

字段校验和非字段校验代码示例参见[u]http://deony2jacob1314.iteye.com/blog/1874772[/u]
[size=medium]

[b]短路校验[/b],在字段校验或者非字段校验中加入:short-circuit="true",如果某个被标记为短路的校验器失败了,将会阻止其他后续的校验器的进行,然后一个错误(action错误或者字段错误,取决于校验器的类型)将会被添加到被校验的对象的ValidationContext中:[/size]

<validators>
<!-- Field Validators for email field -->
<field name="email">
<field-validator type="required" short-circuit="true">
<message>You must enter a value for email.</message>
</field-validator>
<field-validator type="email" short-circuit="true">
<message>Not a valid e-mail.</message>
</field-validator>
</field>
<!-- Field Validators for email2 field -->
<field name="email2">
<field-validator type="required">
<message>You must enter a value for email2.</message>
</field-validator>
<field-validator type="email">
<message>Not a valid e-mail2.</message>
</field-validator>
</field>
<!-- Plain Validator 1 -->
<validator type="expression">
<param name="expression">email.equals(email2)</param>
<message>Email not the same as email2</message>
</validator>
<!-- Plain Validator 2 -->
<validator type="expression" short-circuit="true">
<param name="expression">email.startsWith('mark')</param>
<message>Email does not start with mark</message>
</validator>
</validators>


[size=medium]在上面的例子中,实际的校验器执行是这样的:
  Plain Validator 1
  Plain Validator 2
  email字段的字段校验器
  email2字段的字段校验器
  因为普通校验器2是短路的,如果它的校验失败,它会导致email字段的校验器和email2字段的校验器不会被执行.

短路校验器的规则:
[color=red]1.当非字段校验器校验失败,则其后的所有字段校验器都不会执行,而不会影响其他非字段校验器;
2.字段校验器校验失败时,其后的所有字段校验器都不会执行;[/color]
([color=blue]当执行到短路,报错时,后面的字段校验器不再执行[/color],不影响非字段校验器)

校验器的运行顺序
[color=red]1.非字段校验器比字段校验器先执行;
2.从前往后执行[/color];[/size]


[size=medium][b]验证嵌套属性[/b]
有一类特殊的属性,即这个属性的类型是另外一个JavaBean,如有一个User类,代码如下:
Java代码 [/size]
package data;  
public class User
{
private String name;
private int age;
public String getName()
{
returnname;
}
public void setName(Stringname)
{
this.name=name;
}
public int getAge()
{
return age;
}
public void setAge(intage)
{
this.age=age;
}
}

[size=medium]在NewValidateAction类中加一个user属性,代码如下:

Java代码[/size]
package action;  
import com.opensymphony.xwork2.ActionSupport;
import data.User;
public class NewValidateAction extends ActionSupport {
private String msg;
private int age;
private User user;
public String getMsg()
{
return msg;
}
public void setMsg(Stringmsg)
{
this.msg=msg;
}
public int getAge()
{
return age;
}
public void setAge(intage)
{
this.age=age;
}
public User getUser()
{
returnuser;
}
public void setUser(Useruser)
{
this.user=user;
}
}


[size=medium]如果要验证NewValidateAction中的user属性,可以使用visitor验证器。操作过程如下:
首先在[color=red]NewValidateAction-validation.xm[/color]l中加入一个<field>标签,代码如下:
Xml代码 [/size]
<?xmlversion="1.0"encoding="UTF-8"?>  
<!DOCTYPEvalidatorsPUBLIC"-//OpenSymphonyGroup//XWorkValidator1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
……
<fieldname="user">
<field-validatortype="visitor">
<paramname="context">abc</param>
<paramname="appendPrefix">true</param>
<message>User:</message>
</field-validator>
</field>
</validators>

[size=medium]其中context参数将作为验证User类属性的文件名的一部分,如user属性返回一个User对象,那么用于验证User对象属性的文件名为 User-abc-validation.xml。这个文件要和User.class文件在同一个目录中。appendPrefix表示是否在字段里加 user,如果为true,Struts2就会使用user.name在form提交的数据中查找要验证的数据。这个属性的默认值是true。如果出错, Struts2会将<message>标签中的信息加到User-abc-validation.xml文件中的相应错误信息前面。
[color=red]User-abc-validation.xml[/color]文件的内容如下:
Xml代码 [/size]
<?xmlversion="1.0"encoding="UTF-8"?>  
<!DOCTYPEvalidatorsPUBLIC"-//OpenSymphonyGroup//XWorkValidator1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<fieldname="name">
<field-validatortype="requiredstring">
<message>请输入name</message>
</field-validator>
</field>
<fieldname="age">
<field-validatortype="int">
<paramname="min">5</param>
<paramname="max">20</param>
<message>
必须在5至20之间
</message>
</field-validator>
</field>
</validators>


[size=medium]下面修改validate_form.jsp,代码如下:
Xml代码 [/size]
<s:formvalidate="true"action="new_validate"namespace="/test">  
<s:textfieldname="msg"label="姓名" />
<s:textfieldname="age"label="年龄"/>
<s:textfieldname="user.name"label="姓名1" />
<s:textfieldname="user.age"label="年龄1"/>
<s:submit/>
</s:form>
<s:submit/>
</s:form>



[size=medium][color=red] 注意:
1.如果内建校验器不满足要求,可以自定义校验器,重写validate()方法。
2.如果既有xml校验,又有validate()校验
将先校验xml,然后进行validate()校验(先validateXXX()再validate())
然后将所有的错误添加进fielderror[/color][/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值