国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

學習Jakarta Struts 1.1 (三)

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

  在第一篇文章《Jakarta Struts簡介》中,我大致分析了Struts框架,討論了它所能完成的功能,還瀏覽了組成Struts的各個組成部分。在第二篇文章《學習Jakarta Struts》中,我開始具體描述如何利用Struts來構建一個簡單應用的過程步驟。而本篇文章將會向大家演示如何將applicationResource文件中的文本信息,通過Struts標簽在jsp頁面中顯示出來。
  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,要驗證的用戶名
  

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 孙吴县| 微博| 思茅市| 肥乡县| 罗平县| 五大连池市| 佛学| 宝山区| 阿拉善右旗| 四子王旗| 克拉玛依市| 墨脱县| 灌云县| 柞水县| 本溪| 四平市| 托克托县| 都昌县| 赞皇县| 噶尔县| 民勤县| 滦南县| 云梦县| 高尔夫| 衡阳县| 武安市| 宜兰市| 沧州市| 清远市| 油尖旺区| 临江市| 大连市| 庐江县| 南川市| 射洪县| 辉县市| 上犹县| 交城县| 滕州市| 日喀则市| 澎湖县|