posts - 431,  comments - 344,  trackbacks - 0

          問題

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

          動作要領(lǐng)

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

           

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

            
          <set-property property="customData"

                             value
          ="Hello from the plugin"/>

          </plug-in>

           

          動作變化

          Struts提供了一個PlugIn接口,你可以用它來創(chuàng)建在應(yīng)用啟動時初始化的定制服務(wù)。PlugIn接口的Java源代碼示于Example 2-1. (為了清晰起見,去除了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)一個plug-in,只需要實(shí)現(xiàn)這個接口并且在struts-config.xml文件中聲明這個plug-in 實(shí)現(xiàn)。有兩個方法必須被實(shí)現(xiàn):即init()和destroy( ), 它們在插件的生命周期中被調(diào)用。Struts 在啟動ActionServlet時實(shí)例化plug-in 之后調(diào)用init( )。Struts則在ActionServlet被銷毀時調(diào)用destroy()方法,通常是在一個用服務(wù)器停止時。首先,這個 plug-in 特征似乎是很單純和有限的。然而,通過使用Struts的另外一個特征,即set-property元素,你可以將特殊的信息傳遞到plug-in中。這種能力增強(qiáng)了這些類的靈活性。

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

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

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

           

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

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

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

          Example 2-2. Application uptime tracker 對象

           

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

          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)建的類,你可以通過在struts-config.xml中加入plug-in元素來將其集成到Struts 應(yīng)用中。

           

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

           

          plug-in 在servlet 上下文中存儲了time tracker對象。可以訪問TimeTracker來顯示關(guān)于應(yīng)用啟動運(yùn)行時間的信息,下面是相關(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>

           

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

          相關(guān)招式

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

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

          posted on 2008-03-27 19:56 周銳 閱讀(359) 評論(0)  編輯  收藏 所屬分類: Struts
          主站蜘蛛池模板: 宁海县| 通河县| 彭山县| 睢宁县| 博客| 乐东| 安福县| 本溪市| 晋城| 保康县| 忻城县| 上思县| 邹平县| 鄯善县| 墨脱县| 峨山| 红河县| 镇平县| 明星| 白朗县| 中牟县| 延津县| 治多县| 景谷| 沾化县| 堆龙德庆县| 玉林市| 澄城县| 鄱阳县| 老河口市| 赤城县| 成武县| 平顶山市| 澜沧| 和林格尔县| 平果县| 揭东县| 博白县| 江门市| 临泉县| 顺昌县|