Struts2验证应该包括验证器(需要xml配置)和Action中的validate()验证方法两种。后者很简单,只需要把
验证条件加进去就可以啦!
一. 我们先看看验证框架的流程,这样你会很清楚验证的过程。
请求参数会通过拦截器params拦截器将参数转移到ValueStack公开的属性上,注意此时参数并没有直接转移到action类中的属性上面。之后会在其后遇到验证器(如果你用了验证器)一旦验证没通过,它会产生错误信息,中间可能还会经过一系列拦截器,这里不讨论,关于拦截器,下一篇将详细讲解。后面会到workflow拦截器,此时拦截器会调用Action中的validate ()方法进行验证,验证不通过也会产生错误信息。接着workflow拦截器会检查错误信息,通过检查ValidationAware的hasErrors()方法,它并不会关心是谁产生的错误信息,只要产生了就会改变工作流并且返回输入页面。如果都没有错误才会执行动作其他部分。
验证器的使用:
举例说明:
1.创建一个Action ,我的是PersonAction类在包cn.itcast.Action下,代码如下:
package cn.itcast.Action;
import java.util.regex.Pattern;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class PersonAction extends ActionSupport {
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
private String username;
private String mobile;
public String updata(){
ActionContext.getContext().put("message","更新成功");
return "message";
}
public String save(){
ActionContext.getContext().put("message","保存成功");
return "message";
}
/*
public void validate()方法会对所有的方法都进行校验。如果你只想对指定方法进行校验,比如
只对 save()方法进行校验,而不对updata()方法进行校验,则可以用public void validatexxx()中
xxx为需要验证方法的方法名,且首字母大写。比如:public void validateSave(){} 则只会对save()方法
进行校验。
*/
@Override
public void validate() {
// TODO Auto-generated method stub
if(this.username==null||"".equals(username.trim())){
this.addFieldError("username", "用户名不能为空");
}
if(this.mobile==null||"".equals(mobile.trim())){
this.addFieldError("mobile", "手机号码不能为空");
}else{
if(!Pattern.compile("^1[358]\\d{9}$").matcher(mobile).matches()){
this.addFieldError("mobile", "手机格式不正确");
}
}
super.validate();
}
}
2.创建一个验证器,xml形式,名称为PersonAction-validation.xml,命名规则 需验证的Action类名-validation.xml 并且要和PersonAction类在同一个目录下。代码如下:
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.3//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
<validators>
<field name="username">
<field-validator type="requiredstring">
<message > 用户名不为空</message>
</field-validator>
<field-validator type="test">
<message>heh </message>
</field-validator>
</field>
<field name="email">
<field-validator type="requiredstring">
<message >邮箱不能为空</message>
</field-validator>
<field-validator type="email">
<message>邮箱格式不正确</message>
</field-validator>
</field>
<field name="tel">
<field-validator type="requiredstring">
<message> 电话号码不能为空</message>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[^1{358}\d(9)$]]></param>
<message>电话号码格式不正确</message>
</field-validator>
</field>
</validators>
只需要这样,然后就可以验证啦。需要注意的是:
1. 验证器中<field name="email">中name应该是表单中的name属性。
2.如果验证的是一个对象中的属性,例如
public class registerAction extends ActionSupport {
public User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
后面代码省略
}
验证里面的user中的属性,此时提交表单中name应该为user.email 这样的类型。只有这样才可以匹配到User类的属性上去。
}
3. 怎样把错误信息自由地在提交页面任意处显示。
(1)addFieldError("名称", "用户名不能为空");方法添加的错误信息。使用标签<s:fielderror fieldName="名称" ></s:fielderror>即可。
(2)验证器中<message ></message>方式,则应该用标签<s:fielderror><s:param value="%{'user.sign'}"></s:param> </s:fielderror>中%{' field name '} field name 是指指定要验证的字段名如:<field name="user.username">中的user.username.
(3)在表单添加<s:fielderror></s:fielderror>代表全部错误信息都输出。包括前面两种方式添加的错误信息。
二.自定义验证器
在struts2框架下,自定义验证器很容易。
1. 先创建一个类,用来写自定义的验证方法。下面是我写的MyValidate类
package cn.itcast.Action;
import com.opensymphony.xwork2.validator.ValidationException;
import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;
public class MyValidate extends FieldValidatorSupport{
public void validate(Object obj) throws ValidationException {
// TODO Auto-generated method stub
String name = super.getFieldName();
String value = super.getFieldValue(name, obj).toString();
System.out.println(name);System.out.println(value);
super.addFieldError(super.getFieldName(), obj);
}
}
它继承FieldValidatorSupport类,重写validate()方法,验证规则就写在validate()方法里面。解释下里面关键的几点。super.getFieldName();获取xml验证中的需要验证的字段名。super.getFieldValue(name, obj).toString();获取表单提交的该字段的值。super.addFieldError(super.getFieldName(), obj);添加错误信息。运行下你就可以看到控制台打印出来的结果。具体机制参考源代码。
2.追加验证器
要想让自己写的校验类变成像默认校验器一样方便使用,必须把这个自己写的校验器追加,记住是追加到验证框架中。展开xwork-2.0.4.jar,com.opensymphony.xwork2.validator.validators目录下有个default.xml,打开后你会看到里面列出了所有默认验证器。你想把你自定义的验证器追加进去,只需要在项目的根目录下即src下粘贴default.xml,改名为validators.xml,之所以复制关键是需要里面的头部一些信息。在里面配置
<validators>
<validator name="test" class="cn.itcast.Action.MyValidate" />
</validators>
就可以啦。接着就可以像默认的验证器一样使用啦。如:
<field name="user.username">
<field-validator type="test">
<message key="username" > 用户名不为空</message>
</field-validator>
</field>
就可以应用自定义的名为test的验证器。
三 . Visitor校验器 在域对象级别上验证以及利用上下文优化
目的: 当一个对象比如User 在很多Action或不同方法中都使用,但是使用前都必须检验User里面属性的合法性。这是按照上面的方法,我们必须为每个Action类配置一个验证 文件。但是每个验证文件里面的内容有都是一样的,为了减小重复,我们采用Visitor校验器 在域对象级别上验证。实际上就是相当于都去调用一个验证User的配置文件。
1.先创建一个UserAction类,里面包含User对象。
public class UserAction extends ActionSupport {
private User user;
public String adduser(){
ActionContext.getContext().put("message", "增加成功");
return "success";
}
public String updateuser(){
ActionContext.getContext().put("message", "修改成功");
return "success";
}
public void setUser(User user) {
this.user = user;
}
public User getUser() {
return user;
}
public String execute(){
return SUCCESS;
}
}
2.在同一个目录下创建 UserAction-validation.xml 代码如下:
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.3//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
<!-- 校验的Action中的user类 -->
<field name="user">
<field-validator type="visitor">
<!-- 指定校验规则文件的context名为add,此名可任意取,也可以不取 -->
<param name="context">add</param>
<!-- 指定校验失败后提示信息是否添加下面前缀,如果设置为false,则在标签对应的地方不显示错误也就是在输入界面提示错误信息时会加上下面message信息“错误:”,需要用fielderrors来显示 -->
<param name="appendPrefix">true</param>
<!-- 指定校验失败的提示信息前缀 -->
<message>错误:</message>
</field-validator>
3. 然后在User类(包含User属性的bean)所在包建立名为User-add-validation.xml(add为上面<param name="context">add</param>中定议),内容如下
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.3//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
<validators>
<field name="username">
<field-validator type="requiredstring">
<message > 用户名不为空</message>
</field-validator>
<field-validator type="test">
<message>heh </message>
</field-validator>
</field>
<field name="email">
<field-validator type="requiredstring">
<message >邮箱不能为空</message>
</field-validator>
<field-validator type="email">
<message>邮箱格式不正确</message>
</field-validator>
</field>
<field name="tel">
<field-validator type="requiredstring">
<message> 电话号码不能为空</message>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[^1{358}\d(9)$]]></param>
<message>电话号码格式不正确</message>
</field-validator>
</field>
</validators>
这也就是实际验证User字段的地方。上面UserAction-validation.xml 里面实际起到调用User-add-validation.xml来验证对象User的作用。
关于上面的完整示例代码 可以下载,下载地址:
1. http://download.csdn.net/detail/kekedou3hao/3777139
2.http://download.csdn.net/detail/kekedou3hao/3778487
3.http://download.csdn.net/detail/kekedou3hao/3779744
注:我的开发工具是MyEclipse+Tomcat 以上纯属个人学习总结,如若有不完善的地方敬请谅解,更希望能斧正。本人是个大学生,正在学习当中,如有愿意一起学习的可以加QQ群 45919266 。