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

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

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

    隨筆-314  評(píng)論-209  文章-0  trackbacks-0

    發(fā)現(xiàn)多功能的模板驅(qū)動(dòng)的代碼生成器

    developerWorks
    文檔選項(xiàng)
    將此頁(yè)作為電子郵件發(fā)送

    將此頁(yè)作為電子郵件發(fā)送


    最新推薦

    Java 應(yīng)用開(kāi)發(fā)源動(dòng)力 - 下載免費(fèi)軟件,快速啟動(dòng)開(kāi)發(fā)


    級(jí)別: 初級(jí)

    Sing Li , 作者, Wrox Press

    2004 年 11 月 05 日

    開(kāi)放源代碼的 XDoclet 代碼生成引擎,是許多領(lǐng)先的 Java 框架不可缺少的組成部分,常常被用作面向?qū)傩缘木幊毯统掷m(xù)集成的引擎。但是 XDoclet 還有一些不太惹人注目的地方:對(duì)初級(jí)開(kāi)發(fā)人員來(lái)說(shuō),它太難掌握、太難精通。在這篇文章中,流行作者 Sing Li 以 XDoclet 為對(duì)象,揭示了其內(nèi)部簡(jiǎn)單卻優(yōu)雅的設(shè)計(jì),使您能夠理解這項(xiàng)技術(shù),并將它應(yīng)用在實(shí)踐當(dāng)中。

    XDoclet 能夠很容易成為您的 Java 編程工具箱中的一個(gè)更加通用的跨技術(shù)代碼生成工具。不幸的是,開(kāi)發(fā)人員經(jīng)常忽視 XDoclet 的一般用途,只有將它捆綁在大型開(kāi)發(fā)框架或者 IDE 中,作為其中的一個(gè)隱藏元素時(shí),才會(huì)用到它。人們常常認(rèn)為很難將 XDoclet 應(yīng)用在定制解決方案上。這篇文章的目的就是要消除這個(gè)迷惑,把 XDoclet 從常見(jiàn)的復(fù)雜陷阱中解脫出來(lái),并向您展示了如何能夠利用這個(gè)代碼生成引擎。

    我會(huì)用一個(gè)實(shí)際的例子演示 XDoclet 的用途,該例子將接收一個(gè) POJO(plain old Java object),并用 XDoclet 生成完整 Web 應(yīng)用程序的全部文件,這些文件是把數(shù)據(jù)輸入關(guān)系數(shù)據(jù)庫(kù)所必需的。該示例使用了 XDoclet 的 自定義模板代碼生成功能,以及它對(duì) Hibernate 對(duì)象關(guān)系映射工具、Struct Web 應(yīng)用程序框架和應(yīng)用程序服務(wù)器的內(nèi)部支持。(請(qǐng)參閱 參考資料)。

    智能代碼生成器

    XDoclet 的核心功能是根據(jù)以下組合來(lái)生成代碼的(或者生成其他配置/數(shù)據(jù)文件):

    • 進(jìn)行特殊標(biāo)記的 Java 源文件。
    • 預(yù)先定義的模板。

    與其他基于模板的代碼生成技術(shù)(例如 Velocity;請(qǐng)參閱 參考資料)相比,XDoclet 具有以下獨(dú)特優(yōu)勢(shì):

    • XDoclet 與 Apache Ant(請(qǐng)參閱 參考資料)緊密集成,從而提供了高度自動(dòng)化的操作。

    • 把控制代碼生成和模板處理的 XDoclet 標(biāo)簽作為內(nèi)聯(lián)注釋嵌入到 Java 源代碼文件中。這消除了同步多個(gè)相關(guān)文件和控制文件的需要。

    • XDoclet 的內(nèi)置 Java 解析器使用它對(duì) Java 代碼結(jié)構(gòu)的深入理解,為輸入的 Java 代碼建立內(nèi)部 結(jié)構(gòu)模型。該結(jié)構(gòu)模型又經(jīng)常被叫作 元數(shù)據(jù)(metadata),因?yàn)樗c關(guān)聯(lián)代碼有關(guān)的數(shù)據(jù)。

    • XDoclet 的模板生成邏輯擁有對(duì)輸入 Java 代碼的內(nèi)部結(jié)構(gòu)模型的完全訪問(wèn)權(quán)。

    接下來(lái),我將進(jìn)一步研究 XDoclet 是如何工作的,以幫助您理解這些特性。

    XDoclet 操作

    圖 1 顯示了 XDoclet 要求的輸入和生成的輸出。


    圖 1. XDoclet 黑盒子
    圖 1

    您可以看到,包含嵌入式 XDoclet 標(biāo)簽的 Java 源代碼是系統(tǒng)的輸入。在 Apache Ant 的驅(qū)動(dòng)下,XDoclet 處理輸入的代碼,生成的輸出文本文件可以是 Java 源代碼、HTML 頁(yè)面、XML 文件等。為了處理輸入,XDoclet 需要使用模板(保存在 .xdt 文件中)和標(biāo)簽處理器(用 Java 編碼)。XDoclet 把模板和標(biāo)簽處理器打包成“模塊”,不同的“模塊”處理不同的問(wèn)題域。

    XDoclet 生成的結(jié)構(gòu)模型

    XDoclet 對(duì)包含嵌入式 XDoclet 標(biāo)簽的輸入 Java 源代碼進(jìn)行解析,并為代碼建立非常詳細(xì)的結(jié)構(gòu)模型。結(jié)構(gòu)模型中的每個(gè)元素都代表源代碼中的一個(gè) Java 結(jié)構(gòu)。圖 2 顯示的結(jié)構(gòu)模型,揭示了 XDoclet 跟蹤的代碼構(gòu)造和關(guān)系。


    圖 2. XDoclet 的解析的 Java 源代碼的內(nèi)部結(jié)構(gòu)模型
    圖 2

    圖 2 中的結(jié)構(gòu)模型跟蹤類、接口、方法之類的代碼構(gòu)造(模型元素)。該模型還跟蹤元素之間的關(guān)系,例如繼承和接口實(shí)現(xiàn)。以內(nèi)聯(lián)注釋的形式嵌入在源代碼中的 XDoclet 標(biāo)簽被解析為模型元素的屬性,并被跟蹤。

    通用的 Javadoc 引擎

    能夠理解 Java 代碼結(jié)構(gòu)模型的智能代碼生成引擎不是什么新概念。實(shí)際上,它是 JDK 自帶的 Javadoc 工具的運(yùn)作方式。通過(guò)解析帶有特殊 Javadoc 標(biāo)簽的 Java 源文件,Javadoc 工具可以為所有 Java 程序的內(nèi)置結(jié)構(gòu)元素(包括類、接口、字段和方法)生成 HTML 文檔。Javadoc 還具有特殊 Java 語(yǔ)言概念方面的知識(shí),例如繼承、抽象類、存儲(chǔ)類和修飾符。

    XDoclet 的誕生,來(lái)自這樣一個(gè)觀察:適用于任意代碼生成的 Javadoc 的通用版本,在許多編程場(chǎng)合下會(huì)極為有用。但是,實(shí)際的 Javadoc 源代碼不是為通用的代碼生成設(shè)計(jì)的,而只是為了生成 HTML 文檔。由于無(wú)法重用現(xiàn)有代碼,XDoclet 開(kāi)發(fā)小組從頭開(kāi)始重寫(xiě)了引擎,并顯著優(yōu)化了它的性能。





    回頁(yè)首


    深入 XDoclet

    圖 3 顯示了 XDoclet 的內(nèi)部結(jié)構(gòu),揭示了使其運(yùn)行的功能塊。


    圖 3. XDoclet 內(nèi)部的功能塊
    圖 3
    ?

    如圖 3 所示,Apache Ant 在運(yùn)行的時(shí)候控制著 XDoclet 的配置和操作。XDoclet 解析輸入的 Java 源代碼,并在內(nèi)存中生成結(jié)構(gòu)模型。模板引擎通過(guò)處理一組模板和標(biāo)簽處理器,生成輸出文件。模板和標(biāo)簽處理器可以是內(nèi)置的,也可以是定制的。在代碼生成期間,模板和標(biāo)簽處理器擁有對(duì)結(jié)構(gòu)模型的完全訪問(wèn)。

    XDoclet 虛假的復(fù)雜性

    XDoclet 實(shí)質(zhì)上就是一個(gè)通用的 Javadoc 引擎(請(qǐng)參閱側(cè)欄, 通用的 Javadoc 引擎)。那么,是什么讓它看起來(lái)這么復(fù)雜呢?答案在于:XDoclet 幾乎從未被單獨(dú)討論過(guò),而總是藏在其他許多復(fù)雜的技術(shù)中。圖 4 顯示了了圍繞在 XDoclet 周圍的復(fù)雜性迷霧(請(qǐng)參閱側(cè)欄 為什么 XDoclet 看起來(lái)比實(shí)際的要復(fù)雜得多)。

    為什么 XDoclet 看起來(lái)比實(shí)際的要復(fù)雜得多

    Apache Ant 自動(dòng)進(jìn)行 Java 軟件的生成過(guò)程。構(gòu)建管理過(guò)程通常是生產(chǎn)項(xiàng)目中更復(fù)雜過(guò)程中的一部分。構(gòu)建管理的術(shù)語(yǔ)和概念被集成到 Apache Ant 中,而且是理解其操作的先決條件。成熟的 Ant 腳本可能會(huì)非常復(fù)雜。Ant 的每個(gè)新版本,都會(huì)引入一些新的特性集,從而進(jìn)一步增加了復(fù)雜性。這形成了 XDoclet 表面的復(fù)雜性,因?yàn)?XDoclet 需要 Ant 才能執(zhí)行。

    XDoclet 處理的問(wèn)題領(lǐng)域是復(fù)雜性的另一個(gè)來(lái)源。在發(fā)布 XDoclet 的時(shí)候,XDoclet 已經(jīng)可以為 EJB 組件集成、J2EE Web 容器集成、Hibernate 持久性層、Struts 框架、Java 管理擴(kuò)展(JMX)等生成代碼。這些問(wèn)題領(lǐng)域中的每一個(gè)領(lǐng)域都有一大套該領(lǐng)域?qū)S玫男性捄透拍睢倪@些復(fù)雜的問(wèn)題領(lǐng)域出來(lái)的問(wèn)題,經(jīng)常主導(dǎo)著 XDoclet 的討論,這也提高了 XDoclet 表面的復(fù)雜性。可能是“只見(jiàn)森林,不見(jiàn)樹(shù)木”。


    圖 4. XDoclet 的復(fù)雜耦合
    Figure 4

    在圖 4 中,您可以看到 XDoclet 與以下內(nèi)容是緊密相關(guān)的:

    • Apache Ant,它控制著 XDoclet 的操作。XDoclet 是作為一組 Ant 任務(wù)存在的,沒(méi)有 Ant 則不能執(zhí)行。
    • 與生成文件關(guān)聯(lián)的具體問(wèn)題領(lǐng)域的一些細(xì)節(jié)。

    XDoclet 本身卻是驚人地簡(jiǎn)單,正如下面示例中的工作代碼所示的那樣。





    回頁(yè)首


    使用 XDoclet

    現(xiàn)在,您可以通過(guò)研究我向您提供的數(shù)據(jù)入口應(yīng)用程序示例,來(lái)觀察 XDoclet 的實(shí)際工作。(要下載這個(gè)示例中使用的 Java 代碼、XDoclet 模板和 Ant 腳本,請(qǐng)單擊本文頂部或底部的 Code圖標(biāo),或者請(qǐng)參閱 下載部分。)我們將從檢查清單 1 所示的 Java 代碼開(kāi)始,這部分代碼表示了一個(gè)客戶的地址。該地址被編碼成 JavaBean 組件,其中的 XDoclet 標(biāo)簽是以黑體字形式顯示的:


    清單 1. 用 XDoclet 標(biāo)簽標(biāo)記的 AddressBean.java 源文件
    package com.ibm.dw.beans;import java.io.Serializable;/**        * @dw.genStrutsAction action="/addAddress.do"* @hibernate.class table="ADDRESS"*/public class AddressBean implements Serializable {private String streetNumber = "";private String street = "";private String city = "";private String country = "";private String postalCode = "";private long id = 0;public AddressBean() {}/**        * @dw.genStruts formlabel="Street Number"* @hibernate.property length="10"*/public String getStreetNumber() {   return streetNumber;}public void setStreetNumber(String inpStreetNumber) {   streetNumber = inpStreetNumber;}/**        * @dw.genStruts formlabel="Street"* @hibernate.property  length="40"*/public String getStreet() {    return street;}public void setStreet(String inpStreet) {   street = inpStreet;}        ...... more Address bean properties ....../**        * @hibernate.id generator-class="native"*/public long getId(  ){        return id;}public void setId(long inId) {   id = inId;}}      

    在清單 1 中,需要注意的是,要把 XDoclet 標(biāo)簽嵌入到注釋中,緊放在相關(guān)代碼元素(例如字段、方法、接口或類)的前面。在解析源代碼時(shí),XDoclet 會(huì)為每個(gè)標(biāo)簽建立一個(gè)屬性,并將該屬性附加到結(jié)構(gòu)模型的代碼元素上。現(xiàn)在,請(qǐng)注意 @dw.genStruts 標(biāo)簽,因?yàn)檫@是在本例中將用到的第一個(gè)模板。

    生成另外一個(gè) Java 類

    對(duì)于本例,您需要生成新的 Java 類的代碼 —— 一個(gè) Struts 表單 bean。Struts 會(huì)用這個(gè) bean 保存并傳輸用戶輸入。bean 必須以 bean 屬性的形式包含所有數(shù)據(jù)字段,而且它必須是 org.apache.struts.action.ActionForm 的子類。

    為了生成表單 bean 的代碼,您要根據(jù)清單 2 所示的偽代碼生成 XDoclet 模板。括號(hào)中的黑體字代表控制流邏輯和您要進(jìn)行替換的文本。請(qǐng)注意模板是如何從已解析的 Java 源代碼文件的結(jié)構(gòu)模型中提取信息的:


    清單 2. 建立 AddressBeanForm.java Struts 表單 bean 代碼的偽代碼模板
    package         {package name of source class};import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionMapping;import org.apache.struts.upload.FormFile;/** * Form Bean class for         {name of source class};. * * @struts.form name="        {name of source class}Form" */public class         {name of source class}Form extends ActionForm {        {loop through all the methods in the source class}   {if the method is a JavaBean "getter" method}      {if the method has been marked with the @dw.genStruts tag }	private         {return type of method}{name of the JavaBean property}; 	public         {return type of method}{name of the getter method for this property}(){		return         {name of JavaBean property};	}	public void         {name of the setter method for this property}(	                                    {return type of method} value) {                    {name of the JavaBean property} = value;      			}               {end of if @dw.genStruts}    {end of if JavaBean getter}{end of loop}

    用 XDoclet 建立 XDoclet 標(biāo)簽

    請(qǐng)注意在 清單 2 的模板中生成的 XDoclet @struts.form 標(biāo)簽。您可以用 XDoclet 在 Java 源代碼中生成 XDoclet 標(biāo)簽,XDoclet 會(huì)在后面的操作中再次處理這些標(biāo)簽。在示例后面建立 structs-config.xml 的時(shí)候,XDoclet 會(huì)使用 @struts.form 標(biāo)簽。



    在清單 2 的循環(huán)中的代碼生成了一個(gè)字段聲明和一個(gè)訪問(wèn)器方法,還為輸入源代碼中每個(gè)用 @dw.genStruts 標(biāo)記的訪問(wèn)器方法生成了一個(gè)設(shè)置器方法。

    清單 2 使用了易于理解的偽代碼來(lái)表示模板替換標(biāo)簽。實(shí)際的 XDoclet 模板標(biāo)簽則相當(dāng)繁瑣。清單 3 顯示了 genformbean.xdt 模板(所有的 XDoclet 模板都保存在 .xdt 文件中)。我已經(jīng)用黑體字強(qiáng)調(diào)了 XDoclet 模板標(biāo)簽,以方便在偽代碼中對(duì)其進(jìn)行引用。


    清單 3. 建立 Structs 表單 bean Java 代碼的實(shí)際 XDoclet 模板代碼
    package         <XDtPackage:packageName/>;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionMapping;import org.apache.struts.upload.FormFile;/** * Form Bean class for         <XDtClass:className/>. * * @struts.form name="        <XDtClass:className/>Form" */public class         <XDtClass:className/>Form extends ActionForm {        <XDtMethod:forAllMethods>   <XDtMethod:ifIsGetter>      <XDtMethod:ifHasMethodTag tagName="dw.genStruts">	private         <XDtMethod:methodType/> <XDtMethod:propertyName/>; 	public         <XDtMethod:methodType/> <XDtMethod:getterMethod/>(){		return         <XDtMethod:propertyName/>;	}	public void         <XDtMethod:setterMethod/>(        <XDtMethod:methodType/> value) {                    <XDtMethod:propertyName/> = value;      			}             </XDtMethod:ifHasMethodTag>   </XDtMethod:ifIsGetter></XDtMethod:forAllMethods>

    熟悉 Ant 腳本編寫(xiě)

    Ant 腳本 build.xml(我已經(jīng)隨本文的示例代碼提供了這個(gè)文件,請(qǐng)參閱 下載部分找到代碼的鏈接)定義了示例應(yīng)用程序使用的全部必要 Ant 目標(biāo)。如果您想修改腳本,就需要熟悉 Ant。請(qǐng)參閱 參考資料 了解 Ant 的更多信息。

    您可以參考 XDoclet 的“模板語(yǔ)言”文檔,查找 XDoclet 所有可用標(biāo)簽的列表(請(qǐng)參閱 參考資料)。

    要運(yùn)行用于 AddressBean.java 源文件的模板,請(qǐng)使用以下 Ant 命令行:

    ant -Dbase.class.java=Address genstruts

    這個(gè)命令可以執(zhí)行定制 Ant 目標(biāo)(請(qǐng)參閱側(cè)欄 熟悉 Ant 腳本編寫(xiě))來(lái)處理 genbeanform.xdt 模板。XDoclet 提供的 Ant 任務(wù)叫作 xdoclet.DocletTask ,它被用來(lái)運(yùn)行模板文件。如果您對(duì) Ant 的細(xì)節(jié)感興趣,請(qǐng)參閱示例代碼中的 build.xml 文件,以了解更多信息。

    在 XDoclet 處理模板的時(shí)候,它在名為 generated的子目錄下生成一個(gè) AddressBeanForm.java 文件。清單 4 顯示了該文件,它包含模板處理期間替換的所有文本:


    清單 4. XDoclet 生成的包含 Struts 表單 bean 的 Java 源代碼
    package         com.ibm.dw.beans;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionMapping;import org.apache.struts.upload.FormFile;/** * Form Bean class for         AddressBean. * * @struts.form name="        AddressBeanForm" */public class         AddressBeanForm extends ActionForm {	private         java.lang.String streetNumber; 	public         java.lang.String getStreetNumber(){		return         streetNumber;	}	public void         setStreetNumber(        java.lang.String value) {                    streetNumber = value;      			}	private         java.lang.Stringstreet; 	public         java.lang.String getStreet(){		return         street;	}	public void         setStreet(        java.lang.String value) {                    street = value;      			}           ...... more bean properties .....}      

    為數(shù)據(jù)表單輸入生成 JSP 頁(yè)面

    您可以用相同的 AddressBean.java 源文件,但是用 genformjsp.xdt 模板生成數(shù)據(jù)入口表單 JSP 頁(yè)面。清單 5 顯示了 genformjsp.xdt:


    清單 5. 使用 Struts 標(biāo)簽庫(kù)生成 JSP 頁(yè)面來(lái)顯示 HTML 表單的 XDoclet 模板
    <%@ page language="java" %><%@ taglib  uri="/WEB-INF/struts-html.tld" prefix="html" %><html:html><head></head><body bgcolor="white"><html:errors/><html:form action="        <XDtClass:classTagValue tagName='dw.genStrutsAction'  paramName='action' /> >"<table border="0" width="100%">        <XDtMethod:forAllMethods>   <XDtMethod:ifIsGetter>      <XDtMethod:ifHasMethodTag tagName="dw.genStruts" >    <tr>        <th align="right">                   <XDtMethod:methodTagValue                    tagName="dw.genStruts" paramName="formlabel"/>        </th>        <td align="left">            <html:text  property="        <XDtMethod:propertyName/>"              size="        <XDtMethod:ifHasMethodTag tagName="hibernate.property" >              <XDtMethod:methodTagValue tagName="hibernate.property" paramName="length"/>              </XDtMethod:ifHasMethodTag>"/>        </td>    </tr>             </XDtMethod:ifHasMethodTag>   </XDtMethod:ifIsGetter></XDtMethod:forAllMethods>    <tr>        <td align="right">            <html:submit>                Submit            </html:submit>        </td>        <td align="left">            <html:reset>              Reset            </html:reset>        </td>    </tr></table></html:form></body></html:html>      

    請(qǐng)注意,代碼中用 <XDt:methodTagValue> 取得原始 AddressBean.java 代碼中在 XDoclet 標(biāo)簽中指定的屬性值。

    當(dāng)您執(zhí)行 genstruts Ant 目標(biāo)的時(shí)候,也會(huì)處理清單 5 顯示的 genformjsp.xdt 模板。您可以在 generated 子目錄中找到生成的 AddressBeanForm.jsp 文件,檢查文件內(nèi)容,可以看到要對(duì)模板進(jìn)行的替換。

    試驗(yàn)示例,但是首先...

    要試驗(yàn)本文示例中的模板化代碼生成,您需要安裝并測(cè)試好 Ant 和 XDoclet。本文中的代碼全都基于 Ant 1.5.4 和 XDoclet 1.2.1。要生成所有的工件,并試驗(yàn)生成的 Web 應(yīng)用程序,還需要安裝 Hibernate,Struts,以及應(yīng)用程序服務(wù)器,還需要能夠訪問(wèn)關(guān)系數(shù)據(jù)庫(kù)。示例基于 Hibernate 2.1.4,Struts 1.1,以及 Servlet 2.3。請(qǐng)參閱 參考資料 了解有關(guān)這些技術(shù)的更多信息。請(qǐng)一定要閱讀我隨源代碼一起提供的 README 文件。

    生成其他工件

    您可以用 XDoclet 生成任意基于文本的輸出。我向您展示的例子使用 XDoclet 生成了 Java 代碼、JSP 頁(yè)面、XML 文件、配置文件以及其他更多輸出。它從一個(gè)簡(jiǎn)單的用 XDoclet 進(jìn)行標(biāo)記的 Java 源文件 AddressBean.java,建立了一個(gè)完整的數(shù)據(jù)入口 Web 應(yīng)用程序。為了做到這一點(diǎn),它執(zhí)行了 XDoclet 的內(nèi)置模板(位于 JAR 文件中,稱為模塊),從而生成:

    • Struts 配置和支持文件。
    • Hibernate 配置和支持文件。
    • Web 應(yīng)用程序的部署描述符(web.xml)。

    表 1 顯示了為示例應(yīng)用程序生成的所有文件(通常稱為 工件(artifact)):


    表 1. XDoclet 為 AddressBean.java 生成的工件
    生成的工件說(shuō)明位置
    AddressBeanForm.javaJava 源文件,包含表單 bean 類,在 Struts 的表單處理中使用generated目錄
    AddressBeanForm.jspJSP 表單,用 Struts 標(biāo)簽庫(kù)接受用戶地址輸入jsp目錄
    AddressBeanAction.javaStruts 動(dòng)作類,接受輸入值,用 Hibernate 把值保存到關(guān)系數(shù)據(jù)庫(kù)generated目錄
    AddressBean.hbm.xmlHibernate 映射文件,在 AddressBean Java 對(duì)象和數(shù)據(jù)庫(kù)的關(guān)系型 ADDRESS 表之間進(jìn)行映射 web/classes目錄
    dwschema.sqlRDBMS 表的架構(gòu),用來(lái)對(duì) AddressBean 對(duì)象的實(shí)例進(jìn)行持久化 sql目錄
    hibernate.cfg.xmlHibernate 運(yùn)行時(shí)的配置文件web/classes目錄
    web.xml生成的 Web 應(yīng)用程序的部署描述符web目錄
    struts-config.xmlStruts 框架的配置文件web目錄

    在這篇文章中,您詳細(xì)了解了表 1 中所列的兩個(gè)工件中的第一個(gè)工件的生成,深入了解了生成它們的模板。工件 AdddressBeanAction.java 則用類似的方法,利用叫作 genaction.xdt 的模板生成。XDoclet 具有內(nèi)置模板和標(biāo)簽處理器,可以生成表 1 中的其他工件。

    表 2 列出了每個(gè)生成的工件對(duì)應(yīng)的 Ant 目標(biāo)和 Ant 任務(wù)。您可以執(zhí)行表格中的每個(gè) Ant 目標(biāo),生成對(duì)應(yīng)的工件。所有這些生成的工件,再加上原始和 AddressBean.java,共同構(gòu)成了示例 Web 應(yīng)用程序。您還會(huì)發(fā)現(xiàn)叫作 all 的默認(rèn) Ant 目標(biāo),它會(huì)為您做任何事,包括為應(yīng)用程序建立 WAR(可以部署的 Web 歸檔)。在進(jìn)行處理之前,一定要閱讀代碼發(fā)布包中的 README.txt 文件。

    XDoclet 中的合并點(diǎn)

    在 XDoclet 的文檔中,您會(huì)非常頻繁地看到術(shù)語(yǔ) 合并點(diǎn)(merge point)合并文件(merge file)。合并文件是文本文件,您可以把它合并到 XDoclet 生成代碼的指定位置——“合并點(diǎn)”上(由模板指定)。可以用合并文件來(lái)包含靜態(tài)文本(例如代碼片斷和 XML 片斷),這些文本可能很難或者不能用 XDoclet 的能力生成。例如,在示例代碼的 merge/web 目錄下,您會(huì)找到 struts-action.xml 文件。在代碼生成期間,可以用該文件合并到 Struts 的動(dòng)作映射中,構(gòu)成生成的 struts-config.xml 文件的一部分。


    表 2. 對(duì)應(yīng)于生成工件的 Ant 目錄和 Ant 任務(wù)
    Ant 目標(biāo)Ant 任務(wù)工件
    genstrutsxdoclet.DocletTaskAddressBeanForm.java
    genstrutsxdoclet.DocletTaskAddressBeanForm.jsp
    genstrutsxdoclet.DocletTaskAddressBeanAction.java
    generateHIBxdoclet.modules.hibernate.HibernateDocletTaskAddressBean.hbm.xml
    generateHIBxdoclet.modules.hibernate.HibernateDocletTaskhibernate.cfg.xml
    createDDLxdoclet.modules.hibernate.HibernateDocletTaskdwschema.sql
    generateDDxdoclet.modules.web.WebDocletTaskweb.xml
    generateDDxdoclet.modules.web.WebDocletTaskstruts-config.xml




    回頁(yè)首


    結(jié)束語(yǔ)

    XDoclet 是一個(gè)有用的、智能的代碼生成器,您可以用它自動(dòng)進(jìn)行許多日常的 Java 開(kāi)發(fā)任務(wù)。不要被它表面的復(fù)雜所嚇退。隨著逐漸精通 XDoclet(以及與之相關(guān)的 Apache Ant),您會(huì)節(jié)約您寶貴的時(shí)間,并在未來(lái)的開(kāi)發(fā)工作中,得到數(shù)倍的回報(bào)。






    回頁(yè)首


    下載

    名字大小下載方法
    j-xdoclet-code.zip??FTP
    關(guān)于下載方法的信息Get Adobe? Reader?




    回頁(yè)首


    參考資料





    回頁(yè)首


    關(guān)于作者

    Author photo

    Sing Li 是 Professional Apache Tomcat 5Pro JSP, Third EditionEarly Adopter JXTAProfessional Jini,以及 Wrox Press 出版的許多其他圖書(shū)的作者。他是技術(shù)雜志的定期撰稿人,還是 P2P 發(fā)展的熱心傳播者。Sing 是一名咨詢顧問(wèn)和資深作者,您可以通過(guò)他的電子郵件 westmakaha@yahoo.com與他聯(lián)系。


    posted on 2006-11-05 08:30 xzc 閱讀(452) 評(píng)論(0)  編輯  收藏 所屬分類: Xdoclet
    主站蜘蛛池模板: 国产一二三四区乱码免费| 中文字幕无码免费久久| 免费看一级一级人妻片| 永久免费精品影视网站| 中文字幕亚洲码在线| 国产综合成人亚洲区| 中文字幕在线免费播放| 6080午夜一级毛片免费看6080夜福利 | 亚洲av片在线观看| 特级毛片全部免费播放a一级| 成人片黄网站色大片免费观看cn | 中文字幕免费在线播放| 曰批视频免费40分钟试看天天| 免费无码又爽又刺激高潮| 亚洲日本一区二区一本一道 | 久久一区二区三区免费| 美丽姑娘免费观看在线观看中文版 | 久久久久免费视频| 四虎在线免费视频| 日产国产精品亚洲系列| 亚洲精品私拍国产福利在线| 伊人久久亚洲综合影院首页| 国产国产人免费人成成免视频| 窝窝影视午夜看片免费| 99久久国产免费-99久久国产免费 99久久国产免费中文无字幕 | selaoban在线视频免费精品| 57pao国产成永久免费视频| 免费人成视频在线观看视频| 911精品国产亚洲日本美国韩国| 精品亚洲视频在线| 特级毛片aaaa免费观看 | 成人免费一区二区三区| 国产在线观看麻豆91精品免费| 国产一卡二卡3卡四卡免费| 亚洲国产精品成人久久蜜臀| 亚洲精品视频专区| 免费看又黄又爽又猛的视频软件| 最好看的中文字幕2019免费| 亚洲 无码 在线 专区| 亚洲一区精品视频在线| 中文字幕手机在线免费看电影|