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

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Jakarta Struts學(xué)習(xí)之實(shí)戰(zhàn)演示

2019-11-18 12:56:26
字體:
供稿:網(wǎng)友

  Action類是連接Struts架構(gòu)和應(yīng)用中業(yè)務(wù)邏輯代碼的橋梁。所以你應(yīng)該盡可能讓Action類小巧簡單,因?yàn)檎鎸?shí)應(yīng)用中的邏輯處理應(yīng)該是由單獨(dú)分離出來的邏輯層來完成的。假如你正在從事n層應(yīng)用的開發(fā),你當(dāng)然希望層與層之間的接口越簡單越好。而事實(shí)上,Action類中的主要方法"perform()"(1.1中為execute())卻有點(diǎn)暗示應(yīng)該在本方法中做點(diǎn)什么的意思。我們知道,每個(gè)Action類都需要從 org.apache.struts.action.Action 繼續(xù)而來。在小型應(yīng)用中,我們的Action類很可能就只要繼續(xù)org.apache.struts.action.Action就足夠了;而在某些特定的復(fù)雜應(yīng)用中,我就從我們所實(shí)現(xiàn)的Action類中總結(jié)出來了一些通用特性。因此,在我看來,構(gòu)造一個(gè)基類將這些通用特性的代碼實(shí)現(xiàn)出來,讓應(yīng)用中所用到的所有Action類不直接繼續(xù)org.apache.struts.action.Action,而繼續(xù)這個(gè)完成了一些通用特性的基類以實(shí)現(xiàn)代碼重用,是一個(gè)相當(dāng)不錯(cuò)的設(shè)計(jì)。我在StrutsSample中就應(yīng)用了這種方法,構(gòu)造了這樣的一個(gè)基類,該基類的方法在完成復(fù)雜邏輯的和簡單轉(zhuǎn)發(fā)請求的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;
  
  這個(gè)類就是使用Struts開發(fā)時(shí),所有Action類都要繼續(xù)的基類。它把一些通常在實(shí)際應(yīng)用中最有可能被用到的東西都考慮進(jìn)來了。就這篇文章而言, 類中一些與Struts并不是太緊密相關(guān)的方法將只做注釋而不會(huì)完整的實(shí)現(xiàn),而從事開發(fā)工作的你,有愛好的話,請完成這些方法并應(yīng)用這個(gè)類,將為你在實(shí)際項(xiàng)目中的開發(fā)快馬加鞭。注重,因?yàn)樗械腁ction類都要從org.apache.struts.action.Action 繼續(xù)而來,所以我們的這個(gè)類同樣。
  
  public abstract class AbstStrutsActionBase extends Action {
   / * 定義一些在struts-config.xml中記錄在案的
    * 全局應(yīng)用中皆可可通用的forward標(biāo)識(shí)*/
   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;
   /**
    * 默認(rèn)構(gòu)造方法
    */
   public AbstStrutsActionBase() {
  }
  
  /**
  
  下面這個(gè)查找EJB實(shí)例的方法將不會(huì)完整實(shí)現(xiàn)。
  
  一般來說,Action類應(yīng)該調(diào)用實(shí)現(xiàn)了應(yīng)用的商務(wù)邏輯的EJB會(huì)話bean(或僅僅普通JavaBean)。在大型項(xiàng)目中,開發(fā)人員必須劃清層與層之間的界限。在Action類中,我們應(yīng)該拿到獲取含有JNDI信息的環(huán)境的實(shí)例,然后通過EJB的JNDI名字去查詢獲取它的home接口。過程并不簡單,所以下面這個(gè)代碼片斷只是個(gè)給出了必要實(shí)現(xiàn)的小例子。
  
  參數(shù)類型String,傳入的要查詢JNDI的名字
  
  返回類型Object,即查找到的home接口
  
  假如查找失敗,拋出NamingException異常
  
  假如獲取資源信息失敗,拋出MissingResourceException異常
  
  */
  
  public Object lookup(String jndiName)
    throws NamingException, MissingResourceException {
   // 為調(diào)用EJB對(duì)象,通過構(gòu)建記錄JNDI信息的Properties對(duì)象
   // 來獲得初始環(huán)境信息
    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);
  }
  
  注重:在真正的產(chǎn)品中,我們應(yīng)該在此處考慮代碼的健壯性,將代碼加入到try/catch塊內(nèi),并記錄所有錯(cuò)誤或重要信息到系統(tǒng)log中。而本例中,我們僅僅把異常往外拋,并假定一定會(huì)找到EJB對(duì)象的home接口并返回。
  
  return (jndiContext.lookup(jndiName));
  }
  由于Action類將是由Struts來調(diào)用的。所以它的主要方法應(yīng)該是一個(gè)抽象方法,而由每個(gè)繼續(xù)的子類來具體實(shí)現(xiàn),或者在其中做一些所有Action都會(huì)做的通用機(jī)制,例如記錄log信息。在本例中,我們一切從簡,將其抽象之。
  
  參數(shù)mapping:其類型為ActionMapping,將在本Action做跳轉(zhuǎn)選擇用
  
  參數(shù)actionForm:由Struts根據(jù)本次HTTP請求數(shù)據(jù)填充完成的ActionForm對(duì)象(可選,假如存在請求數(shù)據(jù)的話)
  
  參數(shù)request:此Action所有處理的本次HTTP請求(對(duì)象)
  
  參數(shù)response:此Action輸出數(shù)據(jù)所要用到的HTTP響應(yīng)(對(duì)象)
  
  假如有I/O錯(cuò)誤出現(xiàn),則本方法拋出IOException異常
  
  假如處理時(shí)發(fā)生servlet異常,則本方法拋出ServletException異常
  
  本方法處理完請求后按照處理邏輯返回相應(yīng)的頁面導(dǎo)向(對(duì)象)
  
  public abstract ActionForward perform(
    ActionMapping mapping,
    ActionForm form,
    HttpServletRequest request,
    HttpServletResponse response)
    throws IOException, ServletException;
  }
  或者讓這個(gè)抽象方法更有用一點(diǎn),那就在里面干點(diǎn)什么吧,比如像下面這樣在其中記錄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())
      + " ]");
   }
  然后,我們再編寫的每個(gè)Action類都應(yīng)該從AbstStrutsActionBase繼續(xù),并依照處理邏輯編寫各自的perform方法。讓我們用LoginAction為例,看看具體應(yīng)該怎么應(yīng)用吧。
  
  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 將演示一個(gè)Action將如何被Struts架構(gòu)所調(diào)用
  
  在這個(gè)例子中,我們只是簡單的演示perform方法是如何調(diào)用、執(zhí)行并返回的
  
  */
  public class LoginAction extends AbstStrutsActionBase {
  接下來這個(gè)是驗(yàn)證用戶的方法,本例中沒有具體實(shí)現(xiàn)。但一個(gè)典型的應(yīng)用方案是調(diào)用JavaBean或者EJB來完成。用來查找EJB的lookup方法(在基類中完成的)應(yīng)該在本方法中被調(diào)用,其返回一個(gè)依據(jù)后臺(tái)數(shù)據(jù)庫驗(yàn)證用戶的接口。
  
  參數(shù)類型String,要驗(yàn)證的用戶名
  
  參數(shù)類型String,密碼
  
  返回類型boolean,假如驗(yàn)證通過為true,否則為false
  
  public boolean authenticate(String username, String passWord) {
  /* 本方法將先做一個(gè)查找動(dòng)作,獲得驗(yàn)證用戶的EJB對(duì)象的接口并調(diào)用
  * 由于本例只演示Action與商務(wù)邏輯層是如何交互的
  * 所以具體實(shí)現(xiàn)代碼本例中就不提供了:)
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 都安| 皋兰县| 同心县| 武汉市| 盐边县| 彭泽县| 宜都市| 乌拉特前旗| 长丰县| 霍州市| 项城市| 青岛市| 罗山县| 德州市| 永仁县| 获嘉县| 搜索| 辛集市| 巍山| 荥阳市| 吕梁市| 民权县| 定边县| 宿州市| 瑞丽市| 呼伦贝尔市| 富平县| 安宁市| 建德市| 贺兰县| 文安县| 武隆县| 全椒县| 保靖县| 台北县| 望都县| 罗甸县| 剑阁县| 阿鲁科尔沁旗| 寻甸| 齐河县|