熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

JBuilder2005 Struts深度體驗之改造

2013-11-23 20:42:51  來源: Java開源技術 

  用ActionForm截獲登錄表單數據
  
  原登錄模塊用bookstoreUser描述loginjsp登錄頁面表單的數據在switchjsp程序中通過<jsp:useBean>標簽獲取loginjsp表單的數據其實User類相當於Struts框架中的模型我們將通過一個ActionForm更好地實現這個功能
  
  ActionForm和Bean一樣以屬性名匹配的映射機制從HTTP請求中填充對象數據但ActionForm比一般的Bean提供了更多的功能Struts允許ActionForm通過validate()方法進行自校驗當數據不合法時自動轉向到輸出界面此外還可以通過reset()方法在數據填充前復位屬性值
  
  下面我們就來創建UserActionForm替換User的功能建立起Struts框架中的數據模型
  
  .指定ActionForm的Web模塊及類信息
  
  File>New>Web>在Web頁中雙擊ActionForm圖標彈出如圖 所示的對話框
   
  圖 創建UserActionForm
  
  ·Struts config我們前面有提到Struts支持多個配置文件所以你在這兒可以選擇使用哪個Struts配置文件因為我們現在還沒有定義多個Struts配置文件所以只得使用strutsconfigxml在開發新增圖書的功能時我們將定義另一個配置文件
  
  ·ActionFormActionForm的類名這裡我們填入UserActionForm
  
  按Next到下一步
  
  .定義ActionForm屬性
   
  圖 定義ActionForm屬性
  
  通過Add按鈕為UserActionForm增加個屬性如圖 所示特別的如果這個ActionForm所對應的入口頁面已經創建你也可以直接通過Add from JSP按鈕選擇一個JSP頁面JBuilder會分析這個頁面的表單並將表單的數據組件名抽取為ActionForm的屬性
  
  按Next到下一步
  
  .一些附加功能的定義
   
  圖 附加功能定義
  
  在FormBeanName中為UserActionForm指定一個名字一般接受JBuilder所提供的默認名即可這個名字將在strutsconfigxml文件用來命名UserActionForm
  
  ActionForm比一般JavaBean強大的地方在於它可以進行數據檢驗還可以進行數據復位如果這個ActionForm最終要放到session中的那麼最好實現reset()方法以復位ActionForm的數據否則屬性可能不會反映最新的值這裡 UserActionForm無需進行數據有效性校驗但由於UserActionForm最終需要放到session中所以我們需要實現reset()方法故此我們勾選Create/replace reset() method body選項
  
  直接按Finish創建UserActionForm再將User類的代碼拷貝過來整改後的最終代碼如下所示
  
  代碼清單 以ActionForm實現的User類
  
   package bookstore;
  
   import javasql*;
   import javatext*;
   import javautilDate;
   import javaxservlethttp*;
   import orgapachestrutsaction*;
  
   public class UserActionForm
   extends ActionForm
   {
    private String userId;
    private String password;
    private String userName;
    private String loginDatetime;
    public String getPassword() {
     return password;
    }
  
    …
    //復位所有屬性值
    public void reset(ActionMapping actionMappingHttpServletRequest servletRequest) {
     thisuserId = null;
     thisuserName = null;
     thispassword = null;
     thisloginDatetime = null;
   }
  
  此外JBuilder自動在strutsconfxml文件中通過<formbean>描述ActionFormUserActionForm必須和一個Action相關聯因為HTTP請求通過Struts總控制器轉發給ActionStruts控制器一旦發現Action有一個對應的ActionForm時就用HTTP請求的數據填充這個ActionForm
  
  用Action代替switchjsp的控制轉換功能
  
  我們在前面已經數落用switchjsp實現請求轉換控制的缺點Struts框架的Action是實現請求轉換控制的最適合替代者
  
  在這節裡我們就來創建一個名為LoginAction的Action讓其完美的接替switchjsp的工作
  
  File>New>Web>在Web頁中雙擊Action圖標啟動創建Action的向導
  
  .指定Action名字及Web模塊
   
  圖 指定Web模塊及Action名字
  
  在Action中鍵入LoginAction作為Action的類名其中Base class的下拉框中有許多Action基類可供選擇它們用於不同的場合這些選項是
  
  ·orgapachestrutsactionAction標准的Action
  
  ·orgapachestrutsactionsForwardAction相當於JSP的<jsp:forward>方便Struts控制器進行預處理此外從學究的角度上來說在JSP頁面直接通過<jsp:forward>違反了MVC的分層原則控制器無法干預
  
  ·orgapachestrutsactionsIncludeAction出於ForwardAction相似的原因Struts推薦用IncludeAction代替JSP的<jsp:include>
  
  ·orgapachestrutsactionsLookupDispatchAction如果一個表單有多個提交按鈕不同的提交按鈕執行不同的業務操作用DispatchAction最為合適
  
  ·orgapachestrutsactionsSwitchAction用SwitchAction可在不同的Struts模塊間轉換
  
  由於我們的Action需要完成用戶密碼驗證的業務並根據結果轉換到不同的頁面中所以這個LoginAction是一個普通的Action故我們選擇orgapachestrutsactionAction
  
  按Next到下一步
  
  .設置Action的配置信息
   
  圖 設置LoginAction的配置信息
  
  ·Action path訪問這個Action的URI接受默認的/loginAction這樣我們將通過類似這樣的URL來訪問這個Action
  
  ·FormBean name下拉框中列出Web模塊中所有的ActionForm我們選擇前一小節中所創建的userActionForm這樣客戶端的HTTP請求訪問LoginAction時HTTP請求所帶的數據就會被Struts總控制器自動填充到userActionForm中了
  
  ·ScopeAction有兩個選擇request和session表示ActionForm在填充後將放在request對象中還是session對象中由於我們需要在通過密碼驗證後才使用戶登錄系統這樣就不能使userActionForm在數據填充時就放入session中而應該在通過密碼驗證後手工將其綁定到session中(UserActionForm一旦綁定到session中其valueBound()方法就會被調用記錄用戶登錄日志)故此我們選擇request
  
  ·input JSP輸入的JSP頁面在ActionForm需要進行數據有效性自校驗的情況下如果校驗失敗Struts框架總控制器將請求返回到這個輸入頁面上因為UserActionForm無需進行有效性校驗(在的第步我們沒有為UserActionForm實現自校驗功能)所以無需指定輸入的JSP
  
  按Finish按鈕直接創建LoginActionJBuilder自動打開Struts Config Editor生動形象地展現用戶登錄模塊Struts框架下的處理流程如圖 所示
   
  圖 Struts Config Editor
  
  位於中心的/loginAction是訪問LoginAction的URI它是登錄業務的控制器Struts總控制器創建一個UserActionForm實例並用HTTP請求的數據填充UserActionForm實例然後將其傳給LoginAction的execute()方法
  
  .定義訪問入口
  
  現在我們需要調整loginjsp表單的提交地址使用LoginAction來處理用戶登錄的請求調整後的代碼如所示
  
  代碼清單 loginjsp 使用LoginAction處理用戶登錄
  
   <%@page contentType=text/html; charset=GBK import=bookstoreUserList %>
  
   <form name=form method=post action=/webModule/loginActiondo>用戶名
    <select name=userId
     <option value= selected>登錄用戶</option>
      <%=UserListgetUserListHTML()%>
    </select>
    密 碼
    <input name=password type=password
     <input type=submit name=Submit value=登錄
   </form>
   </body>
   </html>
  
  如第行所示將原來action=switchjsp改為/webModule/loginActiondo由於我們需要將整個應用部署於/webModule的URI下所以需要在Action訪問的地址前加上/webModule如果通過Struts的<html:form>標簽來指定表單提交的地址則無需添加/webModule標簽將自動進行轉換你將在本專題後續內容中學習到這種方法
  
  注意
  
  Struts框架總控制器Servlet通過路徑匹配的方式截獲HTTP請求其匹配串是*do表示URL以do結束的HTTP請求才會被Struts框架處理否則Struts忽略之所以在寫鏈接地址時千萬不要忘了調用地址後加一個do的後綴
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28947.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.