struts验证框架的使用

服务器端的校验有两种,一种是重写ActionSupportvalidate方法,另外一种是使用xwork验证框架(网上一般都直接说struts验证框架)。其中后者比较简单(通过xml配置验证条件),适合大多数情况下使用。今天,我们就来做个简单的例子。废话不多说,步骤如下:

 

1.       新建一个Web项目,名为StrutsValidatorDemo。在index.jsp中创建我们要验证的输入框以及“确定”按钮,代码就不贴了。其中,输入框nameusername,表单的action填什么后面我会说。

index.jsp

2.       由于要使用Struts框架,所以加入外部jar包,网上说搭建Struts需要六个jar包,但是实际我做的时候发现不止,反正具体情况自己看log吧。

所需jar

3.       配置web.xml文件。我们就用传统的流行的方法配置,不解释。

web.xml

 

ExpandedBlockStart.gif View Code
 1  <? xml version="1.0" encoding="UTF-8" ?>
 2 
 3  < web-app  version ="2.5"  xmlns ="http://java.sun.com/xml/ns/javaee"
 4 
 5   xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation ="http://java.sun.com/xml/ns/javaee   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" >
 6 
 7   < welcome-file-list >
 8 
 9    < welcome-file >index.jsp </ welcome-file >
10 
11   </ welcome-file-list >
12 
13   < filter >
14 
15    < filter-name >struts2 </ filter-name >
16 
17  < filter-class >org.apache.struts2.dispatcher.FilterDispatcher </ filter-class >
18 
19   </ filter >
20 
21    < filter-mapping >
22 
23    < filter-name >struts2 </ filter-name >
24 
25    < url-pattern >/* </ url-pattern >
26 
27   </ filter-mapping >
28 
29  </ web-app >

 

4.       创建一个UsernameAction类来处理username的提交,这里就不用MVC了,很简单的代码。具体代码如下:

UsernameAction.java

 

ExpandedBlockStart.gif View Code
 1  package validator.demo;
 2 
 3  import com.opensymphony.xwork2.ActionSupport;
 4 
 5  public  class UsernameAction  extends ActionSupport{
 6 
 7  private  static  final  long serialVersionUID = 1L;
 8 
 9  private String username; // 只要跟表单上的输入框name对应起来,那么会自动调用set方法保存的。
10 
11  public  void setUsername(String username) {
12 
13      this.username = username;
14 
15 }
16 
17  public String getUsername() {
18 
19      return username;
20 
21 }
22 
23  public String submit()
24 
25 {
26 
27      return "success"; // 后面会在struts.xml中定义的
28 
29 }
30 
31 }

 

我们让UsernameAction类继承了ActionSupport这个类(虽然这不是必须的,但这样做你可以享受到ActionSupport这个父亲的“存款”,何乐而不为呢)。鉴于Struts2中可以自定义请求调用方法(只要返回类型为String),因此这里我们不用execute方法(虽然使用execute方法可以一定程度上偷懒)。

注意点一定不要忘了定义属性的get方法,因为xwork验证框架会调用到它,如果你偷懒的话,会付出很多找错的代价。我就因为这个问题找了半天才找到。

 

5.       配置struts.xml文件

首先,它存放的部位一定要正确,默认是在/WEB-INF/classes里面加载的,也就是说你得把它放在src下。

        struts.xml

       

ExpandedBlockStart.gif View Code
 1  <? xml version="1.0" encoding="UTF-8" ?>
 2 
 3  <! DOCTYPE struts PUBLIC
 4 
 5    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
 6 
 7    "http://struts.apache.org/dtds/struts-2.0.dtd" >
 8 
 9  < struts >
10 
11      < package  name ="struts-demo"  extends ="struts-default"  namespace ="/" >
12 
13         < action  name ="usernameAction"  class ="validator.demo.UsernameAction"  method ="submit" >
14 
15             < result  name ="success" >success.jsp </ result >
16 
17             < result  name ="input" >index.jsp </ result >
18 
19         </ action >
20 
21      </ package >
22 
23  </ struts >

 

struts.xml中,我们配置了一个名为usernameActionAction,它的method属性为submit,就是说如果我们在前台表单中这个设置action=usernameAction.action”,默认会调用usernameActionsubmit方法。当然你也可以以这样的方式指定action=usernameAction!submit.action”。

这里,我们老老实实把index.jspformaction属性写为“usernameAction!submit.action”,这样做清晰明了无歧义,有助于促进社会和谐发展,为什么不呢。

 

6.       接下来就是校验xml文件的书写了。

我们的Action类名叫UsernameAction,所以校验xml文件名必须叫UsernameActionValidation(这是校验框架的规定,不鸟它你就别用它)。

UsernameAction-validation.xml

 

ExpandedBlockStart.gif View Code
 1  <? xml version="1.0" encoding="UTF-8" ?>
 2 
 3  <! DOCTYPE validators PUBLIC 
 4 
 5          "-//OpenSymphony Group//XWork Validator 1.0.2//EN" 
 6 
 7          "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd" >
 8 
 9  < validators >
10 
11      < field  name ="username" >
12 
13         < field-validator  type ="requiredstring" >
14 
15             < message >username should not be blank. </ message >
16 
17         </ field-validator >
18 
19         < field-validator  type ="stringlength" >
20 
21             < param  name ="minLength" >6 </ param >
22 
23              < param  name ="maxLength" >10 </ param >
24 
25              < param  name ="trim" >true </ param >
26 
27             < message >the length of username should be between ${minLength} and ${maxLength} </ message >
28 
29         </ field-validator >
30 
31         < field-validator  type ="regex" >
32 
33             < param  name ="expression" >^[A-Za-z0-9_]+$ </ param >
34 
35             < message >invalid username,check username only have letters,numbers and '_' </ message >
36 
37         </ field-validator >
38 
39      </ field >
40 
41  </ validators >

 

如上所示,我们为username创建了校验规则(顺带说一下,struts校验框架有两种方式,字段校验和非字段校验,以fieldvalidator标签来进行区分。这里用的是字段校验,也是极力推荐的方式)。这个xml中的各个标签,我们可以在dtd中看到。怎么看xwork-validator-1.0.2.dtd?点开xwork-core-2.2.3.jar这个jar包,就可以看到xwork2.2.3的目录结构,其中有各种dtd的定义。打开xwork-validator-1.0.2.dtd,你甚至可以看到使用这个dtdDOCTYPE的定义。

<field name="username">的意思就是对username进行校验,这个username必须是对应action类的一个字段。而每一段<field-validator type="…">则是对username的一个验证,如上述xml所示,对username这个字段我们创建了三个验证,第一个是验证是否为空,第二个验证是否长度是6~10之间,第三个验证是否只包含字母,数字和下划线。应该说结构很清晰,内容很明显。<message>里面存放如果验证不通过要显示的错误信息,它最终被添加到fielderror中,而它应该是一个键值对的映射,下面是接口ValidationAware的一段代码。

也许你会说这个xml中的typeparam name我都不知道啊!在哪可以找呢。那么我可以告诉你一种方法。同样点开xwork-core-2.2.3.jar这个jar包,再点开com.opensymphony.xwork2.validator.validators,这里存放了xwork给我们提供的验证类。打开default.xml这个文件,我们可以很惊讶的发现,原来这里配置了xwork提供的验证类的映射,就跟我们配置的struts相似。下面展示这个文件的一部分代码:

xwork-core-2.2.3.jar/com.opensymphony.xwork2.validator.validators/default.xml

<validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>

<validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>

看到没,我们写的validation.xml中的type就对应了上面的name,而这个name决定了验证框架会调用哪个类来实现验证。好,我们现在就看看stringlength这个那么所对应的类,揪出来看一看瞧一瞧。

  xwork-core-2.2.3.jar/com.opensymphony.xwork2.validator.validators/StringLengthFieldValidator.java

 

ExpandedBlockStart.gif View Code
 1  public  class StringLengthFieldValidator  extends FieldValidatorSupport {
 2 
 3      private  boolean doTrim =  true;
 4 
 5      private  int maxLength = -1;
 6 
 7      private  int minLength = -1;
 8 
 9  
10 
11  // 为了省字数,get方法被我略去了
12 
13  // get。。。
14 
15  
16 
17      public  void setMaxLength( int maxLength) {
18 
19          this.maxLength = maxLength;
20 
21     }
22 
23      public  void setMinLength( int minLength) {
24 
25          this.minLength = minLength;
26 
27     }
28 
29      public  void setTrim( boolean trim) {
30 
31         doTrim = trim;
32 
33     }
34 
35      public  void validate(Object object)  throws ValidationException {
36 
37         String fieldName = getFieldName();
38 
39         String val = (String) getFieldValue(fieldName, object);
40 
41          if (val ==  null || val.length() <= 0) {
42 
43              //  use a required validator for these
44 
45              return;
46 
47         }
48 
49          if (doTrim) {
50 
51             val = val.trim();
52 
53              if (val.length() <= 0) { 
54 
55                //  use a required validator
56 
57                return;
58 
59             }
60 
61         }
62 
63          if ((minLength > -1) && (val.length() < minLength)) {
64 
65             addFieldError(fieldName, object);
66 
67         }  else  if ((maxLength > -1) && (val.length() > maxLength)) {
68 
69             addFieldError(fieldName, object);
70 
71         }
72 
73     }
74 
75 }

 

从这段代码可以很easy的看出我们设置的param name就是这里的字段。。。吗?不是的,而是set方法中的参数名。我再把长度验证的代码贴出来,我们仔细研究一下下,

<field-validator type="stringlength">

        <param name="minLength">6</param>

        <param name="maxLength">10</param>

        <param name="trim">true</param>

        <message>the length of username should be between ${minLength} and ${maxLength}</message>

</field-validator>

由于代码中doTrim字段是private的,所以外部不能访问,要通过set来访问,但是set方法中形参名为trim,所以param name我们应该写成trim而不是doTrim,否则就出错了。当然对于偷懒的人可以发现doTrim这个字段默认是true,也就是说<param name="trim">true</param>这一行可以不用写。看validate这个方法就知道这段代码的作用了,那就是验证字符串长度嘛,而doTrim这个字段是用来决定是不是先把字符串给“剃头”的,这个字段肯定是要设为true的,不然长度验证就没有意义了,举个很简单的例子,如果doTrimfalse,要验证的长度是6~9,那么输入六到九个空格都是正确的(只不过累了点)。

好了,浪费了这么多口水,对于validation这个xml大家应该有所了解了吧!

7.       一切似乎准备就绪,那么我宣布激动人心的时刻到来了(别激动的太早,我想说的是你的项目部署了吗?),然后闭上你的眼睛,启动你家的汤姆猫(首先要确保它身体健康无错误),然后在浏览器的url栏中输入已经烂在脑海中的地址http://localhost:8080/外加StrutsValidatorDemo

8.       然后一个华丽风骚的页面出现了,哈哈。

   

下面对它进行考查,方案有四种:

一号作战方案:直接submit

二号作战方案:分别输入‘aa’和‘aaaaaabbbbbb’,点击submit

三号作战方案:输入‘aaaaaa’,点击submit

四号作战方案:输入‘_a_a_a_a’,点击submit

五号作战方案:输入‘中文弄死你’,点击submit

六号作战方案:残忍点,在url中直接输入http://localhost:8080/StrutsValidatorDemo/usernameAction!submit.action?username=(上述各种情况)。这也是xwork验证框架作为一款服务器端验证框架的关键作用。

结论:经过一系列作战方案,都达到了我们预期的目标,即搭建的验证框架起作用了,也是正确的。

转载于:https://www.cnblogs.com/selwynHome/archive/2012/11/02/2751136.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值