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 顯示錯誤
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
dwr
org.directwebremoting.servlet.DwrServlet
debug
true
activeReverseAjaxEnabled
false
1
dwr
/dwr/*
位置:`WEB-INF/dwr.xml`
);
]]>
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", "用戶名已存在");
}
}
}
<%@ 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 年代技術棧,現代項目建議:
| 現象 | 原因 | 解決 |
|---|---|---|
| 驗證不觸發 | theme="ajax" 缺失、DWR Servlet 未映射、dojo 腳本未載入 | 檢查網絡面板 `/dwr/engine.js`、`/dwr/interface/validator.js` 200 OK |
| 錯誤信息不顯示 | Dojo 版本衝突、HTML 結構不符合 Ajax Theme 預期 | 確保 ` |
| 中文亂碼 | DWR 請求/響應編碼未設定 UTF-8 | web.xml 添加 CharacterEncodingFilter、DWR 配置 `utf-8` |
| Session 衝突 | DWR 請求共享 Session、併發驗證導致狀態混亂 | 驗證邏輯無狀態化、避免在 validate() 中修改 Session |
Struts 2 + DWR + Ajax Theme 實現了服務端驗證邏輯零重複、前端即時反饋的經典模式。雖技術棧老舊,但驗證邏輯後置、前後端複用、聲明式配置的設計思想在現代 React/Vue + Spring Boot 架構中依然閃光。理解此整合機制,有助於遺留系統維護、遷移決策與現代驗證架構設計。