灵犀一脚C

博客园 首页 联系 订阅 管理

使用Struts2实现数据校验

为什么需要数据校验呢?答案很简单,假如当你登录想要京东,这时就需要数据校验了如果不输入用户名的话,那么就不会登陆成功,并且会提示出"请输入用户名"的字样

那么,在Struts2中实现数据校验的方法有哪些呢?接下来我们探讨一下。

实现数据校验有四种方法:

====================================================================================

1.用execute()方法实现数据校验

              编写一个Action,继承ActionSupport类,重写execute()

步骤1:在Web项目的cn.happy.action下创建一个ExecuteAction(UserInfo为用户实体,其中有uname和upwd属性,并且封装)

 1 package cn.happy.action;
 2 
 3 import cn.happy.entity.UserInfo;
 4 import com.opensymphony.xwork2.ActionSupport;
 5 
 6 /**
 7  * 数据校验
 8  * Created by CKW on 2017/3/13.
 9  */
10 public class ExecuteAction extends ActionSupport {
11     private UserInfo info;
12     @Override
13     public String execute() throws Exception {
14         if (info.getUname().length()==0){
15             addFieldError("name","用户名不能为空");
16         }
17         if (info.getUpwd().length()==0){
18             addFieldError("pwd","密码不能为空");
19         }
20 
21         //判定FieldError对象中是否有错误信息
22         //若有错误信息 则返回input
23         if (this.hasFieldErrors()){
24             return INPUT;
25         }
26 
27         return SUCCESS;
28     }
29 
30     public UserInfo getInfo() {
31         return info;
32     }
33 
34     public void setInfo(UserInfo info) {
35         this.info = info;
36     }
37 }

步骤2:创建struts.xml文件,引用ExecuteAction类

1         <!-- 测试execute方法 -->
2         <action name="execute" class="cn.happy.action.ExecuteAction">
3             <result name="success">/form/success.jsp</result>
4             <result name="input">/form/login.jsp</result>
5         </action>

步骤3.准备前段注册页面login.jsp和成功页面success.jsp

 1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 2 <%@taglib prefix="s" uri="/struts-tags" %>
 3 <html>
 4 <head>
 5     <title>登录</title>
 6 </head>
 7 <body>
 8 <s:fielderror></s:fielderror>
 9 <s:form action="regist" method="post">
10     用户名:<s:textfield name="info.uname"></s:textfield><br>
11     密   码<s:password name="info.upwd"></s:password><br>
12     <s:submit value="提交"></s:submit>
13 </s:form>
14 </body>
15 </html>
 1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 2 <%@taglib prefix="s" uri="/struts-tags" %>
 3 <html>
 4 <head>
 5     <title>成功页面</title>
 6 </head>
 7 <body>
 8 欢迎你:<s:property value="info.uname"></s:property>
 9 </body>
10 </html>

 

 2.使用validate()实现数据校验

 

继承ActionSupport类,该类实现了Validateable接口,该接口中定义了一个validate()方法,在自定义的Action类中重写validate()方法,如果校验表单输入域出现错误,则将错误添加到ActionSupport类的fieldErrors域中,然后通过OGNL表达式负责输出

步骤1:创建ValidateAction类(UserInfo同样为UserInfo实体类)

 

1     @Override
2     public void validate() {
3         if (info.getUname().length()==0){
4             addFieldError("name","用户名不能为空");
5         }
6         if (info.getUpwd().length()==0){
7             addFieldError("pwd","密码不能为空");
8         }
9     }

步骤2:在struts.xml文件中再配置一个action

 

1         <!-- 测试validate方法 -->
2         <action name="validate" class="cn.happy.action.UserInfoAction">
3             <result name="success">/form/success.jsp</result>
4             <result name="input">/form/login.jsp</result>
5         </action>

步骤三和上面第一种方法一样,同样是两个jsp页面,只是把<s:form action="execute" method="post">的execute改为validate就可以了。

 

 

 

3.使用ValidateXxx方法实现数据校验

 

在validate()方法中对数据验证是可以工作的,如果在字段非常多的情况下,而且每个字段又有很复杂的验证,那么我们的validate方法中的代码会越来越多。  针对特定的方法输入的数据的验证我们把他放到validateXxx方法中,Xxx是方法名的首字母大写形式

步骤1:在Web项目的cn.happy.action下创建一个ValidateXxxAction(UserInfo为用户实体,其中有username和password属性,并且封装)   

 

 1 package cn.happy.action;
 2 
 3 import cn.happy.entity.UserInfo;
 4 import com.opensymphony.xwork2.ActionSupport;
 5 
 6 /**
 7  * 数据校验
 8  * Created by CKW on 2017/3/12.
 9  */
10 public class UserInfoAction extends ActionSupport {
11     private UserInfo info;
12 
13     @Override
14     public String execute() throws Exception {
15         return SUCCESS;
16     }
17 
18 
19     @Override
20     public void validate() {
21         if (info.getUname().length()==0){
22             addFieldError("name","用户名不能为空");
23         }
24         if (info.getUpwd().length()==0){
25             addFieldError("pwd","密码不能为空");
26         }
27     }
28 
29 
30 
31     public void validateRegist(){
32         if (info.getUname().length()<6||info.getUname().length()>15){
33             addFieldError("name","用户名长度必须在6~15之间");
34         }
35         if (info.getUpwd().length()<6||info.getUpwd().length()>12){
36             addFieldError("name","用密码长度必须在6~12之间");
37         }
38     }
39 
40     public String regist(){
41         return SUCCESS;
42     }
43 
44 
45     public UserInfo getInfo() {
46         return info;
47     }
48 
49     public void setInfo(UserInfo info) {
50         this.info = info;
51     }
52 }

步骤2:创建struts.xml文件,引用ValidateXxxAction类(这里加多了一个method属性,用来指定实现的方法)

 

        <action name="validateXxx" class="cn.happy.action.UserInfoAction" method="regist">
            <result name="success">/form/success.jsp</result>
            <result name="input">/form/login.jsp</result>
        </action>

步骤3.准备前段注册页面login.jsp和成功页面success.jsp

 

4、用struts2的验证框架实现数据校验(这里将不再Action中进行数据校验,而是在cn.happy.action下创建一个ActionName-validation.xml的文件,在这个文件中进行数据校验

 

① 为什么要用验证框架:

      当验证规则比较复杂时,Action类的代码将变得很繁琐,假如我们要对电话号码的格式进行验证,是非常麻烦的

        ②验证框架的优点:

      Struts2中内置了一个验证框架,将常用的验证规则进行了编码实现,使用验证框架时,用户无需再进行编码,只要在外部配置文件中指定某个字段需要进行的验证类型,并提供出错误信息即可,从而大大减轻了开发者的负担,提高开发效率

        ③命名规范:

       1、文件的命名规则:

      ActionName-validation.xml,ActionName为需要校验的Action类名,如:UserAction-validation.xml

 

       2、文件存放路径:

      该文件与Action类的class文件位于同一个路径下

 

       3、文件格式:包括如下3个配置元素

       <field>: 为每一个需要校验的字段添加一个验证元素<field>,name属性表示要校验的字段名。

       <field-validator>: 使用该元素来指定校验规则,type属性为校验规则名

       <message>: 使用该元素来指定校验出错时要显示的标签,key属性指向资源文件中的标签名

 

 步骤1:在Web项目的cn.ckw.action下创建一个ValidateXxxAction(UserInfo为用户实体,其中有uname和upwd属性,并且封装)

 

 1 package cn.ckw.entity;
 2 
 3 /**
 4  * Created by CKW on 2017/3/12.
 5  */
 6 public class UserInfo {
 7     private String uname;
 8     private String upwd;
 9 
10     public String getUname() {
11         return uname;
12     }
13 
14     public void setUname(String uname) {
15         this.uname = uname;
16     }
17 
18     public String getUpwd() {
19         return upwd;
20     }
21 
22     public void setUpwd(String upwd) {
23         this.upwd = upwd;
24     }
25 }

步骤2.在cn.ckw.action下创建UserInfoAction-validation.xml进行数据校验

 

<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator 1.0.3//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">

        <validators>
        
         <!-- 用户名:不能为空 长度在6-10之间 -->  
         <field name="info.username">
         <field-validator type="requiredstring">
         <param name="trim">true</param>
         <message>用户名不能为空</message>
         </field-validator>
         
         <field-validator type="stringlength">
         <param name="maxLength">10</param>
         <param name="minLength">6</param>
        <message>用户名长度必须在${minLength}和${maxLength}之间</message>
         </field-validator>
         
         </field>
         
        <!-- 验证密码-->
        <field name="info.password">
        <field-validator type="requiredstring">
        <message>密码不能为空</message>
        </field-validator>
        </field>
        
        <!-- 验证电话号码 -->    
        
        <field name="info.phone">
        <field-validator type="requiredstring">
        <message>电话号码不能为空</message>
        </field-validator>
        </field>
        
          
        <field name="info.phone">
        <field-validator type="regex">
        <param name="regex">^(\d{3,4}-){0,1}(\d{7,8})$</param>
        <message>电话号码格式不正确</message>
        </field-validator>
        </field>
        </validators>

 

 步骤3.创建struts.xml

 

        <action name="regist" class="cn.ckw.action.UserInfoAction">
            <result name="success">/form/success.jsp</result>
            <result name="input">/form/login.jsp</result>
        </action>

步骤4.准备前段注册页面login.jsp和成功页面success.jsp

 

 

 

 

posted on 2017-03-13 20:56  灵犀一脚C  阅读(204)  评论(0编辑  收藏  举报