1. 程式人生 > >Struts2資料校驗功能實現

Struts2資料校驗功能實現

前言

資料校驗一般是校驗表單項的內容。
而驗證的主要通過:
前臺驗證:主要是通過JS驗證資料是否合法!
後臺驗證:通過後臺java程式碼進行驗證!
那麼,本文主要介紹後端Struts校驗的實現。
回顧之前的資料驗證,主要是在業務邏輯程式碼之前增加if條件判斷來進行校驗的。比如:在登入時候在Action中的login()方法中進行判斷,但是我們只想在login()寫業務邏輯,不想搞這麼複雜的程式碼,那麼,想在系統呼叫login()方法之前就自動先校驗資料了,那麼Struts定義了validate資料校驗的攔截器,即在執行action中的業務方法之前執行資料校驗方法。

struts中資料校驗的攔截器為:

<interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>

Struts資料校驗主要有四種方式。我們分別來討論。

通過程式碼方式驗證Action中所有的方法

我們來驗證註冊頁面中資料的校驗。
Action實現:

public class UserAction extends ActionSupport {

    // 封裝請求資料
    private User user = new User();
    public
void setUser(User user) { this.user = user; } public User getUser() { return user; } // 重寫資料驗證的方法 @Override public void validate() { // 使用者名稱非空 if (user.getUserName() == null || "".equals(user.getUserName())) { // 儲存錯誤資訊 super
.addFieldError("userName", "使用者名稱必須填寫!"); } // 密碼 if (user.getPwd() == null || "".equals(user.getPwd())) { super.addFieldError("pwd", "密碼必填"); } } public String register(){ return "success"; } }

在ActionSupport類中定義了validate()方法,我們需要重寫它。
在驗證方法中的super.addFieldError(“userName”, “使用者名稱必須填寫!”);其實內部封裝了一個map集合來儲存校驗錯誤資訊的,通過檢視原始碼。

public synchronized void addFieldError(String fieldName, String errorMessage) {
        // 1. 儲存錯誤資訊的map集合
        final Map<String, List<String>> errors = internalGetFieldErrors();
        // 2. Map的value值  (一個key,對應的多個值用list儲存)
        List<String> thisFieldErrors = errors.get(fieldName);
        // 3. 如果錯誤資訊的map中沒有當前的key,就直接建立集合
        if (thisFieldErrors == null) {
            // 建立
            thisFieldErrors = new ArrayList<String>();
            errors.put(fieldName, thisFieldErrors);
        }
         // 4. 新增錯誤資訊
        thisFieldErrors.add(errorMessage);
    }

通過程式碼方式驗證Action中指定的方法

和上面的程式碼大致相同,只需要修改一點,就是講Action中的validate()方法名字改為validata+指定校驗方法的字尾.
例如:校驗register()方法,那麼public void validateRegister() {},只會驗證當前action的register方法!其他內容不變!

總結程式碼方式驗證
繁瑣,設計很多重複的驗證邏輯!例如:非空驗證、數值驗證、email、日期等。

通過XML方式驗證Action中所有的方法

Struts對於常用的驗證,進行了封裝,即提供了驗證器, 驗證指定的常用業務邏輯!
Struts提供的所有驗證器在xwork-core-2.3.4.1.jar/com.opensymphony.xwork2.validator.validators/default.xml中定義:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator Definition 1.0//EN"
        "http://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd">

<!-- START SNIPPET: validators-default -->
<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="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
    <validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
    <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"/>
    <validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
</validators>
<!--  END SNIPPET: validators-default -->

寫XML檔案注意
1)XML檔名稱語法: ActionClassName-validation.xml
注意:此xml需要與當前要驗證的action在同一個目錄:
舉例:UserAction-validation.xml
2)寫XML內容
在struts原始碼中找到定義了xml書寫規則(xwork-validator-1.0.3.dtd檔案中)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator 1.0.3//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">

<validators>

    <!-- 驗證的每一個欄位用field表示 -->
    <field name="user.userName">
        <!-- 指定使用的驗證器 -->
        <field-validator type="requiredstring">
            <!-- 驗證失敗的錯誤提示資訊 -->
            <message>使用者名稱不能為空!</message>
        </field-validator>
    </field>

    <!-- 驗證pwd -->
    <field name="user.pwd">

        <!-- 非空 -->
        <field-validator type="requiredstring">
            <message>密碼不能為空!</message>
        </field-validator>

        <!-- 長度 -->
        <field-validator type="stringlength">
            <param name="minLength">6</param>
            <param name="maxLength">8</param>
            <message>密碼必須為6-8位!</message>
        </field-validator>
    </field>

    <!-- 驗證日期 -->
    <field name="user.birth">
        <field-validator type="date">
            <message>日期格式不對!</message>
        </field-validator>
    </field>

    <!-- 驗證Email -->
    <field name="user.email">
        <field-validator type="email">
            <message>郵箱格式錯誤!</message>
        </field-validator>
    </field>

</validators>       

上面主要是驗證UserAction類的所有方法!

XML方式驗證Action中指定的方法

與上面xml驗證方式大致相同: 驗證xml檔案內容不變;
檔案命名修改為:
語法:ActionClassName-ActionName-validation.xml
舉例:UserAction-user_register-validation.xml,這裡是配置檔案中Action的name屬性值。
驗證UserAction中的register方法

Struts驗證總結

程式碼:
重寫validate() , 驗證action所有方法
Validate+方法名(), 驗證指定“方法名”的方法
Xml:
驗證所有方法: ActionClassName-validation.xml
驗證指定方法: ActionClassName-actionName-validation.xml

程式碼驗證,
比較靈活,可以滿足所有的需求.
比較繁瑣,要寫重複的驗證判斷邏輯!
適合: 表單欄位較少的情況用!
XML驗證:
通用,但不夠靈活; 可以驗證特定簡單的業務。
適合: 驗證表單欄位較多,可以大大簡化程式碼!
(配置檔案過多)

資料校驗錯誤資訊處理

Struts在進行資料效驗的時候,驗證失敗,會返回input檢視,要求我們要在struts.xml中配置input檢視對應的錯誤頁面!
Struts.xml

<!-- 註冊失敗跳轉到註冊頁面,顯示失敗資訊 -->
        <global-results>
            <result name="input">/register.jsp</result>
        </global-results>

Jsp顯示錯誤

<form action="${pageContext.request.contextPath }/admin_login.action" method="post"> 
      使用者名稱:<input type="text" name="admin.name">
        <s:fielderror fieldName="admin.name">
        </s:fielderror>
      <br/>
      密碼:<input type="password" name="admin.password">
       <s:fielderror fieldName="admin.password">
        </s:fielderror>
      <br/>
      <input type="submit" value="登入">
   </form>

什麼都不輸入,顯示如下:
這裡寫圖片描述
struts標籤的<s:fielderror>有一定的樣式,審查元素可以看到,添加了ul標籤。
這裡寫圖片描述

為了頁面美觀,我們可以修改Struts標籤預設的樣式。主要有兩種方式。

第一種,在頁面中加入css樣式,如下:

<!-- 修改struts標籤預設的樣式: 不讓換行 --> 
    <style type="text/css">
    ul{
        display: inline;
    }
    ul li{
        display: inline;
        color: red;
    }
    </style>

顯示結果如下:
這裡寫圖片描述

第二種方式:修改Struts原始碼中配置檔案。
修改標籤定義的模板
找到fielderror標籤定義的模板檔案:
Struts-core.jar\template\simple\ fielderror.ftl

把修改後的fielderror.ftl檔案內容,把ul標籤和換行符等去除,然後放到src/ template/ simple/ fielderror.ftl,伺服器會先載入Struts中的檔案,然後在載入src中的檔案,發現檔名一致,那麼前者將會被覆蓋掉,這樣標籤顯示的樣式就修改了!