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

Jakarta Struts學習之實戰演示

2022-06-13   來源: Java開源技術 

  Action類是連接Struts架構和應用中業務邏輯代碼的橋梁所以你應該盡可能讓Action類小巧簡單因為真實應用中的邏輯處理應該是由單獨分離出來的邏輯層來完成的如果你正在從事n層應用的開發你當然希望層與層之間的接口越簡單越好而事實上Action類中的主要方法perform()中為execute())卻有點暗示應該在本方法中做點什麼的意思我們知道每個Action類都需要從 orgapachestrutsactionAction 繼承而來在小型應用中我們的Action類很可能就只要繼承orgapachestrutsactionAction就足夠了而在某些特定的復雜應用中我就從我們所實現的Action類中總結出來了一些通用特性因此在我看來構造一個基類將這些通用特性的代碼實現出來讓應用中所用到的所有Action類不直接繼承orgapachestrutsactionAction而繼承這個完成了一些通用特性的基類以實現代碼重用是一個相當不錯的設計我在StrutsSample中就應用了這種方法構造了這樣的一個基類該基類的方法在完成復雜邏輯的和簡單轉發請求的Action類中都可以使用
  
  package comoreillyactions;
  import javaioIOException;
  import javautilProperties;
  import javautilResourceBundle;
  import javautilMissingResourceException;
  import javautilEnumeration;
  import javautilProperties;
  import javarmiRemoteException;
  import javaxejbEJBHome;
  import javaxejbCreateException;
  import javaxnamingContext;
  import javaxnamingInitialContext;
  import javaxnamingNamingException;
  import javaxservletServletException;
  import javaxservlethttpHttpServletRequest;
  import javaxservlethttpHttpServletResponse;
  import orgapachestrutsactionAction;
  import orgapachestrutsactionActionServlet;
  import orgapachestrutsactionActionForm;
  import orgapachestrutsactionActionForward;
  import orgapachestrutsactionActionMapping;
  
  這個類就是使用Struts開發時所有Action類都要繼承的基類它把一些通常在實際應用中最有可能被用到的東西都考慮進來了就這篇文章而言 類中一些與Struts並不是太緊密相關的方法將只做注釋而不會完整的實現而從事開發工作的你有興趣的話請完成這些方法並應用這個類將為你在實際項目中的開發快馬加鞭注意因為所有的Action類都要從orgapachestrutsactionAction 繼承而來所以我們的這個類同樣
  
  public abstract class AbstStrutsActionBase extends Action {
   / * 定義一些在strutsconfigxml中記錄在案的
    * 全局應用中皆可可通用的forward標識*/
   protected static final String SUCCESS = success;
   protected static final String FAILURE = failure;
   protected static final String ERROR = error;
   protected static final String LOGIN = login;
   protected static final String CONFIRM = confirm;
   protected Context jndiContext = null;
   /**
    * 默認構造方法
    */
   public AbstStrutsActionBase() {
  }
  
  /**
  
  下面這個查找EJB實例的方法將不會完整實現
  
  一般來說Action類應該調用實現了應用的商務邏輯的EJB會話bean(或僅僅普通JavaBean)在大型項目中開發人員必須劃清層與層之間的界限在Action類中我們應該拿到獲取含有JNDI信息的環境的實例然後通過EJB的JNDI名字去查詢獲取它的home接口過程並不簡單所以下面這個代碼片斷只是個給出了必要實現的小例子
  
  參數類型String傳入的要查詢JNDI的名字
  
  返回類型Object即查找到的home接口
  
  如果查找失敗拋出NamingException異常
  
  如果獲取資源信息失敗拋出MissingResourceException異常
  
  */
  
  public Object lookup(String jndiName)
    throws NamingException MissingResourceException {
   // 為調用EJB對象通過構建記錄JNDI信息的Properties對象
   // 來獲得初始環境信息
    if (jndiContext == null) {
     ResourceBundle resource =
      ResourceBundlegetBundle(strutssampleproperties);
    Properties properties = new Properties();
     propertiessetProperty(
      ContextINITIAL_CONTEXT_FACTORY
      resourcegetString(ContextINITIAL_CONTEXT_FACTORY));
    propertiessetProperty(
      ContextPROVIDER_URL
      resourcegetString(ContextPROVIDER_URL));
    propertiessetProperty(
      ContextSECURITY_PRINCIPAL
      resourcegetString(ContextSECURITY_PRINCIPAL));
    propertiessetProperty(
      ContextSECURITY_CREDENTIALS
      resourcegetString(ContextSECURITY_CREDENTIALS));
    jndiContext = new InitialContext(properties);
  }
  
  注意在真正的產品中我們應該在此處考慮代碼的健壯性將代碼加入到try/catch塊內並記錄所有錯誤或重要信息到系統log中而本例中我們僅僅把異常往外拋並假定一定會找到EJB對象的home接口並返回
  
  return (jndiContextlookup(jndiName));
  }
  由於Action類將是由Struts來調用的所以它的主要方法應該是一個抽象方法而由每個繼承的子類來具體實現或者在其中做一些所有Action都會做的通用機制例如記錄log信息在本例中我們一切從簡將其抽象之
  
  參數mapping其類型為ActionMapping將在本Action做跳轉選擇用
  
  參數actionForm由Struts根據本次HTTP請求數據填充完成的ActionForm對象(可選如果存在請求數據的話)
  
  參數request此Action所有處理的本次HTTP請求(對象)
  
  參數response此Action輸出數據所要用到的HTTP響應(對象)
  
  如果有I/O錯誤出現則本方法拋出IOException異常
  
  如果處理時發生servlet異常則本方法拋出ServletException異常
  
  本方法處理完請求後按照處理邏輯返回相應的頁面導向(對象)
  
  public abstract ActionForward perform(
    ActionMapping mapping
    ActionForm form
    HttpServletRequest request
    HttpServletResponse response)
    throws IOException ServletException;
  }
  或者讓這個抽象方法更有用一點那就在裡面干點什麼吧比如像下面這樣在其中記錄log
  
  {
    ActionForward forward = null;
    // 只是簡單的記錄一些提示信息到servlet log
  
    getServlet()log(
     AbstStrutsActionBaseperform() [Action Class:
      + thisgetClass()getName()
      + ]);
    getServlet()log(
     AbstStrutsActionBaseperform() [Form Class :
      + (form == null ? null : formgetClass()getName())
      + ]);
   }
  然後我們再編寫的每個Action類都應該從AbstStrutsActionBase繼承並依照處理邏輯編寫各自的perform方法讓我們用LoginAction為例看看具體應該怎麼應用吧
  
  package comoreillyactions;
  
  import javaioIOException;
  import javarmiRemoteException;
  import javaxejbCreateException;
  import javaxservletServletException;
  import javaxservlethttpHttpServletRequest;
  import javaxservlethttpHttpServletResponse;
  import orgapachestrutsactionActionError;
  import orgapachestrutsactionActionErrors;
  import orgapachestrutsactionActionForm;
  import orgapachestrutsactionActionMapping;
  import orgapachestrutsactionActionForward;
  import comoreillyformsLoginForm;
  
  /*
  LoginAction 將演示一個Action將如何被Struts架構所調用
  
  在這個例子中我們只是簡單的演示perform方法是如何調用執行並返回的
  
  */
  public class LoginAction extends AbstStrutsActionBase {
  接下來這個是驗證用戶的方法本例中沒有具體實現但一個典型的應用方案是調用JavaBean或者EJB來完成用來查找EJB的lookup方法(在基類中完成的)應該在本方法中被調用其返回一個依據後台數據庫驗證用戶的接口
  
  參數類型String要驗證的用戶名
  
  參數類型String密碼
  
  返回類型boolean如果驗證通過為true否則為false
  
  public boolean authenticate(String username String password) {
  /* 本方法將先做一個查找動作獲得驗證用戶的EJB對象的接口並調用
  * 由於本例只演示Action與商務邏輯層是如何交互的
  * 所以具體實現代碼本例中就不提供了:)
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28007.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.