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

Struts 2 學習筆記(十四):Ajax 支援全解析——基於 Dojo 與 DWR 的客戶端驗證與異步提交

     編輯:Java 相關知識

Struts 2 的 Ajax 支援建立在 Dojo 與 DWR 基礎之上,提供輸入驗證、表單提交、發布-訂閱事件模型、自動完成與 JSON 整合等功能。筆記記錄於 Struts 2.0.6/2.0.11 版本環境,實戰經驗分享。

環境與版本注意事項

  • 內建 dwr-1.1-beta-3.jar,正式環境建議升級至穩定版 1.1.4;若用 DWR 2.0 需充分測試
  • Ajax 主題擴展自 xhtml 主題,啟用方式:<s:head theme="ajax"/> + <s:form theme="ajax" validate="true">

Ajax 輸入驗證:四步驟完整配置

1. web.xml 宣告 DWR Servlet

<servlet>
  <servlet-name>dwr</servlet-name>
  <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>dwr</servlet-name>
  <url-pattern>/dwr/*</url-pattern>
</servlet-mapping>

2. WEB-INF/dwr.xml 配置驗證器

<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"
  "https://www.getahead.ltd.uk/dwr/dwr10.dtd">
<dwr>
  <allow>
    <create javascript="validator" creator="new">
      <param name="class" value="org.apache.struts2.validators.DWRValidator"/>
    </create>
    <convert match="com.opensymphony.xwork2.ValidationAwareSupport" converter="bean"/>
  </allow>
  <signatures>
    <![CDATA[
      import java.util.Map;
      import org.apache.struts2.validators.DWRValidator;
      DWRValidator.doPost(String, String, Map<String, String>);
    ]]>
  </signatures>
</dwr>

關鍵點:Map<String,String> 寫法為 DWR 泛型解析器所需,不依賴 JDK 1.5 泛型特性,JVM 1.4 亦可運行。若集合元素皆為字串,可省略 signatures。

3. JSP 頁面啟用 Ajax 主題與驗證

<s:head theme="ajax"/>
<s:form action="Login" method="post" theme="ajax" validate="true">
  <s:textfield name="name" label="姓名"/>
  <s:textfield name="pass" label="密碼"/>
  <s:submit label="登入"/>
</s:form>

輸入框失去焦點(onblur)時自動發送 XMLHttpRequest 至伺服器驗證。缺少 <s:head theme="ajax"/> 雖能驗證但會報 dojo 未定義 錯誤且提示非紅色。

4. 驗證規則檔案

命名慣例同後端驗證:ActionName-validation.xml。Ajax 直接使用該檔案定義的規則。

實戰踩坑與解決方案

xwork 版本相容性問題

將 xwork-2.0.1.jar 換成 2.0.4.jar 後,Ajax 驗證拋出 NoClassDefFoundError: ValidatorFactory。雖類別確實存在,但初始化失敗。暫時回退 2.0.1,後續再查明根因。

前後端雙重驗證機制

Ajax 驗證未通過時表單無法提交。但後端驗證不可省略,因前端值可被竄改繞過 onblur 事件。幸運的是兩者共用同一驗證規則檔,Ajax 後仍有一次可靠的後端驗證。

個別欄位跳過 Ajax 驗證

Struts 2 會強制產生 onblur="validate(this);",自行添加 onblur 也會被覆蓋。兩種解法:

  1. 驗證規則檔不配置該欄位(仍會發 XMLHttpRequest 但無驗證邏輯)
  2. 單獨為該輸入元件指定 theme="xhtml"(風格一致,因 ajax 擴展自 xhtml)

Ajax 表單提交與局部更新

<s:submit targets="show"/> 以 Ajax 方式提交,結果頁內容作為 <div id="show"> 的 innerHTML。targets 可指定多個 ID(逗號分隔)同時更新多處。

<s:submit executeScripts="true" targets="show"/> 可執行結果頁中的 JavaScript(VBScript 不執行)。結果頁應僅輸出所需資料片段,非完整 HTML。注意:結果頁含 <s:debug/> 時,JavaScript 可能不執行。

混合模式:Ajax 驗證 + 傳統提交

需求:輸入驗證用 Ajax,提交用傳統方式。關鍵在提交按鈕:<s:submit theme="xhtml"/> 覆寫表單繼承的 ajax 主題,風格不變卻以傳統方式提交。同理可解決「個別欄位不需 Ajax 驗證」問題。

發布-訂閱(Pub-Sub)事件模型

Struts 2 基於 Dojo 實現 Pub-Sub 模型,允許鬆耦合的元件通訊。詳細理解與實戰範例將於後續補充。

補充:dwr.xml 中 signatures 的作用

告知 DWR DWRValidator.doPost 方法參數中 Map 集合的泛型類型,使 DWR 知道如何處理該參數。DWR 內建泛型解析器,不依賴 JDK 1.5。實際使用中,若 List/Map 元素類型(含 Map Key)皆為字串,可省略 signatures 配置。

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