麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

Jakarta Struts學習之實戰演示

2019-11-18 12:56:26
字體:
來源:轉載
供稿:網友

  Action類是連接Struts架構和應用中業務邏輯代碼的橋梁。所以你應該盡可能讓Action類小巧簡單,因為真實應用中的邏輯處理應該是由單獨分離出來的邏輯層來完成的。假如你正在從事n層應用的開發,你當然希望層與層之間的接口越簡單越好。而事實上,Action類中的主要方法"perform()"(1.1中為execute())卻有點暗示應該在本方法中做點什么的意思。我們知道,每個Action類都需要從 org.apache.struts.action.Action 繼續而來。在小型應用中,我們的Action類很可能就只要繼續org.apache.struts.action.Action就足夠了;而在某些特定的復雜應用中,我就從我們所實現的Action類中總結出來了一些通用特性。因此,在我看來,構造一個基類將這些通用特性的代碼實現出來,讓應用中所用到的所有Action類不直接繼續org.apache.struts.action.Action,而繼續這個完成了一些通用特性的基類以實現代碼重用,是一個相當不錯的設計。我在StrutsSample中就應用了這種方法,構造了這樣的一個基類,該基類的方法在完成復雜邏輯的和簡單轉發請求的Action類中都可以使用。
  
  package com.oreilly.actions;
  import java.io.IOException;
  import java.util.PRoperties;
  import java.util.ResourceBundle;
  import java.util.MissingResourceException;
  import java.util.Enumeration;
  import java.util.Properties;
  import java.rmi.RemoteException;
  import javax.ejb.EJBHome;
  import javax.ejb.CreateException;
  import javax.naming.Context;
  import javax.naming.InitialContext;
  import javax.naming.NamingException;
  import javax.servlet.ServletException;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  import org.apache.struts.action.Action;
  import org.apache.struts.action.ActionServlet;
  import org.apache.struts.action.ActionForm;
  import org.apache.struts.action.ActionForward;
  import org.apache.struts.action.ActionMapping;
  
  這個類就是使用Struts開發時,所有Action類都要繼續的基類。它把一些通常在實際應用中最有可能被用到的東西都考慮進來了。就這篇文章而言, 類中一些與Struts并不是太緊密相關的方法將只做注釋而不會完整的實現,而從事開發工作的你,有愛好的話,請完成這些方法并應用這個類,將為你在實際項目中的開發快馬加鞭。注重,因為所有的Action類都要從org.apache.struts.action.Action 繼續而來,所以我們的這個類同樣。
  
  public abstract class AbstStrutsActionBase extends Action {
   / * 定義一些在struts-config.xml中記錄在案的
    * 全局應用中皆可可通用的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 =
      ResourceBundle.getBundle("strutssample.properties");
    Properties properties = new Properties();
     properties.setProperty(
      Context.INITIAL_CONTEXT_FACTORY,
      resource.getString(Context.INITIAL_CONTEXT_FACTORY));
    properties.setProperty(
      Context.PROVIDER_URL,
      resource.getString(Context.PROVIDER_URL));
    properties.setProperty(
      Context.SECURITY_PRINCipAL,
      resource.getString(Context.SECURITY_PRINCIPAL));
    properties.setProperty(
      Context.SECURITY_CREDENTIALS,
      resource.getString(Context.SECURITY_CREDENTIALS));
    jndiContext = new InitialContext(properties);
  }
  
  注重:在真正的產品中,我們應該在此處考慮代碼的健壯性,將代碼加入到try/catch塊內,并記錄所有錯誤或重要信息到系統log中。而本例中,我們僅僅把異常往外拋,并假定一定會找到EJB對象的home接口并返回。
  
  return (jndiContext.lookup(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(
     "AbstStrutsActionBase.perform() [Action Class: "
      + this.getClass().getName()
      + " ]");
    getServlet().log(
     "AbstStrutsActionBase.perform() [Form Class : "
      + (form == null ? "null" : form.getClass().getName())
      + " ]");
   }
  然后,我們再編寫的每個Action類都應該從AbstStrutsActionBase繼續,并依照處理邏輯編寫各自的perform方法。讓我們用LoginAction為例,看看具體應該怎么應用吧。
  
  package com.oreilly.actions;
  
  import java.io.IOException;
  import java.rmi.RemoteException;
  import javax.ejb.CreateException;
  import javax.servlet.ServletException;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  import org.apache.struts.action.ActionError;
  import org.apache.struts.action.ActionErrors;
  import org.apache.struts.action.ActionForm;
  import org.apache.struts.action.ActionMapping;
  import org.apache.struts.action.ActionForward;
  import com.oreilly.forms.LoginForm;
  
  /*
  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與商務邏輯層是如何交互的
  * 所以具體實現代碼本例中就不提供了:)
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美a级在线免费观看 | 久久99综合久久爱伊人 | 亚洲天堂ww | 精品久久久久久久 | 91精品国产九九九久久久亚洲 | 中文字幕在线成人 | 欧美日韩在线影院 | 久久久久av电影 | 一级毛片免费高清 | 午夜神马电影网 | 国产成人精品免费视频大全办公室 | 成人毛片免费看 | 日韩黄在线观看 | 国产精品久久久久久久久久三级 | 一级α片免费看刺激高潮视频 | 毛片在哪看 | 精品一区二区在线播放 | 狠狠操人人干 | 亚洲第一成人在线视频 | 色婷婷久久久亚洲一区二区三区 | 国产成人精品二区 | 男女生羞羞视频网站在线观看 | 日本人乱人乱亲乱色视频观看 | 一区二区三高清 | 国产精品视频六区 | 澳门一级淫片免费视频 | 第四色成人网 | 久久国产精品99国产 | 国产精品入口夜色视频大尺度 | 中国洗澡偷拍在线播放 | 亚洲精品一区二区三区在线看 | 免费人成在线观看网站 | 国产成人精品免费视频大全最热 | 日本视频网 | 久久91久久久久麻豆精品 | 永久免费黄色大片 | 欧美日韩在线视频一区 | 国产免费观看一区二区三区 | 国产精品a一| 舌头伸进添的我好爽高潮网站 | 97中文字幕第一一一页 |