程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Unmi的Struts2學習筆記(十四)

Unmi的Struts2學習筆記(十四)

編輯:關於JAVA

生活中常為一些無傷大體之事優柔寡斷,譬如買羽毛球拍是方頭的還是圓頭的 呢?電子產品是這款好還是那款好呢?拿此又放下,舉彼又放下,最後靠概率來 決定。取其一,少段時間內總有些戚戚然,而後全然無所謂。小事無礙,大事可 就會後悔不及,無疑亦會讓許多機會徑直溜去。

1. 從此開始學習 Struts2 對 Ajax 的支持。這也是 Struts2 新注入的元素 。Struts2 的 Ajax 支持是建立在 Dojo 和 DWR 基礎之上的。提供了 Ajax 的輸 入檢驗,表單提交;pub-sub 事件模型、自動完成以及與 JSON 的使用等功能。

2. 在 Struts2.0.6 和 Struts2.0.11 的 apps/struts-showcase-2.x.x.war 中的 dwr 包都還是 dwr-1.1-beta-3.jar,當前 DWR 最新版是 2.0,前一個穩定 版是 1.1.4,所以正式應用可用 1.1.4 版,若用 2.0 DWR 需做充分的測試。 Struts2 的 Ajax 支持是建立在 ajax 主題上的,ajax 是擴展了 xhtml 主題。

3. 用 Ajax 進行輸入校驗有以下幾個步驟(當然項目中要引入 dwr 的 jar 包 ):

1) web.xml 中聲明 uk.ltd.getahead.dwr.DWRServlet 對 /dwr/* 請求進行 處理。

2) 增加 WEB-INF/dwr.xml 文件,內容為:

<!DOCTYPE dwr PUBLIC 
  "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" 
   "http://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>
<!DOCTYPE dwr PUBLIC
  "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN"
   "http://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 裡的寫法 ,在 JVM 1.4 下照樣能運行。

3) <s:head theme="ajax"> 導入 Ajax 主題的 controlheader.ftl; <s:form.../> 要設置 ajax 主題,並且設置 validate="true" 就會在輸 入組件失去焦點時,將輸入發到服務器進行校驗。

<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>
<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>

注:沒有 <s:head theme="ajax"/> 也能完成校驗,提示信息,但有 'dojo 未定義' 錯誤,且提示信息不會是紅色的。<s:form.../> 一定要是 theme="ajax" validate="true",否則不能作 ajax 校驗。

4) 校驗規則文件,規則文件的命名與提交到後端校驗是一樣的,所以此時 ajax 會用 LoginAction-validation.xml 中定義的規則來校驗輸入。

4. 試過一下把 xwork-2.0.1.jar 換成了 xwork-2.0.4.jar,結果進行 Ajax 校驗時,老報 java.lang.NoClassDefFoundError: Could not initialize class com.opensymphony.xwork2.validator.ValidatorFactory,原因還不明,但 ValidatorFactory 一直都的的確確是存在,以後用時先要注意到這一點,暫用 xwork-2.0.1.jar,有時間再去查明原因。

5. 表單的 Ajax 校驗未通過之前,是不能提交的,點提交按鈕沒反應。但是 真正的表單提交後的後台校驗也是必不可少的,因為 Ajax 校驗並不一定可靠, 在頁面上總有辦法改變值後不觸發 onblur 事件的,幸好,Ajax 校驗和提交後的 檢驗本來用的就是同一個校驗規則文件,Ajax 校驗之後還會有一次更可靠的校驗 。

6. 使用這種 Ajax 輸入校驗,一旦給 <s:form.../> 加上了 theme="ajax" validate="true" 屬性後就會給每個輸入組件加上 onblur 事件, 那要是某個輸入組件不需要 ajax 校驗,該如何做呢?連自己給組件加的 onblur 屬性也覆蓋不了 Struts2 生成的 onblur="validate(this);",處理辦法有二:

1) 在校驗規則文件中不加對該字段的配置,但中間的 XMLHttpRequest 請求 是少不了

2) 單獨給輸入組件指定 theme="xhtml",這樣風格也可以保持一致,因為 ajax 主題擴展自 xhtml 主題的。

7. 使用 Ajax 表單,如果給 <s:form.../> 指定了 theme="ajax",如 果點擊了 <s:submit targets="show"/> 將會以 Ajax 方式提交數據,當 前頁面不刷新,然後 Struts2 處理後的 result 頁面的內容將會作為當前頁中 ID 為 "show" 的 HTML 元素(如 <div id="show"></div>)的 innerHTML。targets 可以指定多個 ID,用逗號分隔,意味著同時更新多處。

8. 使用了 ajax 主題的 form 中,<s:submit executeScripts="true" targets="show"/>,點擊這個按鈕以 Ajax 提交表單,並以轉向頁的內容填充 ID 為 "show" 元素的 innerHTML,還能執行結果頁中的 JavaScript(vbscript不 執行)。最後那個結果應該只輸出需要數據,不用完整的 HTML 標簽。碰到一個問 題是,在結果頁裡加了 <s:debug/> 點擊提交按鈕執行不到其中的 javascript 腳本。

9. 考慮一個問題,當我們要用 Ajax 對表單校驗,<s:submit.../> 就 會以 Ajax 方式提交數據。那如果我們的需求只是用 Ajax 對輸入校驗,仍以傳 統方式對表單提交,該如何處理呢?問題關鍵其實就在那個提交按鈕上, <s:submit .../> 未指定 theme 屬性是繼承自 <s:form.../> 的 ajax 主題,只要給 <s:submit .../> 指定 theme="xhtml" 的話,風格不 變,卻可以用傳統方式提交,這個問題和第六點是一樣的。

10. 是關於 pub-sub 的理解,有些書寫的模模糊糊,我會把我對此的理解記 錄下來,這幾天有點事情太多,太累了,先占住這點,會補充的。

補充:

2008-05-27 dwr.xml 中的
  <signatures>
     <![CDATA[
      import java.util.Map;
      import org.apache.struts2.validators.DWRValidator;
       DWRValidator.doPost(String,String,Map<String,String>);
     ]]>
  </signatures>

是為了說明,DWRValidator 的 doPost 方法的參數 Map 集合中的類型,有 了這個 DWR 才知道怎麼處理這個參數,這是一種泛型的寫法。因為 DWR 本身提 供了對這種泛型寫法的解析器,所以可不依賴於 JDK 1.5 開始的泛型特性。在實 際使用中,如果集合 List/Map 中的元素類型(包括 Map 的 Key) 都是字符串的 話,可以不配置相應的 signatures。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved