<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    鐵手劍譜

    上善若水
    數(shù)據(jù)加載中……

    Struts秘籍之第1段:第2.1式:用插件來進(jìn)行應(yīng)用初始化

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

    問題

    在應(yīng)用啟動時(shí)需要裝入應(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)用啟動時(shí)初始化的定制服務(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í)實(shí)例化plug-in 之后調(diào)用init( )。Struts則在ActionServlet被銷毀時(shí)調(diào)用destroy()方法,通常是在一個用服務(wù)器停止時(shí)。首先,這個 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)用何時(shí)啟動,以及它啟動和運(yùn)行了多長時(shí)間。你可以使用下面所示的類跟蹤和報(bào)告你的應(yīng)用的運(yùn)行時(shí)間。

    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)行時(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>

     

    你可以使用一個servlet 來載入像Struts plug-in之類的初始化數(shù)據(jù)。具有l(wèi)oad-on-startup初始化參數(shù)的servlet,應(yīng)將其設(shè)置為較低的數(shù)值,比如1, 一保證它們在應(yīng)用啟動時(shí)載入。容器在實(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í)數(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 @ 2005-05-10 11:50 鐵手 閱讀(3282) | 評論 (2)編輯 收藏
    Struts秘籍之第1段:配置Struts應(yīng)用

    第1段. 配置Struts應(yīng)用

    介紹

    Struts 為我們提供了一個靈活的框架。它可以以很多不同的方式進(jìn)行使用,并且可以在多種不同的層面進(jìn)行定制和擴(kuò)展。這種靈活性的結(jié)果是,許多開發(fā)人員不知道如何配置Struts 來適應(yīng)他們的應(yīng)用。Struts 應(yīng)用可以通過web 應(yīng)用部署描述符web.xml文件和一個或者多個Struts 配置文件 (struts-config.xml)來進(jìn)行配置。另外,Struts Validator 則通過另外的XML 文件來進(jìn)行配置。

    這一段動作是關(guān)于處理Struts配置中的一些通用或者不怎么通用的情景。其中包括創(chuàng)建plug-in 以及一種簡單的有效的機(jī)制來解決大多數(shù)問題。我們還會討論多個配置文件的使用,以適應(yīng)團(tuán)隊(duì)開發(fā)和結(jié)果化和分塊Web應(yīng)用本身。最后,我們會討論Struts內(nèi)建的擴(kuò)展支持和定制配置屬性的使用。

    本段動作是“Struts秘籍”的第一段動作。

    posted @ 2005-05-10 10:45 鐵手 閱讀(3397) | 評論 (2)編輯 收藏
    Struts秘籍之起式:第1.8式:用XDoclet 產(chǎn)生Struts配置文件

    第1.8式. 使用XDoclet 產(chǎn)生Struts配置文件

    問題

    當(dāng)你修改或者新建一個Action 或ActionForm時(shí),你需要修改對應(yīng)的Struts 配置文件。

    動作要領(lǐng)

    使用XDoclet 工具,配合Ant,來處理Java代碼中可以自動產(chǎn)生truts-config.xml文件的注解。

    動作變化

    現(xiàn)在的大多數(shù)應(yīng)用軟件系統(tǒng)都有可執(zhí)行代碼文件文本配置文件組成。這種方式可以使你更容易的在各種不同的環(huán)境之間移植,并且減少必須針對各種不同部署而修改的代碼量。但是它帶來了另外一個負(fù)擔(dān),那就是保持代碼和配置文件之間的一致性。

    XDoclet 工具,原本開發(fā)來是針對EJB的開發(fā),它就可以解決這個問題。通過XDoclet,開發(fā)者能夠在代碼中放置能夠描述與代碼相關(guān)的配置屬性的注解,這些注解非常類似于JavaDoc 標(biāo)簽。在構(gòu)建時(shí),你可以使用定制的Ant 任務(wù),由它來使用XDoclet 從而處理這些標(biāo)簽并產(chǎn)生對應(yīng)的XML 配置文件。

    對Struts來說,XDoclet 可以產(chǎn)生struts-config.xml文件中的下列元素:

    • action 元素
    • form-bean 元素

    另外, XDoclet 還可以創(chuàng)建字段級的Struts Validator 配置,通常是位于validation.xml 文件之中。最后,如果你要映射EJB 實(shí)體Bean的屬性到Struts ActionForms, XDoclet 可以不產(chǎn)生ActionForm 的Java 源代碼。

     

     

    XDoclet可以從http://xdoclet.sourceforge.net處下載。請根據(jù)相關(guān)的安裝指導(dǎo)進(jìn)行安裝。你還需要安裝Ant

     

     

    首先,你需要添加一個任務(wù)到你的Ant 的build 腳本文件中,該任務(wù)可稱為XDoclet 任務(wù)。Example 1-9展示了一個為struts-example 應(yīng)用產(chǎn)生struts-config.xml 文件的Ant任務(wù)。

    Example 1-9. Webdoclet Ant target

     

    <target name="webdoclet" depends="init">
      
    <taskdef 
          
    name="webdoclet"
          classname
    ="xdoclet.modules.web.WebDocletTask"
          classpathref
    ="project.class.path"/>
      
    <webdoclet
          
    mergedir="${merge.dir}"
          destdir
    ="${generated.xml.dir}"
          excludedtags
    ="@version,@author"
          force
    ="${xdoclet.force}">
        
    <fileset dir="${src.dir}">
          
    <exclude name="**/*Registration*.java"/>
          
    <include name="**/*.java"/>
        
    </fileset>
        
    <strutsconfigxml
                
    version="1.1"/>
      
    </webdoclet>
    </target>

     

    這個目標(biāo)(target)調(diào)用webdoclet 定制Ant任務(wù),它是由XDoclet提供的。此任務(wù)可以產(chǎn)生多個Web應(yīng)用相關(guān)的工件,包括 web.xml 文件, struts-config.xml 文件,validation.xml 文件。對Struts 應(yīng)用來說,你可能不需要產(chǎn)生web.xml 文件;因?yàn)閷truts 應(yīng)用,該文件并不經(jīng)常改變。在Example 1-9中,webdoclet 任務(wù)被用于產(chǎn)生struts-config.xml 文件。

    并不是所有的struts-config.xml 文件中的元素都可以或者應(yīng)該從注解的代碼中產(chǎn)生。像全局forward, 全局例外處理,消息資源,插件等都并不和特定的Action 或ActionForm 類相關(guān)。

    XDoclet 是通過讓你在位于特定的目錄中的文件中放置靜態(tài)配置來處理這些事情的。在構(gòu)建時(shí), XDoclet 將這些文件中代碼中產(chǎn)生的元素進(jìn)行合并。你可以通過mergedir 屬性來指定這些靜態(tài)文件的位置。destdir 屬性則指定將創(chuàng)建的文件的存放目錄。通常,你需要為這些產(chǎn)生的文件創(chuàng)建一個單獨(dú)的目錄,然后在其成功創(chuàng)建后將它們拷貝到適當(dāng)?shù)哪夸浿幸还泊虬蛘卟渴稹xcludedtags 屬性指定排除在XDoclet 處理之外的JavaDoc 標(biāo)簽。

     

    執(zhí)行@author @version標(biāo)簽是通用的。

    最后, force 屬性強(qiáng)制XDoclet 產(chǎn)生一個新的配置文件。如果這個屬性為false, 新文件只有在對應(yīng)的注解Java代碼發(fā)生改變時(shí)才會產(chǎn)生。

    fileset 元素告訴XDoclet 要處理哪些Java 源文件。你可以使用該元素來指示那個源文件包含XDoclet 注解。例如,struts-example 應(yīng)用使用了兩個Struts 配置文件:struts-config.xml 和 struts-config-registration.xml。如Example 1-9所示,你可以通過設(shè)置fileset元素來排除包含名稱"Registration"的類從而排除放入struts-config-registration.xml 文件中的元素。

    strutsconfigxml 元素指示XDoclet 產(chǎn)生struts-config.xml 文件。XDoclet 默認(rèn)情況下將產(chǎn)生Struts 1.0兼容的配置文件。因此,如果你用Struts1.1你必須指定版本為"1.1"。XDoclet 也使用該屬性提供對Struts 1.2 的支持。

    一旦你在構(gòu)建文件中創(chuàng)建了這個target,你就可以添加注解到Action 和ActionForm 類的代碼中。對ActionForm, XDoclet 提供了@struts.form 標(biāo)簽來產(chǎn)生form-bean 元素。下面的代碼展示了如何在struts-example 應(yīng)用的SubscriptionForm中使用這個類一級的標(biāo)簽:

     

    /**
     * 用于用戶概要頁面的
     *
     * @struts.form 
     *    name="subscriptionForm"
     
    */


    public final class SubscriptionForm extends ActionForm  {
      
    }

     

    在webdoclet target 被執(zhí)行時(shí),將在struts-config.xml 中產(chǎn)生下面的form-beans 元素:

     <!-- ========== Form Bean Definitions =================================== -->
      
    <form-beans>
        
    <form-bean
          
    name="subscriptionForm"
          type
    ="org.apache.struts.webapp.example.SubscriptionForm"
        
    />

        
    <!--
             If you have non XDoclet forms, define them in a file called
             struts-forms.xml and place it in your merge directory.
        
    -->
      
    </form-beans>

    XDoclet 使用你在標(biāo)簽中指定的名稱來產(chǎn)生form-bean 元素,并且使用ActionForm 的權(quán)限定類名來創(chuàng)建type 屬性。這一特征也是XDoclet最大的優(yōu)點(diǎn)之一。你的類的屬性,比如類名、包名、方法名等,對XDoclet 都可使用,就像它們被用于產(chǎn)生Javadocs 一樣。XDoclet 將在產(chǎn)生的文件的適當(dāng)位置使用這些值。

    如果你修改了一個類的類名或者包名, XDoclet產(chǎn)生正確的配置元素而不會混淆。雖然IDE 的重構(gòu)工具也可以處理這種類型的改變,但是使用XDoclet這是另外一種可以集成到現(xiàn)有的Ant構(gòu)建過程中的解決方案。

     

    你可以使用XDoclet 來從Action類中產(chǎn)生action 元素。XDoclet 使用@struts.action 標(biāo)簽來指定action 元素。另外,@struts.action-forward 標(biāo)簽則可以指定嵌套的forward 元素。同時(shí)@struts.action-exception標(biāo)簽可以用于產(chǎn)生action特定的宣稱性例外處理。struts-example 中的LoginAction.java 類示于下方,其中還包括產(chǎn)生完整的action元素所需的注解:

     

    /**
     * Implementation of <strong>Action</strong> that validates a user logon.
     * 
     * @struts.action
     *    path="/logon"
     *    name="logonForm"
     *    scope="session"
     *    input="logon"
     * 
     * @struts.action-exception
     *    key="expired.password"
     *    type="org.apache.struts.webapp.example.ExpiredPasswordException"
     *    path="/changePassword.jsp"
     
    */

    public final class LogonAction extends Action {
      
    }

     

    標(biāo)簽中的語法必須嚴(yán)格匹配對應(yīng)的XML元素的語法。如果你已經(jīng)有定義了的 struts-config.xml 文件,一個好辦法是將struts-config.xml中的XML元素剪切粘貼到Action 類中。使 XDoclet 能夠認(rèn)可這些標(biāo)簽作必要的修改。下面位于LogoffAction.java 文件中的注解展示了如何使用@struts.action-forward 標(biāo)簽:

    /**
     * Implementation of <strong>Action</strong> that processes a
     * user logoff.
     *
     * @struts.action
     *    path="/logoff"
     * 
     * @struts.action-forward
     *    name="success"
     *    path="/index.jsp"
     
    */


    public final class LogoffAction extends Action {
      
    }



    雖然XDoclet 對產(chǎn)生struts-config.xml 文件大有幫助,它也并不是萬能的。某些action 元素并不與任何你創(chuàng)建的Action 類相對應(yīng)。例如,struts-example 應(yīng)用中就包含下面的action mapping:

    <action path="/tour"
         forward
    ="/tour.htm">
    </action>

     

    struts-config.xml 文件可以包含全局forwards, 全局例外, controller 元素,消息資源元素以及plug-in 元素。XDoclet 不能產(chǎn)生這些元素。但是它可以和飽含這些配置元素的文件進(jìn)行合并以產(chǎn)生完整的struts-config.xml 文件。Table 1-5列出了在創(chuàng)建struts-config.xm文件時(shí)XDoclet希望在mergedir屬性指定的目錄中找到的文件清單。

    Table 1-5. 可以合并到產(chǎn)生的struts-config.xml文件中的配置文件

    合并文件

    用途

    struts-data-sources.xml

    一個XML 文檔,包含可選的data-sources元素

    struts-forms.xml

    一個XML 未解析的實(shí)體,包含form-bean 元素,作為非XDoclet forms的補(bǔ)充

    global-exceptions.xml

    一個XML 文檔,包含可選的global-exceptions 元素

    global-forwards.xml

    一個XML 文檔,包含可選的global-forwards 元素

    struts-actions.xml

    一個可選的XML 未解析實(shí)體,包含action 元素,作為非XDoclet actions的補(bǔ)充

    struts-controller.xml

    一個XML 文檔,包含可選的controller 元素

    struts-message-resources.xml

    一個可選的XML 未解析實(shí)體,包含message-resources元素

    struts-plugins.xml

    一個可選的XML 未解析實(shí)體,包含 plug-in 元素

     

    大多數(shù)開發(fā)者都認(rèn)為, XDoclet 對Struts 開發(fā)并不像他用在EJB 開發(fā)那么能干。比如,如果你在struts-config.xml中主要使用動態(tài)action forms ,那么從ActionForm 中產(chǎn)生form-bean 元素并不會為你帶來任何好處。但是,如果你開發(fā)一個具有大量action元素的大型應(yīng)用,并使用Ant, 那么 XDoclet 則是值得考慮的。XDoclet 也支持其它類型的配置文檔,比如Hibernate mappings的生成。

    相關(guān)招式

    第1.7式提供了一個模版Ant build 腳本,你可以在其中添加XDoclet target。

    關(guān)于XDoclet 的詳細(xì)信息訪問http://xdoclet.sourceforge.net.

    你也可以閱讀Manning 出版Craig Walls和Norman Richards所著的Xdoclet in Action 其中包括Xdoclet在Struts, Webwork, JDO, EJB,JMX, SOAP,Web Service 等方面開發(fā)的應(yīng)用。http://www.manning.com/walls

     

    posted @ 2005-05-09 11:07 鐵手 閱讀(2754) | 評論 (1)編輯 收藏
    Struts秘籍之起式:第1.7式:使用Ant進(jìn)行構(gòu)建和部署

    第1.7式. 使用Ant 進(jìn)行構(gòu)建和部署

    問題

    你希望能夠以一種能夠重復(fù)和可移動的情況下構(gòu)建和部署Struts 應(yīng)用。

    動作要領(lǐng)

    可以創(chuàng)建一個Ant (http://ant.apache.org) 構(gòu)建腳本并使用Ant (或者你的 IDE集成的Ant ) 來編譯、測試、打包和部署你的應(yīng)用。Example 1-8是一個樣板的Ant build 文件,可以編譯、構(gòu)建和部署Struts 應(yīng)用

    Example 1-8. 樣板Ant build 文件

     

     

    <project name="jsc-ch01-r02" default="dist" basedir=".">
      
    <description>
          Jakarta Struts Cookbook - Ant Template
      
    </description>

      
    <!-- Enable access to environment variables -->
      
    <property environment="env"/>

      
    <!-- Set to use JDK 1.4 -->
      
    <property name="build.compiler" value="javac1.4"/>

      
    <!-- set global properties for this build -->
      
    <property name="src.dir" location="src"/>
      
    <property name="build.dir" location="build"/>
      
    <property name="dist.dir"  location="dist"/>
      
    <property name="server.dir" location="${env.CATALINA_HOME}"/>
      
    <property name="servlet.jar" 
         location
    ="${server.dir}/common/lib/servlet-api.jar"/>
      
    <property name="jsp.jar" location="${server.dir}/common/lib/jsp-api.jar"/>
      
    <property name="struts.dist.dir" location="c:/jakarta-struts-1.1/lib"/>

      
    <!-- Struts -->
      
    <fileset id="struts.lib.files" dir="${struts.dist.dir}">
           
    <include name="**/*.jar"/>
      
    </fileset>
      
    <path id="struts.classpath">
           
    <fileset refid="struts.lib.files"/>
      
    </path>

      
    <path id="project.class.path">
        
    <pathelement location="${servlet.jar}"/>
        
    <pathelement location="${jsp.jar}"/>
        
    <path refid="struts.classpath"/>
      
    </path>

      
    <!-- Deployment Properties -->
      
    <property name="deploy.dir" location="${server.dir}/webapps"/>

      
    <target name="clean"
            description
    ="clean up" >
        
    <!-- Delete the ${build.dir} and ${dist.dir} directory trees -->
        
    <delete dir="${build.dir}"/>
        
    <delete dir="${dist.dir}"/>
      
    </target>

      
    <target name="init">
        
    <!-- Create the build directory structure used by compile -->
        
    <mkdir dir="${build.dir}"/>
      
    </target>

      
    <target name="compile" depends="init"
            description
    ="compile the source " >
        
    <!-- Compile the java code from ${src.dir} into ${build.dir} -->
        
    <javac srcdir="${src.dir}" destdir="${build.dir}" debug="on">
          
    <classpath>
              
    <path refid="project.class.path"/>
          
    </classpath>
        
    </javac>

        
    <copy todir="${build.dir}">
          
    <fileset dir="${src.dir}">
            
    <include name="**/*.properties"/>
          
    </fileset>
        
    </copy>
      
    </target>

      
    <target name="dist" depends="compile"
            description
    ="generate the distribution" >

        
    <!-- Create the distribution directory -->
        
    <mkdir dir="${dist.dir}"/>

        
    <!-- Copy the build dir to WEB-INF/classes -->
        
    <mkdir dir="web/WEB-INF/classes"/>
          
        
    <copy todir="web/WEB-INF/classes">
            
    <fileset dir="${build.dir}"/>
        
    </copy>

        
    <!-- Put everything in ${build} into the war file -->
        
    <war destfile="${dist.dir}/${ant.project.name}.war" 
             webxml
    ="web/WEB-INF/web.xml">
          
    <fileset dir="web" excludes="**/web.xml"/>
            
    <webinf dir="web/WEB-INF">
              
    <include name="*.xml"/>
              
    <exclude name="web.xml"/>
            
    </webinf>
          
    <lib dir="web/WEB-INF/lib">
            
    <include name="${struts.dist.dir}/**/*.jar"/>
            
    <include name="${struts.dist.dir}/**/*.tld"/>
          
    </lib>
          
    <classes dir="build"/>
        
    </war>
      
    </target>

      
    <!-- Deploy the application by copying it to the deployment directory -->
      
    <target name="deploy" depends="dist"
               description
    ="deploy to server" >
          
    <unjar src="${dist.dir}/${ant.project.name}.war"
              dest
    ="${deploy.dir}/${ant.project.name}"/>
      
    </target>

    </project>

     

    動作變化

    上面展示的構(gòu)建文件可以知進(jìn)行一些最小的修改就可以用于大部分的Struts web 應(yīng)用。你應(yīng)該將project元素的name屬性的值修改為你的應(yīng)用的名稱。項(xiàng)目名稱將用于創(chuàng)建WAR 是所用的名稱,以及應(yīng)用部署時(shí)的文件夾名稱。此外,你應(yīng)該將struts.dist.dir屬性的值設(shè)置為Struts 分發(fā)包所安裝的特定的lib目錄。

    基于Ant的構(gòu)建可以幫助你完成各種開發(fā)任務(wù):

    • 從源代碼控制系統(tǒng)(即, CVS)中獲取最新的源代碼
    • 將Struts 應(yīng)用打包為WAR 文件
    • 運(yùn)行單元測試
    • 使用XDoclet 來從Ant中產(chǎn)生代碼和配置文件
    • 部署Struts應(yīng)用到應(yīng)用服務(wù)器中
    • 預(yù)編譯JSP 文件以檢測轉(zhuǎn)換錯誤

    通過使用構(gòu)建腳本來創(chuàng)建WAR 文件,你可以根據(jù)你覺得合適的方式來對源代碼和Struts 奮發(fā)的物理文件位置進(jìn)行結(jié)構(gòu)化。然后你可以使用Ant 腳本將它們整合到一起。

    相關(guān)招式

    你可以訪問Ant 的站點(diǎn)獲取更多詳細(xì)的信息http://ant.apache.org。另外,Jesse E. Tilly 和Eric M. Burke (O'Reilly)所著的《Ant: The Definitive Guide》也是使用Ant的一個非常棒的參考。第1.8式將展示使用XDoclet 工具來產(chǎn)生Struts-的相關(guān)文件。

    posted @ 2005-05-08 09:49 鐵手 閱讀(1750) | 評論 (1)編輯 收藏
    Struts秘籍之起式:第1.6式:管理Struts配置文件

    第1.6式. 管理Struts 配置文件

    問題

    你需要在Struts配置文件中避免拼寫和其他低級錯誤,以及使得編輯和管理它們更容易些。

    動作要領(lǐng)

    使用Struts Console,或者其他IDE工具來查看、編輯和管理Struts 配置文件。

    動作變化

    Web應(yīng)用中最常見的錯誤原因之一就是拼寫錯誤。總體而言,大多數(shù)現(xiàn)代軟件包括Struts 都依賴于某種ASCII文本格式的配置文件和部署描述符,通常是XML。使用能夠進(jìn)行校驗(yàn)的XML 編輯器能夠有助于減少錯誤,但是,它卻不能消除路徑、form-bean名稱、類名等的拼寫和鍵入錯誤。

    你可以從http://www.jamesholmes.com下載Stuts Console,它提供了對Struts (struts-config.xml), Validator (validation.xml a和validator-rules.xml), 和Tiles (tiles-defs.xml) 配置文件的圖形化編輯。不需要進(jìn)行手工編輯,你可以使用Struts Console 提供的基于Swing的編輯器進(jìn)行。除了減少了輸入錯誤, Struts Console 還使你對這些文件有一個直觀和總體的視圖。你將發(fā)現(xiàn)這些特征在你的配置文件開始變得龐大的時(shí)候簡直是妙不可言。

    Struts Console 提供了一個聰明的圖形編輯器來處理Struts開發(fā)中所用的各種XML配置文件。Figure 1-2是struts-example應(yīng)用的struts-config.xml文件的視圖。

    Figure 1-2. Struts Console 中查看Struts 示例應(yīng)用

    clip_image001_0008.gif

     

     

    Editor tab 表現(xiàn)為兩個面板。左邊pane 包含一個組成配置文件的元素的樹形視圖。右邊則是圖形化編輯窗口。不同的編輯器將取決于所選擇的元素。在Figure 1-2中,在視圖中選擇了/saveSubscription action mapping ,右邊則顯示了特的配置細(xì)節(jié),并可以編輯它。

    配置文件的XML源代碼可以在一個只讀的窗口中顯示,可以通過選擇Source tab 來打開它。你在圖形環(huán)境中所作的修改,都可以同步反映在源代碼中。當(dāng)然,除非你保存文件,它不會提交進(jìn)行保存。

    2

    因?yàn)镾truts Console解析和管理實(shí)際的XML 數(shù)據(jù),當(dāng)重新保存文件時(shí),它不會在原始文件中包含任何定制格式化和注釋信息。

     

    Struts Console 不同于常規(guī)的XML editor 之處是Struts console 能夠理解元素之間如何關(guān)聯(lián)。例如,在Figure 1-2, 有效可用的Form Beans 可以使用下拉列表來顯示。點(diǎn)擊Form Bean 下拉列表右邊的View 按鈕將顯示選定的Forms 定義。Form Bean 編輯器將顯示出來,而左邊pane的樹形視圖將被更新以反映正在查看的Form Bean。

    目前, Struts Console Version 4.4.1支持下列文件的編輯和創(chuàng)建:

    • Struts 配置文件( Struts 1.2, 1.1, 和 1.0); 即, struts-config.xml
    • Tiles 配置文件;即tiles-defs.xml
    • Validator 配置文件( Struts 1.1, 和 1.0);即, validator-rules.xml, validation.xml
    • JSP Tag Library Descriptor (TLD) (JSP Version 1.2, 1.1);即, struts-html.tld

    除了將它用作一個標(biāo)準(zhǔn)的程序之外,Struts Console 還可以插入到大多數(shù)Java IDE中,比如Eclipse, NetBeans, 和IntelliJ IDEA。

    使用任何圖形編輯器之前,最好是要熟悉和理解Struts 配置文件中的結(jié)構(gòu)和元素的含義。只有這樣,你才可以使用工具來隱藏具體的結(jié)構(gòu)而作你想做的事情。這有點(diǎn)類似于你心學(xué)習(xí)一種編程語言的時(shí)候,在依賴于IDE之前,還是最好使用簡單的文本編輯器和命令行工具。最然圖形化工具能夠減少你調(diào)試的精力和時(shí)間,你也需要理解文件的基本結(jié)構(gòu),以便能夠發(fā)生錯誤是找出具體原因。

    相關(guān)動作

    James Holmes的站點(diǎn)可以下載Struts Console。這個站點(diǎn)還提供其他Struts Console的詳細(xì)資料。James 還開發(fā)其他工具,比如Spring Console。http://www.jamesholmes.com.

    Struts 1.2 包括了一個plug-in, 即ModuleConfigVerifier,它用來捕捉應(yīng)用初始化時(shí)發(fā)生的配置錯誤。關(guān)于此插件的詳細(xì)信息,參見http://struts.apache.org/api/org/apache/struts/plugins/ModuleConfigVerifier.html.

    MyEclipse 是Eclipse IDE的一個定制化版本。這個漂亮的IDE提供了一個精心裁減的J2EE 應(yīng)用開發(fā)環(huán)境。目前,最新的 MyEclipse 已經(jīng)支持Eclipse 3.0。但是MyEclipse 不是免費(fèi)的,年訂閱費(fèi)大概是不到$50 。如果你想要一個一站式的IDE,它還是值得的。可訪問http://www.myeclipse.com.

    Struts Studio 也是一個非常雄心勃勃的開發(fā)工具,視圖提供商業(yè)級的Struts開發(fā)工具。可訪問,http://www.exadel.com/products_strutsstudio.htm.

    另外,M7的Nitrox也是非常優(yōu)秀個開發(fā)工具。www.M7.com

    商業(yè)IDE幾乎全部提供Struts的開發(fā)工具和環(huán)境,包括:IBM的WebSphere Application Developer Studio, WebSphere Site Developer Studio, Oracle 的JDeveloper , Borland JBuilder, BEA Weblogic Workshop。其中, oracle 和 Bean本身對Struts作了一些擴(kuò)展和定制化。可以訪問個公司的網(wǎng)站獲得詳細(xì)信息。

    posted @ 2005-04-30 11:04 鐵手 閱讀(2459) | 評論 (3)編輯 收藏
    僅列出標(biāo)題
    共26頁: First 上一頁 18 19 20 21 22 23 24 25 26 下一頁 
    主站蜘蛛池模板: 一个人看www在线高清免费看| 91香蕉成人免费网站| 亚洲成_人网站图片| 在线亚洲精品福利网址导航| 丁香花免费完整高清观看 | 亚洲精品无码久久久久牙蜜区| 亚洲AV综合色一区二区三区| 日本免费中文字幕在线看| 99在线观看精品免费99| 一级毛片免费一级直接观看| 久久夜色精品国产噜噜亚洲a| 精品亚洲国产成人av| 国产亚洲国产bv网站在线| 亚洲一区二区三区日本久久九| 久久影视国产亚洲| 亚洲成A人片77777国产| 大学生高清一级毛片免费| 免费A级毛片无码A∨中文字幕下载| 国色精品卡一卡2卡3卡4卡免费| 永久免费视频网站在线观看| 日韩在线永久免费播放| 成人激情免费视频| 妞干网在线免费观看| MM131亚洲国产美女久久| 亚洲国产综合无码一区二区二三区| 全黄性性激高免费视频| 国产精品99久久免费| 国产精品极品美女免费观看| 国产午夜亚洲精品午夜鲁丝片| 亚洲精品中文字幕乱码影院| 精品亚洲成a人片在线观看少妇| 亚洲色偷精品一区二区三区| 亚洲国产精品无码久久| 亚洲AV女人18毛片水真多| 亚洲精品天堂无码中文字幕| 中文字幕无码毛片免费看| 中文字幕av免费专区| 免费看无码特级毛片| 未满十八18禁止免费无码网站| 美女内射无套日韩免费播放| 国产成人一区二区三区免费视频|