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

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

通過三種方式對Struts框架進行擴展

2019-11-18 15:54:49
字體:
供稿:網(wǎng)友

  簡介
  
  我見過許多項目開發(fā)者實現(xiàn)自己專有的MVC框架。這些開發(fā)者并不是因為想實現(xiàn)不同于Struts的某些功能,而是還沒有意識到怎么去擴展Struts。通過開發(fā)自己的MVC框架,你可以掌控全局,但同時這也意味著你必須付出很大的代價;在項目計劃很緊的情況下也許根本就不可能實現(xiàn)。
  
  Struts不但功能強大也易于擴展。你可以通過三種方式來擴展Struts:
  
  1.PlugIn:在應(yīng)用啟動或關(guān)閉時須執(zhí)行某業(yè)務(wù)邏輯,創(chuàng)建你自己的PlugIn類
  
  2.RequestPRocessor:在請求處理階段一個特定點欲執(zhí)行某業(yè)務(wù)邏輯,創(chuàng)建你自己的RequestProcessor。例如:你想繼續(xù)RequestProcessor來檢查用戶登錄及在執(zhí)行每個請求時他是否有權(quán)限執(zhí)行某個動作。
  
  3.ActionServlet:在應(yīng)用啟動或關(guān)閉或在請求處理階段欲執(zhí)行某業(yè)務(wù)邏輯,繼續(xù)ActionServlet類。但是必須且只能在PligIn和RequestProcessor都不能滿足你的需求時候用。
  
  本文會列舉一個簡單的Struts應(yīng)用來示范如何使用以上三種方式擴展Struts。在本文末尾資源區(qū)有每種方式的可下載樣例源代碼。Struts Validation 框架和 Tiles 框架是最成功兩個的Struts擴展例子。
  
  我是假設(shè)讀者已經(jīng)熟悉Struts框架并知道怎樣使用它創(chuàng)建簡單的應(yīng)用。如想了解更多有關(guān)Struts的資料請參見資源區(qū)。
  
  PlugIn
  
  根據(jù)Struts文檔,“PlugIn是一個須在應(yīng)用啟動和關(guān)閉時需被通知的模塊定制資源或服務(wù)配置包”。這就是說,你可以創(chuàng)建一個類,它實現(xiàn)PlugIn的接口以便在應(yīng)用啟動和關(guān)閉時做你想要的事。
  
  假如創(chuàng)建了一個web應(yīng)用,其中使用Hibernate做為持久化機制;當應(yīng)用一啟動,就需初始化Hinernate,這樣在web應(yīng)用接收到第一個請求時,Hibernate已被配置完畢并待命。同時在應(yīng)用關(guān)閉時要關(guān)閉Hibernate。跟著以下兩步可以實現(xiàn)Hibernate PlugIn的需求。
  
  1.創(chuàng)建一個實現(xiàn)PlugIn接口的類,如下:
  
  public class HibernatePlugIn implements PlugIn{    private String configFile;    // This method will be called at application shutdown time    public void destroy() {        System.out.println("Entering HibernatePlugIn.destroy()");        //Put hibernate cleanup code here        System.out.println("Exiting HibernatePlugIn.destroy()");    }    //This method will be called at application startup time    public void init(ActionServlet actionServlet, ModuleConfig config)        throws ServletException {        System.out.println("Entering HibernatePlugIn.init()");        System.out.println("Value of init parameter " +                  getConfigFile());        System.out.println("Exiting HibernatePlugIn.init()");    }    public String getConfigFile() {        return name;    }    public void setConfigFile(String string) {        configFile = string;    }}
  
  實現(xiàn)PlugIn接口的類必須是實現(xiàn)以下兩個方法:
  
  init() 和destroy().。在應(yīng)用啟動時init()被調(diào)用,關(guān)閉destroy()被調(diào)用。Struts答應(yīng)你傳入初始參數(shù)給你的PlugIn類;為了傳入?yún)?shù)你必須在PlugIn類里為每個參數(shù)創(chuàng)建一個類似javaBean形式的setter方法。在HibernatePlugIn類里,欲傳入configFile的名字而不是在應(yīng)用里將它硬編碼進去
  
  2.在struts-condig.xml里面加入以下幾行告知Struts這個新的PlugIn
  
  <struts-config>    ...    <!-- Message Resources -->    <message-resources parameter=     "sample1.resources.ApplicationResources"/>    <!-- Declare your plugins -->    <plug-in className="com.sample.util.HibernatePlugIn">        <set-property property="configFile"          value="/hibernate.cfg.xml"/>    </plug-in></struts-config>
  
  ClassName屬性是實現(xiàn)PlugIn接口類的全名。為每一個初始化傳入PlugIn類的初始化參數(shù)增加一個<set-property>元素。在這個例子里,傳入config文檔的名稱,所以增加了一個config文檔路徑的<set-property>元素。
  
  Tiles和Validator框架都是利用PlugIn給初始化讀入配置文件。另外兩個你還可以在PlugIn類里做的事情是:
  
  假如應(yīng)用依靠于某配置文件,那么可以在PlugIn類里檢查其可用性,假如配置文件不可用則拋出ServletException。這將導(dǎo)致ActionServlet不可用。
  
  PlugIn接口的init()方法是你改變ModuleConfig方法的最后機會,ModuleConfig方法是描述基于Struts模型靜態(tài)配置信息的集合。一旦PlugIn被處理完畢,Struts就會將ModuleCOnfig凍結(jié)起來。
  
  請求是如何被處理的
  
  ActionServlet是Struts框架里唯一一個Servlet,它負責處理所有請求。它無論何時收到一個請求,都會首先試著為現(xiàn)有請求找到一個子應(yīng)用。一旦子應(yīng)用被找到,它會為其生成一個RequestProcessor對象,并調(diào)用傳入HttpServletRequest和HttpServletResponse為參數(shù)的process()方法。
  
  大部分請?zhí)幚矶际窃赗equestProcessor.process()發(fā)生的。Process()方法是以模板方法(Template Method)的設(shè)計模式來實現(xiàn)的,其中有完成request處理的每個步驟的方法;所有這些方法都從process()方法順序調(diào)用。例如,尋找當前請求的ActionForm類和檢查當前用戶是否有權(quán)限執(zhí)行action mapping都有幾個單獨的方法。這給我們提供了極大的彈性空間。Struts的RequestProcessor對每個請求處理步驟都提供了默認的實現(xiàn)方法。這意味著,你可以重寫你感愛好的方法,而其余剩下的保留默認實現(xiàn)。例如,Struts默認調(diào)用request.isUserInRole()檢查用戶是否有權(quán)限執(zhí)行當前的ActionMapping,但假如你需要從數(shù)據(jù)庫中查找,那么你要做的就是重寫processRoles()方法,并根據(jù)用戶角色返回true 或 false。
  
  首先我們看一下process()方法的默認實現(xiàn)方式,然后我將解釋RequestProcessor類里的每個默認的方法,以便你決定要修改請求處理的哪一部分。
  
  public void process(HttpServletRequest request,            HttpServletResponse response)  throws IOException, ServletException {    // Wrap multipart requests with a special wrapper    request = processMultipart(request);    // Identify the path component we will    // use to select a mapping    String path = processPath(request, response);    if (path == null) {      return;    }    if (log.isDebugEnabled()) {      log.debug("Processing a '" + request.getMethod() +           "' for path '" + path + "'");    }    // Select a Locale for the current user if requested    processLocale(request, response);    // Set the content type and no-caching headers    // if requested    processContent(request, response);    processNoCache(request, response);    // General purpose preprocessing hook    if (!processPreprocess(request, response)) {      return;    }    // Identify the mapping for this request    ActionMapping mapping =      processMapping(request, response, path);    if (mapping == null) {      return;    }    // Check for any role required to perform this action    if (!processRoles(request, response, mapping)) {      return;    }    // Process any ActionForm bean related to this request    ActionForm form =      processActionForm(request, response, mapping);    processPopulate(request, response, form, mapping);    if (!processValidate(request, response, form, mapping)) {      return;    }    // Process a forward or include specified by this mapping    if (!processForward(request, response, mapping)) {      return;    }    if (!processInclude(request, response, mapping)) {      return;    }    // Create or acquire the Action instance to    // process this request    Action action =      processActionCreate(request, response, mapping);    if (action == null) {      return;    }    // Call the Action instance itself    ActionForward forward =      processActionPerform(request, response,                action, form, mapping);    // Process the returned ActionForward instance    processForwardConfig(request, response, forward);  }
  
  1、processMultipart(): 在這個方法中,Struts讀取request以找出contentType是否為multipart/form-data。假如是,則解析并將其打包成一個實現(xiàn)HttpServletRequest的包。當你成生一個放置數(shù)據(jù)的Html FORM時,request的contentType默認是application/x-www-form-urlencoded。但是假如你的form的input類型是FILE-type答應(yīng)用戶上載文件,那么你必須把form的contentType改為multipart/form-data。如這樣做

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 玉林市| 洪江市| 高要市| 湖口县| 莫力| 金乡县| 嵊州市| 漯河市| 永宁县| 桐柏县| 昌黎县| 饶阳县| 湖南省| 湟源县| 伊宁县| 怀集县| 吕梁市| 双流县| 阿巴嘎旗| 阿瓦提县| 金门县| 凤山市| 金华市| 兴山县| 田林县| 文昌市| 灵武市| 博白县| 盐源县| 那坡县| 凌源市| 张家川| 灵台县| 简阳市| 林州市| 洛浦县| 武乡县| 巴彦县| 三亚市| 长宁县| 龙里县|