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

Struts2 Validator 驗證框架全解析:三種驗證方式(代碼/XML/註解)實戰對比

     編輯:Java 相關知識

Struts2 內建 XWork Validator 框架,支援三種驗證方式:validate() 方法、XML 配置、註解。本文以用戶註冊場景為例,完整演示三種方式的配置、代碼、優缺點對比,並解決 XML 正則驗證參數名錯誤的遺留問題。

領域模型

public class User {
    private String name; private int age; private String email; private Date birthDay;
    // getter/setter 省略
}

方式一:代碼驗證(validate / validateX)

1. 通用 validate()

public class ValidatorAction extends ActionSupport {
    private User user; private List userList = new ArrayList<>();
    @Override public void validate() {
        if (user != null) {
            if (!regex(user.getName(), "^[A-Za-z][A-Za-z0-9_-]+$"))
                addFieldError("user.name", "用戶名格式錯誤");
            if (!regex(String.valueOf(user.getAge()), "(?:[1-9][0-9]?|1[01][0-9]|120)"))
                addFieldError("user.age", "年齡 0-120");
            if (outOfRange(user.getBirthDay(), "1900-01-01", "2017-01-01"))
                addFieldError("user.birthDay", "生日範圍錯誤");
            if (!regex(user.getEmail(), "^[a-zA-Z_][0-9]*@([a-zA-Z0-9-]+\\.)+[a-zA-Z-]+$"))
                addFieldError("user.email", "郵箱格式錯誤");
        }
    }
    public String addUser() { userList.add(user); return SUCCESS; }
    // regex/outOfRange 工具方法省略
}

struts.xml 需配置 `/register.jsp`,驗證失敗自動返回 input。

2. 針對具體方法 validateX()

方法名規則:validate + Action方法名首字母大寫,如 validateAddUser()。配置 `` 時生效,不同業務方法可用不同驗證邏輯。

方式二:XML 驗證(解耦驗證邏輯)

文件命名規則

  • 通用:`Action類名-validation.xml`(如 `ValidatorAction-validation.xml`)
  • 方法級:`Action類名-方法名-validation.xml`(如 `ValidatorAction-addUser-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="regex">
      <param name="regexExpression"><![CDATA[^[A-Za-z][A-Za-z0-9_-]+$]]></param>
      <message>用戶名格式錯誤</message>
    </field-validator>
  </field>
  <field name="user.email">
    <field-validator type="email"><message>郵箱格式錯誤</message></field-validator>
  </field>
  <field name="user.age">
    <field-validator type="int">
      <param name="min">1</param><param name="max">120</param>
      <message>年齡 1-120</message>
    </field-validator>
  </field>
  <field name="user.birthDay">
    <field-validator type="date" short-circuit="true">
      <param name="min">1900-01-01</param><param name="max">2050-02-21</param>
      <message>生日在 ${min} 到 ${max} 之間</message>
    </field-validator>
  </field>
</validators>

**關鍵修正**:正則驗證參數名為 regexExpression,而非 expression 或 regex(官方文檔易混淆,源碼確認為 regexExpression)。

JSP 引用

<struts:form action="regist" method="post" validate="true">
  <struts:textfield name="user.name" label="用戶名"/>
  <struts:textfield name="user.age" label="年齡"/>
  <struts:textfield name="user.birthDay" label="生日"/>
  <struts:textfield name="user.email" label="郵箱"/>
  <struts:submit value="註冊"/>
</struts:form>

方式三:註解驗證(代碼配置一體化)

@Validations(
    emails = @EmailValidator(fieldName="user.email", message="郵箱格式錯誤"),
    conversionErrorFields = @ConversionErrorFieldValidator(fieldName="user.age", message="年齡轉換錯誤"),
    intRangeFields = @IntRangeFieldValidator(fieldName="user.age", min="0", max="120", message="年齡 0-120"),
    dateRangeFields = @DateRangeFieldValidator(fieldName="user.birthDay", min="1900-01-01", max="2017-03-30", message="日期錯誤"),
    regexFields = @RegexFieldValidator(regexExpression="^[A-Za-z][A-Za-z0-9_-]+$", fieldName="user.name", message="用戶名格式錯誤")
)
public String addUser() { ... }

支援的驗證器:requiredString/required/intRange/dateRange/email/url/stringLength/regex/expression/visitor/custom 等。

三種方式對比總結

維度validate()XML註解
耦合度高(邏輯在 Action 中)低(獨立文件)中(類/方法上)
復用性差高(可被多 Action 引用)中
類型安全編譯期運行期編譯期
國際化手動支援 key支援 key
適用場景簡單、強業務邏輯複雜、跨 Action 復用中小型、偏好代碼配置

遺留問題補充

  1. 錯誤信息分批顯示:`short-circuit="true"` 導致該字段首個驗證器失敗即停止,去掉或設 `false` 可一次顯示所有錯誤
  2. XML 正則參數名:必須用 regexExpression,已在本文修正

Struts2 雖非主流,但其驗證框架設計思想(聲明式、可擴展、多格式)仍具參考價值。

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