鐵手劍譜

          上善若水
          數(shù)據(jù)加載中……
          Struts秘籍之第1段:第2.1式:用插件來(lái)進(jìn)行應(yīng)用初始化

          第2.1式. 用插件來(lái)進(jìn)行應(yīng)用初始化

          問(wèn)題

          在應(yīng)用啟動(dòng)時(shí)需要裝入應(yīng)用初始化數(shù)據(jù)到context 中。

          動(dòng)作要領(lǐng)

          創(chuàng)建一個(gè)類(lèi),實(shí)現(xiàn)org.apache.struts.action.PlugIn接口,并且在struts-config.xml文件中指定plug-in元素。下面的XML 片斷展示了一個(gè)plug-in 聲明以及一個(gè)嵌套的set-property元素來(lái)設(shè)置定制屬性:

           

          <plug-in className="com.oreilly.strutsckbk.CustomPlugin" >

            
          <set-property property="customData"

                             value
          ="Hello from the plugin"/>

          </plug-in>

           

          動(dòng)作變化

          Struts提供了一個(gè)PlugIn接口,你可以用它來(lái)創(chuàng)建在應(yīng)用啟動(dòng)時(shí)初始化的定制服務(wù)。PlugIn接口的Java源代碼示于Example 2-1. (為了清晰起見(jiàn),去除了JavaDoc 文檔)

          Example 2-1. Struts PlugIn 接口

           

          package org.apache.struts.action;

          import javax.servlet.ServletException;
          import org.apache.struts.config.ModuleConfig;

          public interface PlugIn {

              
          public void destroy( );

              
          public void init(ActionServlet servlet, ModuleConfig config)
                  throws ServletException;
          }

           

          為了實(shí)現(xiàn)一個(gè)plug-in,只需要實(shí)現(xiàn)這個(gè)接口并且在struts-config.xml文件中聲明這個(gè)plug-in 實(shí)現(xiàn)。有兩個(gè)方法必須被實(shí)現(xiàn):即init()和destroy( ), 它們?cè)诓寮纳芷谥斜徽{(diào)用。Struts 在啟動(dòng)ActionServlet時(shí)實(shí)例化plug-in 之后調(diào)用init( )。Struts則在ActionServlet被銷(xiāo)毀時(shí)調(diào)用destroy()方法,通常是在一個(gè)用服務(wù)器停止時(shí)。首先,這個(gè) plug-in 特征似乎是很單純和有限的。然而,通過(guò)使用Struts的另外一個(gè)特征,即set-property元素,你可以將特殊的信息傳遞到plug-in中。這種能力增強(qiáng)了這些類(lèi)的靈活性。

          set-property元素被幾乎所有定義Struts實(shí)體的元素所支持,比如form-bean, action-mapping, action, 以及plug-in。set-property元素有兩個(gè)屬性:namevalueStruts調(diào)用name屬性的值指定的property的setter方法,將property設(shè)置為value屬性的字符串值。

          對(duì)給定plug-in的所有set-property元素都將在調(diào)用plug-in的init( )方法之前進(jìn)行處理。這允許plug-in 在init( )方法中使用屬性的值。

          如果對(duì)一個(gè)plug-in使用多個(gè)set-property元素, Struts不能保證它們被調(diào)用的順序。每個(gè)setter方法都應(yīng)該獨(dú)立于其他任何方法。

           

          Struts 將對(duì)ActionServlet和plug-in的ModuleConfig的引用作為引數(shù)傳遞給init( )方法。ActionServlet允許訪(fǎng)問(wèn)ServletContext來(lái)進(jìn)行應(yīng)用范圍的對(duì)象存儲(chǔ)。ActionServlet還可以允許你訪(fǎng)問(wèn)更多高級(jí)的容器管理的J2EE 組件,比如數(shù)據(jù)源和消息隊(duì)列。ModuleConfig允許你訪(fǎng)問(wèn)定義plug-in 的模塊的Struts配置。

          每個(gè)Struts 應(yīng)用至少有一個(gè)模塊:默認(rèn)模塊。如果你不熟悉模塊,我們將在第2.5式中講解之。

          為了更具體一些,請(qǐng)考慮一個(gè)簡(jiǎn)單的,但仍然相關(guān)的例子。你需要定義一個(gè)plug-in,它可以使你決定應(yīng)用何時(shí)啟動(dòng),以及它啟動(dòng)和運(yùn)行了多長(zhǎng)時(shí)間。你可以使用下面所示的類(lèi)跟蹤和報(bào)告你的應(yīng)用的運(yùn)行時(shí)間。

          Example 2-2. Application uptime tracker 對(duì)象

           

          package com.oreilly.strutsckbk;

          import java.util.Date;

          public class TimeTracker {

            
          private long startUpTimeMillis;
            
          private Date startedOn;

            
          public TimeTracker( ) {
               startUpTimeMillis 
          = System.currentTimeMillis( );
               startedOn 
          = new Date( );
             }


            
          public long getUptime( ) {
              
          return System.currentTimeMillis( ) - startUpTimeMillis;
            }


            
          public Date getStartedOn( ) {
              
          return startedOn;
            }

          }

           

          創(chuàng)建一個(gè)PlugIn接口的實(shí)現(xiàn),比如Example 2-3所示,它實(shí)例化了TimeTracker。plug-in 通過(guò)plug-in 屬性的值將TimeTracker實(shí)例保存在ServletContext中。你可以使用這個(gè)值來(lái)從Servlet上下文中獲取TimeTracker實(shí)例。雖然這個(gè)值是硬編碼的,使用屬性也提供了更大的靈活性。

          Example 2-3. Time tracker plugin

           

          package com.oreilly.strutsckbk;

          import javax.servlet.ServletException;

          import org.apache.struts.action.ActionServlet;
          import org.apache.struts.action.PlugIn;
          import org.apache.struts.config.ModuleConfig;

          public class TimeTrackerPlugin implements PlugIn {

              
          private String contextKey;
             
             
          public void setContextKey(String key) {
                 
          this.contextKey = key;
             }

             
             
          public void init(ActionServlet servlet, ModuleConfig conf)
                   throws ServletException 
          {
                servlet.getServletContext( ).setAttribute(contextKey, 
          new TimeTracker( ));
             }


             
          public void destroy( ) {
              }

          }

           

          現(xiàn)在你已經(jīng)有了為plug-in 創(chuàng)建的類(lèi),你可以通過(guò)在struts-config.xml中加入plug-in元素來(lái)將其集成到Struts 應(yīng)用中。

           

          <plug-in className="com.oreilly.strutsckbk.TimeTrackerPlugin">
              
          <set-property property="contextKey" value="timeTracker"/>
          </plug-in>

           

          plug-in 在servlet 上下文中存儲(chǔ)了time tracker對(duì)象。可以訪(fǎng)問(wèn)TimeTracker來(lái)顯示關(guān)于應(yīng)用啟動(dòng)運(yùn)行時(shí)間的信息,下面是相關(guān)的JSP 片斷:

           

          <h4>Continuously running since 
              
          <bean:write name="timeTracker" 
                      property
          ="startedOn" 
                        format
          ="MM/dd/yyyy HH:mm"/> for
              
          <bean:write name="timeTracker" 
                      property
          ="uptime"/> milliseconds!
          </h4>

           

          你可以使用一個(gè)servlet 來(lái)載入像Struts plug-in之類(lèi)的初始化數(shù)據(jù)。具有l(wèi)oad-on-startup初始化參數(shù)的servlet,應(yīng)將其設(shè)置為較低的數(shù)值,比如1, 一保證它們?cè)趹?yīng)用啟動(dòng)時(shí)載入。容器在實(shí)例化Servlet之后將調(diào)用servlet的init( )方法。但是Struts plug-in 方式由多個(gè)優(yōu)點(diǎn)。首先,大多數(shù)Struts 應(yīng)用在其初始化設(shè)置后不需要修改web.xml文件。必須在web.xml中聲明額外的Servlet意味著要維護(hù)額外的文件。其次,如果需要PlugIn接口提供對(duì)特定Struts信息的訪(fǎng)問(wèn)。最后,因?yàn)閜lug-in 的生命周期緊隨ActionServlet的生命周期,所以可以保證在你的Struts應(yīng)用所需時(shí)數(shù)據(jù)有效。

          相關(guān)招式

          第2.8式展示了set-property元素的另一種用法。Struts 文檔中關(guān)于plug-in 的信息可以訪(fǎng)問(wèn)http://jakarta.apache.org/struts/userGuide/building_controller.html#plugin_classes.

          你也可以使用一個(gè)Servlet 上下文listener 來(lái)載入初始化數(shù)據(jù)。

           

          posted on 2005-05-10 11:50 鐵手 閱讀(3282) 評(píng)論(2)  編輯  收藏 所屬分類(lèi): JavaStruts系列

          評(píng)論

          # Struts 秘籍(CookBook)[TrackBack] 2005-11-12 18:29 阿泠

          本系列源改編自O(shè)'Reily的Strus Cookbook
          [引用提示]阿泠引用了該文章, 地址: http://blog.donews.com/inclear/archive/2005/11/12/624363.aspx

          # re: Struts秘籍之第1段:第2.1式:用插件來(lái)進(jìn)行應(yīng)用初始化 2007-10-25 16:55 安斯理

          謝了.
          的確很經(jīng)典的.
          我找了好久才找到的呀..哂哂..
          主站蜘蛛池模板: 甘南县| 彰化市| 调兵山市| 手游| 肥东县| 曲松县| 泾源县| 盐亭县| 成都市| 通化市| 屯门区| 忻城县| 安达市| 阜南县| 正宁县| 万宁市| 象山县| 云南省| 宜宾县| 遵化市| 平塘县| 荃湾区| 敦化市| 沁源县| 祁阳县| 西藏| 庆安县| 嘉禾县| 托里县| 富裕县| 金寨县| 遂川县| 新兴县| 斗六市| 托里县| 高陵县| 垫江县| 潮安县| 枣庄市| 沛县| 宁强县|