struts2之數據校驗

概述

  在提交表單數據時,若是數據須要保存到數據庫,空輸入等可能會引起一些異常,爲了不引發用戶的輸入引發底層異常,一般在進行業務邏輯操做以前,先執行基本的數據校驗。html

  下面經過四種方式來闡述Struts 2的數據校驗功能。web

校驗前準備工做數據庫

1.建立實體類express

public class UserInfo {
    private String uname;
    private String upwd;
    private String repwd;

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public String getUpwd() {
        return upwd;
    }

    public void setUpwd(String upwd) {
        this.upwd = upwd;
    }

    public String getRepwd() {
        return repwd;
    }

    public void setRepwd(String repwd) {
        this.repwd = repwd;
    }
}

2.建立Actionapache

public class LoginAction extends ActionSupport  {
    private UserInfo info;
   
    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }


    public UserInfo getInfo() {
        return info;
    }

    public void setInfo(UserInfo info) {
        this.info = info;
    }
}

3.jsp頁面api

<h1>用戶註冊</h1>
<s:fielderror></s:fielderror>
<s:form action="aaaaa" method="POST">
    <s:textarea label="用戶名" name="info.uname"/><br>
    <s:password label="密碼" name="info.upwd"/><br>
    <s:password label="確認密碼" name="info.repwd"/><br>
    <s:submit value="註冊"/>

 

一 用execute()實現校驗app

 

@Override
    public String execute() throws Exception {
        if (info.getUname().length()==0){
            addFieldError("uname","用戶名不能爲空");
        }
        if (info.getUpwd().length()==0){
            addFieldError("upwd","密碼不能爲空");
        }
        if(!info.getRepwd().equals(info.getUpwd())){
            addFieldError("repwd","兩次輸入密碼不一致");
        }
        if(this.hasFieldErrors()){
            return  INPUT;
        }
        return SUCCESS;
    }

 

struts.xml配置框架

<!--使用execute()方法實現數據校驗-->
  <action name="loginAction"    class="cn.happy.action.LoginAction">
                <result name="input">login.jsp</result>
                <result name="success">sucess.jsp</result>
   </action>  

二.使用validate()實現數據校驗jsp

 

@Override
    public void validate() {
        if (info.getUname().length()==0){
            addFieldError("uname","用戶名不能爲空");
        }
        if (info.getUpwd().length()==0){
            addFieldError("upwd","密碼不能爲空");
        }
        if(!info.getRepwd().equals(info.getUpwd())){
            addFieldError("repwd","兩次輸入密碼不一致");
        }
    }

 

struts.xml配置ide

 <!--使用validate()實現數據校驗-->
        <action name="loginAction" class="cn.happy.action.LoginAction">
            <result name="input">login.jsp</result>
            <result name="success">sucess.jsp</result>
        </action>

三.使用validateXxx()方法實現數據校驗

 

public void validateRegist(){
        if(info.getUname().length()<6||info.getUname().length()>15){
            addFieldError("uname","用戶名長度在6-15位");
        }
        if(info.getUpwd().length()<6){
            addFieldError("upwd","密碼要大於6位");
        }
    }
    public String Regist(){
        return SUCCESS;
    }
    public void validate() {
        if (info.getUname().length()==0){
            addFieldError("uname","用戶名不能爲空");
        }
        if (info.getUpwd().length()==0){
            addFieldError("upwd","密碼不能爲空");
        }
        if(!info.getRepwd().equals(info.getUpwd())){
            addFieldError("repwd","兩次輸入密碼不一致");
        }
    }

 

struts.xml配置

  配置action元素,指定Action由Regist()方法來進行請求的處理

 <!--使用validateXxx()方法實現數據校驗-->
       <action name="loginAction" class="cn.happy.action.LoginAction" method="Regist">
            <result name="input">login.jsp</result>
            <result name="success">sucess.jsp</result>
        </action>

四.使用框架驗證

 

已有的校驗器

 

Struts 2.0已經爲您實現不少經常使用的校驗了,如下在jar的default.xml中的註冊的校驗器。

< validators > 
    < validator name ="required" class ="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator" /> 
    < validator name ="requiredstring" class ="com.opensymphony.xwork2.validator.validators.RequiredStringValidator" /> 
    < validator name ="int" class ="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator" /> 
    < validator name ="double" class ="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator" /> 
    < validator name ="date" class ="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator" /> 
    < validator name ="expression" class ="com.opensymphony.xwork2.validator.validators.ExpressionValidator" /> 
    < validator name ="fieldexpression" class ="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator" /> 
    < validator name ="email" class ="com.opensymphony.xwork2.validator.validators.EmailValidator" /> 
    < validator name ="url" class ="com.opensymphony.xwork2.validator.validators.URLValidator" /> 
    < validator name ="visitor" class ="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator" /> 
    < validator name ="conversion" class ="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator" /> 
    < validator name ="stringlength" class ="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator" /> 
    < validator name ="regex" class ="com.opensymphony.xwork2.validator.validators.RegexFieldValidator" /> 
</ validators > 

使用校驗框架既能夠方便地實現表單數據校驗,又可以將校驗與Action分離,故咱們應該儘量使用校驗框架。

 

1編寫驗證文件,驗證文件要和驗證的Action放在同一個包下,而且採用ClassName-validation.xml方式命名,其中ClassName表示Action的類名

LoginAction-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-15位-->
    <field name="info.uname">
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message>用戶名不能爲空</message>
        </field-validator>
        <field-validator type="stringlength">
            <param name="maxLength">15</param>
            <param name="minLength">6</param>
            <message>用戶名長度必須在${minLength}和${maxLength}之間</message>
        </field-validator>
    </field>

    <!--驗證密碼不爲空,長度不小於6-->
    <field name="info.upwd">
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message>密碼不能爲空</message>
        </field-validator>
        <field-validator type="stringlength">
            <param name="minLength">6</param>
            <message>密碼長度應大於等於${minLength}</message>
        </field-validator>
    </field>

    <!--驗證確認密碼-->
    <field name="info.repwd">
        <field-validator type="fieldexpression">
            <param name="expression">info.upwd==info.repwd</param>
            <message>兩次輸入密碼要相同</message>
        </field-validator>
    </field>
</validators>

struts.xml配置

 <!--使用框架驗證-->
        <action name="aaaaa" class="cn.happy.action.LoginAction" >
            <result name="input">login.jsp</result>
            <result name="success">sucess.jsp</result>
        </action>

 

上述的輸出說明了Struts 2.0的數據校驗工做方式,它須要通過下面幾個步驟:

  1. 經過轉換器將請求參數轉換成相應的Bean屬性;
  2. 判斷轉換過程是否出現異常。若是有,則將其保存到ActionContext中,conversionError攔截器再封裝爲fieldError;若是沒有,進行下一步;
  3. 經過反射(Reflection)來調用validateXxx()方法(其中,Xxx表示Action的方法名);
  4. 調用validate()方法;
  5. 若是通過上述步驟沒有出現fieldError,則調用Action方法;若是有,則會跳過Action方法,經過國際化將fieldError輸出到頁面。

不喜歡看文字的朋友,能夠參考下面的圖1。

 

看到這裏可能你們會疑問:「這麼多地方能夠校驗表單數據,到底我應該在那裏作呢?」有選擇是好事,但抉擇的過程每每是痛苦的,每每讓人不知所措。若是你們參照如下幾點建議,相信會比較容易地作出正確的抉擇。

    1. 若是須要轉換的數據,一般作法在轉換的時候作格式的校驗,在Action中的校驗方法中校驗取值。假如用戶填錯了格式,咱們能夠經過在資源文件配置invalid.fieldvalue.xxx(xxx爲屬性名)來提示用戶正確的格式,不一樣的階段出錯顯示不一樣的信息。具體作法請參考上面的例子;
    2. 至於用validate()仍是validateXxx(),我推薦使用validate()。緣由是validateXxx()使用了反射,相對來講性能稍差,而validate()則是經過接口com.opensymphony.xwork2.Validateable調用。固然若是你的表單數據取值是取決於特定Action方法,則應該使用validateXxx()。  
相關文章
相關標籤/搜索