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

使用ActionForward優化Struts應用程序

2013-11-23 18:42:54  來源: Java核心技術 

  從一個servlet內部通過運用javaxservletRequestDispatcher類的forward方法你就可以將控制流程引導到一個目的資源在login應用程序的action類中該代碼形式如下

  
  RequestDispatcher rd = requestgetRequestDispatcher(destination);
  rdforward(request response);

  其中destination就是到一個目的資源的路徑

  但是在一個典型的Struts應用程序中你可以用ActionForward類作為替代運用這個類的好處就是你不再需要創建一個RequestDispatcher對象並調用它的forward方法了

  你可以將ActionForward類用於一個Action類的execute方法中注意其中一個重載的execute方法有如下的定義它返回一個ActionForward對象

  
  public ActionForward execute(
  ActionMapping mapping
  ActionForm form HttpServletRequest request
  HttpServletResponse response)
  throws Exception

  因為當時我們還沒有講到ActionForward類所以在本系列的第一部分和第二部分中所有Action類的execute方法都只返回了空值現在在一個Action類的execute方法中你就可以用ActionForward類來代替下面這個RequestDispatcher對象實例了

  
 RequestDispatcher rd = requestgetRequestDispatcher(destination);
  rdforward(request response);

  新的代碼變成return (new ActionForward(destination));

  構建ActionForward對象

  ActionForward類提供了下面五種構造器

  
    public ActionForward()
  public ActionForward(String path)
  public ActionForward(String path boolean redirect)
  public ActionForward(String name String path boolean redirect)
  public ActionForward(String name String path boolean redirect boolean contextRelative)

  雖然這些構造器是不需要說明的但我們應該注意下面幾點在這些構造器中第二種可能是最常用的後四種構造器中的path參數表示的是到目的資源的路徑後三種構造器中的redirect布爾值表示的是是否執行了一個重定向(redirect)(缺省情況下這個值設置為false因為redirect比forward慢)最後第五個構造器中的contextRelative布爾值表示該路徑是否應該是contextrelative的而不是modulerelative的

  同樣一個ActionForward實例也可以有一個邏輯名稱你可以用這個名稱來查找與一個特殊的ActionMapping對象相關的實例(參見本系列第四部分關於ActionMapping的講述)

  學習ActionForward類的方法

  ActionForward類定義了三個保護字段——namepath和redirect——它們構成了ActionForward的三個屬性ActionForward類提供getter和setter方法來從這些字段讀值給這些字段賦值這些方法是不需要說明的定義如下

  
 public boolean getContextRelative()
  public void setContextRelative(boolean contextRelative)
  public String getName()
  public void setName(String name)
  public String getPath()
  public void setPath(String path)
  public boolean getRedirect()
  public void setRedirect(boolean redirect)

  除此之外ActionForward類還重載了toString方法並返回ActionForward[ + name + ]其中name是名稱字段

  最後還有一個freeze方法它固定了一個組件的配置

  再次運用Login應用程序

  要完全了解ActionForward類我們需要再次運用在本系列第一部分和第二部分構建的login應用程序你可以下載完整的應用程序把它重命名為myStrutsApp它的webxml和strutsconfigxml文件同myStrutsApp中的文件是一樣的JSP頁面也沒有改變只有action類同以前不同

  注意下面這行代碼是新的return (new ActionForward(/mainMenujsp));

  它替代了下面這些代碼現在它們都被注釋出來了

  
 RequestDispatcher rd = requestgetRequestDispatcher(/mainMenujsp);
  rdforward(request response);

  同樣下面這些代碼也都被重寫了

  
 // RequestDispatcher rd = requestgetRequestDispatcher(/loginjsp);
  // rdforward(request response);

  新的代碼變成return (new ActionForward(/loginjsp));

  ViewSecretAction類

  ViewSecretAction也變得更好了execute方法最後的這三行代碼現在由一行來處理了返回(new ActionForward (/viewSecretjsp)):

  
 //RequestDispatcher rd =requestgetRequestDispatcher(/viewSecretjsp);
  //rdforward(request response);
  //  return null;

  接下來我們來重新查看LogoutAction類(見列表)注意execute方法中下面這些代碼已經被替代了

  
 // RequestDispatcher rd = requestgetRequestDispatcher(/loginjsp);
  // rdforward(request response);
  // return null;

  你只需要用下面這一行代碼來取代它就行了return (new ActionForward(/loginjsp));

  ActionForward是個很有用功能很多的類它可以讓你更簡單更快更直接地完成許多事情這可能就是它很受歡迎的原因在本系列的第四部分你可以了解另一個重要的類orgapachestrutsactionActionMapping它可以使你的代碼更有效更漂亮


From:http://tw.wingwit.com/Article/program/Java/hx/201311/25615.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.