| |
| 使用XDoclet,你能夠在J2EE環(huán)境下更加高效地工作,你所看到的Bean以及Bean之間的關(guān)系將更加簡(jiǎn)單,許多繁雜的事情將遠離你的EJB開(kāi)發(fā)過(guò)程。本文討論的是如何使用和擴展XDoclet。在這篇文章中,我們將創(chuàng )建一個(gè)使用Javadoc標記的會(huì )話(huà)Bean,然后利用XDoclet處理這個(gè)Bean。
一、什么是XDoclet XDoclet從Rickard Oberg創(chuàng )建的EJBDoclet工具發(fā)展而來(lái),它的設想很簡(jiǎn)單:避免為每個(gè)EJB提供多個(gè)文件,而是從單一Bean類(lèi)文件中提供組件需要的所有信息。那么,這是如何實(shí)現的呢?Java沒(méi)有.NET吹噓的“屬性”,但Java有Javadoc標記。我們可以把一個(gè)特殊的@標記放入Javadoc注釋?zhuān)缓笞屢粋€(gè)Doclet工具處理這些標記。由工具為指定的Bean生成合適的XML描述器文件和接口文件。XDoclet建立在EJBDoclet思想的基礎上,但適用范圍不再局限于EJB?,F在,我們已經(jīng)可以用XDoclet生成Web服務(wù)、Web應用描述器,甚至還可以對它進(jìn)行擴展,滿(mǎn)足自己的特殊需要。 @標記有一個(gè)標準的格式,包含一個(gè)“名稱(chēng)空間”以及一個(gè)屬于該名稱(chēng)空間的“標記名稱(chēng)”。標記的屬性以“名字=值”的形式在標記中指定。下面是一個(gè)例子: /** * @namespace:tag name="value" name2="value2" ... */ 當前可用的名稱(chēng)空間包括: ejb 標準的EJB信息(非廠(chǎng)商私有的信息) jboss 面向JBoss應用服務(wù)器的信息。 weblogic 面向BEA Weblogic應用服務(wù)器的信息。 webSphere 面向IBM WebSphere應用服務(wù)器的信息。 orion 面向Orion應用服務(wù)器(Oracle)的信息。 castor 為Castor框架生成映射信息。 mvcsoft 為MVCSoft EJB 2.0持久化管理器生成文件。 soap 生成SOAP描述器。 struts 生成struts-config.xml。 web 為Web應用生成web.xml配置文件。 jsp 生成標記庫擴展描述器信息。 從上面的清單可以看出,除了EJB之外,XDoclet還提供了許多其它方面的支持(因此它的名字也從EJBDoclet變成了XDcolet)。
二、用Javadoc標記標注會(huì )話(huà)Bean 前面我們討論了XDoclet工具的基本情況,下面來(lái)看一個(gè)實(shí)例。我們從一個(gè)會(huì )話(huà)EJB開(kāi)始。這個(gè)EJB是XBeans框架的一部分,但對于本文來(lái)說(shuō),Bean有什么樣的功能其實(shí)無(wú)關(guān)緊要。我們關(guān)心的是如何在Bean類(lèi)的基礎上,用Javadoc標記進(jìn)行適當的標注,然后用XDoclet生成我們需要的各種文件。 ReceiverBean.java文件包含了一個(gè)documentReady(Document doc)方法,這個(gè)方法接收一個(gè)DOM文檔并把它傳遞給鏈上面的下一個(gè)XBean。 2.1 在類(lèi)這一級上的定義 在類(lèi)這一層次上,我們必須定義: 聲明Bean的類(lèi)型,本例是無(wú)狀態(tài)會(huì )話(huà)Bean。 JNDI名稱(chēng)。 環(huán)境變量。 面向廠(chǎng)商的信息(例如WebLogic 緩沖池信息)。 2.1.1 @ejb:bean標記 該標記唯一必需的屬性是把Bean的名字告訴XDoclet。此外,我們還將定義Bean的類(lèi)型、JNDI名稱(chēng)和顯示的名稱(chēng)(display-name): /** * This is the EJB Receiver Xbean * * @ejb:bean type="Stateless" * name="ejbReceiver" * jndi-name="org.xbeans.ejb.receiver.Receiver" * display-name="EJB Receiver Xbean" * * ... 其他javadoc標記 ... */ public class ReceiverBean implements SessionBean, DOMSource { ejb:Bean標記最常用的屬性是: name EJB的名字(用于描述器)。 type 定義Bean的類(lèi)型。對于會(huì )話(huà)Bean,Bean的類(lèi)型是Stateful或者Stateless;對于實(shí)體Bean,它是CMP或BMP。 jndi-name 提供Bean的JNDI名字,它將被用于廠(chǎng)商私有的部署描述器(用于遠程接口)。 local-jndi-name 與jndi-name相同,但用于本地接口。 view-type 表示應當支持哪一種Bean的“視圖”??梢允莚emote或local,或者both。 要查看所有標記的完整說(shuō)明,請訪(fǎng)問(wèn)XDoclet的文檔。 2.1.2 @ejb:env-entry標記 這個(gè)標記定義了將在JNDI中通過(guò)java:comp/env上下文配置的環(huán)境變量。下面我們將定義一個(gè)環(huán)境變量,Bean用它來(lái)查找鏈上面的下一個(gè)XBean: /** * This is the EJB Receiver Xbean * * ... 其他javadoc標記 ... * * @ejb:env-entry name="channelBean" type="java.lang.String" * value="com.your.ChannelBean" * * ... 其他javadoc標記 ... */ public class ReceiverBean implements SessionBean, DOMSource {
2.1.3 @weblogic:pool標記 下面我們將配置面向特定廠(chǎng)商的緩沖池特征,為便于討論,我們將使用WebLogic。為表示聲明僅對特定廠(chǎng)商有效,我們先聲明weblogic名稱(chēng)空間: /** * This is the EJB Receiver Xbean * * ... 其他javadoc標記 ... * * @weblogic:pool max-beans-in-free-pool="1000" * initial-beans-in-free-pool="10" * * ... 其他javadoc標記 ... */ public class ReceiverBean implements SessionBean, DOMSource { 這個(gè)標記將在面向WebLogic的部署描述器(weblogic-ejb-jar.xml)中配置緩沖池參數。 還有其他許多類(lèi)這一級的標記,這些標記使得我們能夠調整任何可以在部署描述器中指定的選項。下面概要地介紹了可能在部署過(guò)程中要用到的一些“標準”標記: @ejb:bean:唯一必需的標記,配置有關(guān)Bean的基本信息。 @ejb:home:提供有關(guān)Home接口的信息??梢砸骕Doclet擴展一個(gè)定制的接口,或者把接口放入指定的包,等等。 @ejb:interface:類(lèi)似于home標記,但用來(lái)配置與組件接口(遠程的和/或本地的)有關(guān)的信息。 @ejb:finder:在實(shí)體Bean Home接口上定義查找器方法。 @ejb:select:在實(shí)體Bean Home接口上定義select方法。 @ejb:pk:為實(shí)體Bean定義主鍵。XDoclet能夠生成主鍵類(lèi)。 @ejb:data-object:數據對象(也就是值對象)可以通過(guò)這個(gè)標記自動(dòng)生成。 @ejb:ejb-ref:配置EJB引用。 @ejb:ejb-external-ref:配置對其他應用中的EJB的引用,這里必需指定Bean的類(lèi)型等信息。 @ejb:resource-ref:配置資源引用。 @ejb:security-role-ref:配置安全角色引用。 @ejb:transaction:為當前Bean的Home接口和Remote接口中的所有方法定義事務(wù)屬性??梢酝ㄟ^(guò)為單個(gè)方法提供的事務(wù)標記覆蓋。 @ejb:permission:允許role-name中指定的角色調用該Bean的Home接口和Remote接口中的所有方法。 @ejb:security-identity:指定是否用調用者的安全標識符執行EJB的方法,還是用另外一個(gè)特定的安全標識符。 2.2 在方法這一級上的定義 下面我們來(lái)看看方法級的標記。要讓某個(gè)方法成為遠程接口的一部分,我們只需通過(guò)一個(gè)方法級的標記告訴XDoclet: /** * The method that the sender uses to pass the Document * * @ejb:interface-method view-type="remote" */ public void documentReady(Document incomingDocument) { 這個(gè)標記經(jīng)常要用到。一般地,我們依次檢查Bean類(lèi)里面每一個(gè)方法,如果某個(gè)方法應該讓客戶(hù)程序調用,則在該方法聲明的前面加上這個(gè)標記。如果希望客戶(hù)程序通過(guò)本地接口訪(fǎng)問(wèn)這個(gè)方法,只需把view-type值改成local就可以了。 下面是另外幾個(gè)常用的EJB方法級的標記: @ejb:relation:為EJB 2.0 CMP實(shí)體Bean定義一個(gè)關(guān)系。 @ejb:home-method:把方法定義為ejbHome*方法。 @ejb:pk-field:標示主鍵域。 @ejb:transaction:為當前的方法定義事務(wù)行為(指定一個(gè)合法的事務(wù)屬性:NotSupported,Supports,Required,RequiresNew,Mandatory,或者Never)。 @ejb:permission:定義方法的許可權限(給出一個(gè)允許訪(fǎng)問(wèn)該方法的角色的列表,用逗號分隔)。
三、運行XDoclet 現在我們完成了為ReceiverBean.java加上XDoclet標記的工作。下面我們要運行XDoclet,讓它為我們生成所有部署Bean時(shí)需要的文件。運行XDoclet工具最好的方式是通過(guò)Jakarta-Ant進(jìn)行。Ant是一個(gè)廣泛應用的Java構造系統,現在幾乎每個(gè)人都在用它。關(guān)于A(yíng)nt的詳細說(shuō)明,請參見(jiàn)Jakarta 網(wǎng)站。 XDoclet的作者為我們編寫(xiě)好了可以直接放入Ant構造文件(build.xml)的Ant任務(wù)。任務(wù)主要分兩類(lèi):ejbdoclet和webdoclet。由于我們正在處理的是一個(gè)EJB,下面我們來(lái)仔細地分析一下build文件里面的ejbdoclet部分: <target name="ejbdoclet" depends="prepare">
四、XDoclet的可擴展性 XDoclet具有很好的可擴展性。按照XDoclet的構造方式,我們可以修改描述器文件和接口文件的輸出結果,通過(guò)它的簡(jiǎn)單的模板機制,我們還可以創(chuàng )建出自己的輸出。每一個(gè)輸出文件有一個(gè)對應的模板文件,模板文件以“.j”為擴展名,打開(kāi)xdoclet.jar包可以看到許多這類(lèi)摸板文件。每一個(gè)摸板文件包含一組XML標記,從這些XML標記簡(jiǎn)單的邏輯很容易推測出摸板的輸出結果。下面是一個(gè)從現成EJB模板取出的簡(jiǎn)單例子,它將輸出從@ejb:bean display-name屬性取得的Bean的顯示名字: <display-name> 結束語(yǔ):本文探討了如何用XDoclet輔助EJB開(kāi)發(fā)。XDoclet是一個(gè)免費的、源代碼開(kāi)放的工具,能夠簡(jiǎn)化EJB開(kāi)發(fā)過(guò)程,允許我們用單個(gè)Bean類(lèi)文件包含所有Bean需要的信息,自動(dòng)生成接口文件和描述器文件。XDoclet正在不斷地發(fā)展,它的用途不再局限于EJB。能夠標示出那些希望能夠通過(guò)SOAP使用的方法、配置Web應用(即使是用于Struts)無(wú)疑令人興奮,但隨著(zhù)時(shí)間的發(fā)展,更多的功能將不斷涌現,甚至還有一些工具能夠用來(lái)生成XDoclet標記,例如Middlegen code generation tool for EJB 2.0 Entity Beans。 下載本文的代碼:JavaXDoclet_code.zip。 |
聯(lián)系客服