首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Struts2 數據驗證實戰:手動驗證與 addFieldError 錯誤信息顯示

     編輯:Java 相關知識

數據驗證是 Web 應用安全與用戶體驗的第一道防線。Struts2 提供手動驗證(Action 方法中編碼邏輯)與聲明式驗證(XML/註解)兩種模式。本文以用戶提交姓名年齡為例,完整演示手動驗證流程:Action 中調用 addFieldError 記錄錯誤、返回 `ERROR` 結果、JSP 中用 `` 顯示錯誤信息。

一、前端表單

<form action="${pageContext.request.contextPath}/user/user!check" method="post">
    姓名: <input type="text" name="user.name" /><br/>
    年齡: <input type="text" name="user.age" /><br/>
    <input type="submit" value="提交" />
</form>

二、Action 類與手動驗證

public class UserAction extends ActionSupport {
    private User user; // 自動封裝 user.name、user.age
    
    public String check() {
        System.out.println("name=" + user.getName() + ", age=" + user.getAge());
        
        // 業務驗證邏輯
        if ("admin".equals(user.getName()) && user.getAge() == 20) {
            return SUCCESS;
        }
        
        // 驗證失敗:記錄字段級錯誤
        addFieldError("name", "用戶名必須為 admin");
        addFieldError("name", "用戶名長度不能超過 10 位"); // 同字段可添加多條
        addFieldError("age", "年齡必須為 20");
        
        return ERROR; // 對應 struts.xml 中 name="error" 的 result
    }
    
    // Getter/Setter
}

三、struts.xml 配置

<package name="user" namespace="/user" extends="struts-default">
    <action name="user" class="com.action.UserAction" method="{1}">
        <result>/success.jsp</result>
        <result name="error">/error.jsp</result>
        <result name="input">/register.jsp</result> <!-- 驗證框架攔截器默認返回 input -->
    </action>
</package>

四、錯誤顯示頁面

<%@ taglib prefix="s" uri="/struts-tags" %>
<html><body>
<h2>驗證失敗</h2>
<ul>
    <li><s:property value="errors.name[0]" /></li>  <!-- 第一條 name 錯誤 -->
    <li><s:property value="errors.name[1]" /></li>  <!-- 第二條 name 錯誤 -->
    <li><s:property value="errors.age[0]" /></li>   <!-- age 錯誤 -->
</ul>
<s:debug /> <!-- 調試面板,查看值棧詳情 -->
</body></html>

五、運行效果

輸入姓名 "test"、年齡 "25" 提交後,顯示:

  • 用戶名必須為 admin
  • 用戶名長度不能超過 10 位
  • 年齡必須為 20

六、關鍵機制解析

  1. addFieldError(fieldName, message):將錯誤信息存入值棧 fieldErrors Map,Key 為字段名,Value 為 List
  2. 返回 `ERROR`/`INPUT`:觸發對應 `` 跳轉錯誤頁
  3. errors.fieldName[index]:OGNL 表達式訪問錯誤列表,`errors` 是值棧頂層對象的特殊屬性
  4. <s:fielderror fieldName="name" />:標簽自動迭代顯示該字段所有錯誤(更推薦)

七、進階:聲明式驗證(XML)

創建 UserAction-check-validation.xml(Action名-方法名-validation.xml):

<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN"
    "https://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
    <field name="user.name">
        <field-validator type="requiredstring">
            <message>用戶名不能為空</message>
        </field-validator>
        <field-validator type="stringlength">
            <param name="minLength">3</param>
            <param name="maxLength">10</param>
            <message>用戶名長度 3-10 位</message>
        </field-validator>
    </field>
    <field name="user.age">
        <field-validator type="int">
            <param name="min">18</param>
            <param name="max">60</param>
            <message>年齡必須 18-60 歲</message>
        </field-validator>
    </field>
</validators>

需在 Action 類所在包配置 validation 攔截器(`struts-default` 已包含)。

八、最佳實踐建議

  1. 簡單業務用手動驗證:邏輯靈活、無額外文件
  2. 複雜/通用規則用聲明式:可復用、與業務代碼分離、支持國際化
  3. 字段級錯誤用 addFieldError、全局錯誤用 addActionError
  4. 前端統一用 <s:fielderror> 標簽,自動綁定字段、樣式可控
  5. 結合客戶端驗證(JS/JQuery Validation)提升用戶體驗,服務端驗證保底

九、總結

Struts2 手動驗證通過 addFieldError + 返回 `ERROR` + `` 形成完整閉環。掌握「字段級錯誤 Map 結構、OGNL 訪問路徑、結果頁面跳轉」三要素,即可快速構建健壯的表單驗證體系。聲明式驗證作為進階補充,處理跨 Action 通用規則更優雅。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved