亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

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與商務邏輯層是如何交互的
  * 所以具體實現代碼本例中就不提供了:)
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲一区二区在线播放| 欧美一区二区色| 亚洲精品久久久久久下一站| 国产综合色香蕉精品| 深夜福利日韩在线看| 狠狠做深爱婷婷久久综合一区| 欧美极品少妇xxxxⅹ喷水| 亚洲欧美日本精品| 欧美在线观看www| 狠狠久久亚洲欧美专区| 91中文字幕在线| 日韩中文字幕在线免费观看| 国产成人精品久久二区二区| 最新亚洲国产精品| 亚洲第一在线视频| 91精品视频免费看| 亚洲成人激情视频| 国产精品白丝jk喷水视频一区| 国产日韩欧美91| 日韩电影在线观看中文字幕| 国产精品丝袜久久久久久高清| 久久免费视频在线观看| 久久中文字幕一区| 欧美专区中文字幕| 欧美激情精品久久久久久大尺度| 欧美高清视频在线观看| 亚洲黄色免费三级| 萌白酱国产一区二区| 国产精品av网站| 欧洲一区二区视频| 欧美一区二区.| 国产脚交av在线一区二区| 在线看欧美日韩| 亚洲第一天堂无码专区| 精品成人69xx.xyz| 亚洲欧美国内爽妇网| 欧美在线影院在线视频| 91po在线观看91精品国产性色| 久久久国产影院| 色偷偷av一区二区三区| 北条麻妃一区二区三区中文字幕| 亚洲第一免费网站| 欧美性xxxxx极品娇小| 欧美午夜精品久久久久久人妖| 奇米影视亚洲狠狠色| www国产精品视频| 色伦专区97中文字幕| 欧美成人中文字幕在线| 国产精品成人v| 国产丝袜高跟一区| 国产精品扒开腿做爽爽爽男男| 亚洲欧洲美洲在线综合| 91精品久久久久久久久不口人| 91在线视频导航| 在线观看精品国产视频| 日本91av在线播放| 日韩精品在线观看视频| 日韩成人在线视频观看| 91色琪琪电影亚洲精品久久| 亚洲天堂免费在线| 性色av一区二区三区免费| 伊人精品在线观看| 最新国产精品拍自在线播放| 国内精品小视频| 成人国产在线视频| 88国产精品欧美一区二区三区| 色综合伊人色综合网| 国产99久久精品一区二区| 国产免费一区视频观看免费| 久久网福利资源网站| 亚洲成人激情在线观看| 久久精品精品电影网| 97视频在线观看免费| 日本一区二区三区四区视频| 欧美大片大片在线播放| 在线观看日韩视频| 国产精品老女人精品视频| 国产日韩亚洲欧美| 久久香蕉精品香蕉| 日韩av在线一区| 精品久久久免费| 国产成人啪精品视频免费网| 久久久在线免费观看| 欧美肥臀大乳一区二区免费视频| 国产裸体写真av一区二区| 国产一区二区三区18| 国产精品福利网| 在线播放国产一区二区三区| 精品亚洲一区二区三区在线播放| 日韩成人av网址| 午夜精品一区二区三区在线视| 成人国产精品av| 精品亚洲国产成av人片传媒| 日韩成人小视频| 国产日韩欧美另类| 97av在线播放| 欧美成人午夜免费视在线看片| 欧美精品情趣视频| 精品亚洲一区二区三区在线播放| 久久人人爽亚洲精品天堂| 国内精品久久久久久久久| 欧美在线观看一区二区三区| 成人欧美一区二区三区黑人孕妇| 国产精品揄拍一区二区| 国产精品永久免费视频| 国产精品中文字幕在线| 久久综合伊人77777| 国产精品久久久久久av| 欧美激情视频给我| 国产精品久久久久影院日本| 国产主播精品在线| 亚洲精品二三区| 欧美日韩在线一区| 欧美激情一级精品国产| 久久久视频免费观看| 欧美大人香蕉在线| 国内成人精品视频| 最近2019年手机中文字幕| 国产精品专区h在线观看| 精品国产一区二区三区久久久狼| 欧美精品制服第一页| 亚洲精品美女久久| 国产精品白嫩初高中害羞小美女| 日韩一区二区久久久| 欧日韩在线观看| 日韩av电影免费观看高清| 免费91麻豆精品国产自产在线观看| 81精品国产乱码久久久久久| 国产欧美一区二区三区久久人妖| 日韩精品在线第一页| 国产精品一区二区性色av| 国产精品色悠悠| 亚洲精品美女久久| 久久久久久久香蕉网| 97超级碰碰人国产在线观看| 欧美激情高清视频| 色yeye香蕉凹凸一区二区av| 久久精品夜夜夜夜夜久久| 国产精自产拍久久久久久| 亚洲天堂免费观看| 亚洲a一级视频| 日韩视频免费中文字幕| 国产中文字幕亚洲| 日韩av第一页| 久久99亚洲精品| 国产一区二区三区在线视频| 亚洲香蕉伊综合在人在线视看| 高清日韩电视剧大全免费播放在线观看| 久久精品电影网站| 国产日韩av在线播放| 日韩天堂在线视频| 欧美极品少妇xxxxⅹ免费视频| 欧美高清性猛交| 欧美大肥婆大肥bbbbb| 三级精品视频久久久久| 欧美在线一区二区三区四| 国产精品久久国产精品99gif| 青青在线视频一区二区三区| 日韩中文字幕精品| 欧美在线亚洲一区| 国产日韩换脸av一区在线观看| 国产精品嫩草影院一区二区| 97国产在线视频| 久久久久久久久久久人体|