Struts 2 输入校验
1.输入校验的流程
2.采用手工编写方式实现
3.基于XML配置方式实现
 
====================== 华丽丽的分割线 ======================
1.输入校验的流程:
第一步,当我们点击提交的时候,struts 2通过调用默认的类型转换器对请求参数进行转换,然后把转换后的值赋给action属性。
第二步,如果在执行类型转换过程中出现异常,系统会将异常信息保存到ActionContext,conversionError拦截器将异常信息封装到fieldErrors里。不管类型转换是否出现异常,都将执行下一步。
也就是说,不止validate会进入input视图,也可能是在类型转换时出了问题导致进入的。
如:在action中int型的属性,再请求参数时故意发送字符串。
第三步,系统通过反射线调用action中的validateXxx()方法,再调用action中的validate()方法。(不是先全局后局部?怪哉)
第四步,经过如上,系统的fieldErrors存在错误信息,即size大于0,系统自动装法至input视图。如果否,则转发给将执行action中的处理方法。
====================== 华丽丽的分割线 ======================
2.采用手工编写方式实现:
2.1. 对请求的所有方法进行校验:
想要对请求的所有方法进行校验,可继承ActionSupport类(说实话,不管用不用得着,我基本有继承它),然后重写它的validate()方法即可。
下面通过代码说明如何处理:
第一步,配置XML文件:
<package name="validators" namespace="/validators" extends="struts-default">
<action name="validator_*" class="cn.hasone.test.ValidatorTest" method="{1}">
<result name="success">/validator.jsp</result>
<result name="input">/validator.jsp</result>
</action>
</package>
注意:须指明<result name="input">...</result>,当校验不通过时,则会调用这个result。
第二步,编写JSP文件: validator.jsp
${message }
<s:fielderror/>
<form action="validators/validator_add" method="post">
姓名:<input type="text" name="name">
手机:<input type="text" name="phone">
<input type="submit" value="上传">
</form>
第三步,编写Action:ValidatorTest.java
1 package cn.hasone.test;
2
3 import java.util.regex.Pattern;
4
5 import com.opensymphony.xwork2.ActionContext;
6 import com.opensymphony.xwork2.ActionSupport;
7
8 public class ValidatorTest extends ActionSupport {
9
10 private String name;
11
12 private String phone;
13
14 public String getName() {
15 return name;
16 }
17
18 public void setName(String name) {
19 this.name = name;
20 }
21
22 public String getPhone() {
23 return phone;
24 }
25
26 public void setPhone(String phone) {
27 this.phone = phone;
28 }
29
30 public String add(){
31 ActionContext.getContext().put("message", "add success");
32 return SUCCESS;
33 }
34
35 public String update(){
36 ActionContext.getContext().put("message", "update success");
37 return SUCCESS;
38 }
39
40 // 全局校验
41 // 无论尝试调用add,还是update,这种写法会对该action类中的所有方法进行校验.
42 public void validate() {
43 if(this.name == null || "".equals(this.name.trim())){
44 this.addFieldError("name", "姓名不能为空");
45 }
46 if(this.phone == null || "".equals(this.phone.trim())){
47 this.addFieldError("phone", "手机号码不能为空");
48 }else if(!Pattern.compile("^1[358]\\d{9}$").matcher(this.phone).matches()) {
49 this.addFieldError("phone", "手机号码格式错误");
50 }
51 }
52
53 // 局部校验 - 当用下面方法时,把上面的全局校验注释掉
54 // 针对指定的方法进行校验,只需通过方法名为: validateMethodName() 的方法,struts2会通过反射获得.
55 public void validateAdd() {
56 if(this.name == null || "".equals(this.name.trim())){
57 this.addFieldError("name", "姓名不能为空");
58 }
59 if(this.phone == null || "".equals(this.phone.trim())){
60 this.addFieldError("phone", "手机号码不能为空");
61 }else if(!Pattern.compile("^1[358]\\d{9}$").matcher(this.phone).matches()) {
62 this.addFieldError("phone", "手机号码格式错误");
63 }
64 }
65
66 }
第四步,可以测试了。
这里是指定全局校验,所以需把局部校验的注释掉。
会看到,不管是调用add(),或者是调用update()方法,都会经过校验。这就是全局校验的方式。
2.2. 对请求的指定方法进行校验:
基本如上,唯一要说明的是第三步:这里需要注释掉全局校验的代码; 看局部校验方法的注释,其中的validateMethodName()是指要校验的方法名,如要校验add()方法,则为validateAdd()。通过这种方式,sturts 2会通过反射得知要校验的是哪个方法。
====================== 华丽丽的分割线 ======================
3.基于XML配置方式实现
3.0. 前面是通过在action中进行校验,然而在struts2中,还有一种方式,即把要校验的信息通过XML配置文件去实现校验功能,而无需在action中动手。这样的好处是,让开发网站的人员职能可以分开(May be...无工作经验的人YY中)。
3.1. 全局校验方式:
第一步,第二步如上。因为是在同一个项目中干的,无需修改。
第三步,编写action: ValidatorTest.java
1 package cn.hasone.test;
2
3 import java.util.regex.Pattern;
4
5 import com.opensymphony.xwork2.ActionContext;
6 import com.opensymphony.xwork2.ActionSupport;
7
8 public class ValidatorTest extends ActionSupport {
9
10 private String name;
11
12 private String phone;
13
14 public String getName() {
15 return name;
16 }
17
18 public void setName(String name) {
19 this.name = name;
20 }
21
22 public String getPhone() {
23 return phone;
24 }
25
26 public void setPhone(String phone) {
27 this.phone = phone;
28 }
29
30 public String add(){
31 ActionContext.getContext().put("message", "add success");
32 return SUCCESS;
33 }
34
35 public String update(){
36 ActionContext.getContext().put("message", "update success");
37 return SUCCESS;
38 }
39
40 }
第四步,编写全局校验文件XML: ValidatorTest-validation.xml
这里要指明的是,该全局校验文件的命名需要符合:ActionClassName-validation.xml 这种格式;且需和要校验的action置于同一包下。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.3//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
<validators>
<!-- 指定action中要校验的属性 -->
<field name="name">
<!-- 指定校验器 -->
<field-validator type="requiredstring">
<!-- 为action属性注入值,让它不为空 -->
<param name="trim">true</param>
<!-- 指定出错信息 -->
<message key="姓名不能为空"/>
</field-validator>
</field>
<field name="phone">
<field-validator type="requiredstring">
<message key="手机号码不能为空"/>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[^1[358]\d{9}$]]></param>
<message key="手机号码格式错误"/>
</field-validator>
</field>
</validators>
3.2. 局部校验方式:
局部校验方式的第一二三步也同上,只是在第四步命名XML时,名字格式需为:ActionClassName-ActionName-validation.xml
第四步,编写局部校验文件XML: ValidatorTest-validator_add-validation.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.3//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
<validators>
<!-- 指定action中要校验的属性 -->
<field name="name">
<!-- 指定校验器 -->
<field-validator type="requiredstring">
<!-- 为action属性注入值,让它不为空 -->
<param name="trim">true</param>
<!-- 指定出错信息 -->
<message key="姓名不能为空"/>
</field-validator>
</field>
<field name="phone">
<field-validator type="requiredstring">
<message key="手机号码不能为空"/>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[^1[358]\d{9}$]]></param>
<message key="手机号码格式错误"/>
</field-validator>
</field>
</validators>
当为某个action提供了XML两种校验方式时,系统按顺序寻找2个校验文件,先全局,后局部。然后对他们进行汇总,若发生冲突,则调用后面文件中的调用规则。
当action继承了另一个action,父类action的校验文件会先被搜索到。
3.3. 系统提供的部分常用校验器介绍:
校验器的定义可以在xwork-2.x.jar中的com.opensymphony.xork2.validator.validators下的default.xml中找到。
required:必填校验器,要求field的值不能为空(常用姓名等)。
requiredString:必填字符串校验器,要求field的值不能为空,并且长度大于0(常用姓名等)。
stringlength:字符串长度校验器,要求field的值必须在指定的范围内,否则校验失败,minlength参数指定最小长度,maxLength参数指定最大长度,trim参数指定校验前是否去除前后空格(常用姓名等)。
regex:正则表达式校验器,检查被校验的field是否匹配一个正则表达式,expression参数指定正则表达式,caseSensitive参数指定进行正则表达式匹配时,是否区分大小写,默认为true(常用于特殊要求的指定,如身份证)。
int:证书校验器,要求field的整数值必须在指定范围内,min指定最小值,max指定最大值(常用于年龄)。
// 还有其他,类同,略
fieldexpression:字段OGNL表达式校验器,要求满足一个ognl表达式,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过。
email:要求若field非空,则必须是合法邮件地址。
url:网址校验器,要求如果field的值非空,则必须是合法的url地址。
date:日期校验器,要求field的日期值必须在指定范围内,min指定最小值,max指定最大值。
conversion:转换校验器,指定在类型转换失败时,指示的错误信息。
visitor:用于校验action中的符合属性,它指定一个校验文件用于校验复合属性中的属性。
expression:OGNL表达式校验器,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求职,返回true时校验通过,否则不通过,该校验器不可用在字段校验器风格的配置中.
                    
                
                
            
        
浙公网安备 33010602011771号