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

Struts 2 表單驗證整合 DWR 實現 AJAX 即時校驗效果實戰

     編輯:Java 相關知識

Struts 2 內建驗證框架支援服務端校驗,配合 DWR (Direct Web Remoting) 可實現無刷新 AJAX 即時校驗。本文完整演示 DWR Servlet 配置、dwr.xml 規則定義、Struts 2 Ajax Theme 啟用與前後端整合流程。

架構原理


瀏覽器 (JS 事件) 
    → DWR Engine (JS) 
    → HTTP POST /dwr/... 
    → DWR Servlet (Server) 
    → DWRValidator (Struts 2 內建) 
    → 調用 Action 驗證邏輯 (validateXxx / validateDoXxx) 
    → 返回錯誤信息 JSON 
    → DWR Engine 更新頁面 DOM 顯示錯誤

步驟 1: 引入依賴




    org.directwebremoting
    dwr
    3.0.2-RELEASE 


    org.apache.struts
    struts2-dwr-plugin
    2.5.30 



    org.apache.struts
    struts2-dojo-plugin
    2.5.30

步驟 2: 配置 web.xml - DWR Servlet



    dwr
    org.directwebremoting.servlet.DwrServlet
    
        debug
        true 
    
    
        activeReverseAjaxEnabled
        false
    
    1


    dwr
    /dwr/*

步驟 3: 編寫 dwr.xml - 暴露驗證器

位置:`WEB-INF/dwr.xml`




    
        
        
            
        
        
        
    
    
        );
        ]]>
    

步驟 4: Action 實現驗證邏輯


package com.example.action;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.validator.annotations.*;

public class UserAction extends ActionSupport {
    private String username;
    private String email;
    private String password;
    
    // Getter/Setter 省略
    
    // 字段級驗證 (對應字段名)
    @Validations(
        requiredStrings = {
            @RequiredStringValidator(fieldName = "username", message = "用戶名不能為空"),
            @RequiredStringValidator(fieldName = "email", message = "Email 不能為空"),
            @RequiredStringValidator(fieldName = "password", message = "密碼不能為空")
        },
        emails = {
            @EmailValidator(fieldName = "email", message = "Email 格式不正確")
        },
        stringLengthFields = {
            @StringLengthFieldValidator(fieldName = "username", minLength = "3", maxLength = "20", message = "用戶名長度 3-20"),
            @StringLengthFieldValidator(fieldName = "password", minLength = "6", maxLength = "30", message = "密碼長度 6-30")
        }
    )
    public String register() {
        // 業務邏輯
        userService.register(username, email, password);
        return SUCCESS;
    }
    
    // 也可實現 validate() 方法進行複雜邏輯驗證
    public void validate() {
        if (userService.exists(username)) {
            addFieldError("username", "用戶名已存在");
        }
    }
}

步驟 5: JSP 頁面啟用 Ajax Theme


<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib prefix="sx" uri="/struts-dojo-tags" %>


    AJAX 即時驗證註冊
    
    
    
    



    
    
    
    



關鍵配置解析

配置項作用注意事項
`theme="ajax"`啟用 Struts 2 Ajax Theme (基於 Dojo)需引入 `struts2-dojo-plugin`,Struts 2.5+ 建議遷移至原生 JS/JQuery
`validate="true"`開啟表單級 AJAX 驗證配合 DWRValidator 實現服務端驗證邏輯複用
``引入 Dojo 核心、Struts 2 Ajax 支援腳本`debug="true"` 開發便於調試,生產 `compressed="true"`
`validator.js`DWR 生成的 JS 代理,調用 `validator.doPost()`路徑固定 `/dwr/interface/validator.js`

現代化遷移建議

Struts 2 Ajax Theme + DWR + Dojo 屬於 2008-2012 年代技術棧,現代項目建議:

  1. 前端驗證優先:HTML5 原生驗證 (`required`、`pattern`、`type="email"`) + JavaScript 即時反饋
  2. 後端 API 驗證:Spring MVC `@Valid` + `@RequestBody` + Bean Validation (Hibernate Validator) 返回結構化錯誤 JSON
  3. 前端框架整合:React/Vue/Angular 表單庫 (React Hook Form、VeeValidate、Angular Reactive Forms) 管理狀態與顯示
  4. 統一錯誤格式:RFC 7807 Problem Details / 自定義 `{field, message, code}` 結構
  5. 移除 DWR/Dojo:雙向綁定框架 + REST API 完全替代 DWR 遠程調用模式

常見問題排查

現象原因解決
驗證不觸發theme="ajax" 缺失、DWR Servlet 未映射、dojo 腳本未載入檢查網絡面板 `/dwr/engine.js`、`/dwr/interface/validator.js` 200 OK
錯誤信息不顯示Dojo 版本衝突、HTML 結構不符合 Ajax Theme 預期確保 `` 產生的結構包含 `errorMessage` 容器、升級 struts2-dojo-plugin
中文亂碼DWR 請求/響應編碼未設定 UTF-8web.xml 添加 CharacterEncodingFilter、DWR 配置 `utf-8`
Session 衝突DWR 請求共享 Session、併發驗證導致狀態混亂驗證邏輯無狀態化、避免在 validate() 中修改 Session

總結

Struts 2 + DWR + Ajax Theme 實現了服務端驗證邏輯零重複、前端即時反饋的經典模式。雖技術棧老舊,但驗證邏輯後置、前後端複用、聲明式配置的設計思想在現代 React/Vue + Spring Boot 架構中依然閃光。理解此整合機制,有助於遺留系統維護、遷移決策與現代驗證架構設計。

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