你開發(fā)過EJB么?當你去創(chuàng)建和操作EJB的XML部署描述以及接口時,是否受過挫折呢?我當然有過。 我近來正在用EJB開發(fā)一個叫Xbeans的開源項目,并且決定使用另外一個開源工具 -- XDoclet -- 來生成XML描述和EJB接口. 使用XDoclet可以讓你在J2EE框架內更高效的工作。你將有一個更簡單的beans之間的視圖和關系, 并且可以去除很多你在開發(fā)中的煩惱。 這篇文章將討論XDoclet,以及如何去使用和擴展它。在這里,我們將創(chuàng)建一個使用javadoc標記(tag)的會話(Session)Bean,并且使用XDoclet運行它。
什么是XDoclet? XDoclet是在Rickard Oberg創(chuàng)建的EJBDoclet基礎上演化過來的一個工具。它的想法很簡單:通過bean類本身來查看整個組件,而不是通過操作多個ejb文件。它是怎樣做到的呢?java除了有javadoc標記外,并沒有.NET所宣傳的"屬性"。我們可以在javadoc注釋中放入特殊@標簽,讓一個Doclet的工具來尋找這些標簽,讓后根據(jù)bean給的信息集合來生成合適的XML描述和接口。XDoclet以EJBDoclet觀念為基礎,并且把此框架擴展在EJB領域之外,現(xiàn)在你可以生成Web Services,Web Applicaiton的描述,甚至通過擴展來滿足你個人的需要。 @標簽有一個標準的格式:一個“命名空間(namespace)”和一個屬于命名空間的“標簽名稱(tagname)",然后是經由 name="value"的屬性傳遞給標簽。 下面是一個通用的示例: /** * @namespace:tag name="value" name2="value2" ... */ 當前的命名空間有: ejb:標準EJB信息(不包括特定廠商) jboss:關于Jboss應用服務器的特定信息 weblogic:關于BEA‘s Weblogic 應用服務器的特定信息 wegSphere:關于IBM‘s WebSphere 應用服務器的特定信息 orion:關于Orion應用服務器(Oracle)的特定信息 castor:根據(jù)Castor框架生成相關的映射信息 mvcsoft:根據(jù)MVCSoft EJB2.0的持久管理器生成相關的文件 soap:生成SOAP描述 structs:根據(jù)FORM和Action生成structs-config.xml web:根據(jù)Web Application生成web.xml配置 jsp:生成tld信息 正如你看到的,除了EJB還支持很多其他的框架,所有EJBDoclet改名成XDoclet.(譯者:當然了,現(xiàn)在支持的框架更多了,包括近來流行的spring,hibernate等,具體參考官方網站 http://xdoclet.) 會話Bean:通過使用特殊的Javadoc標簽創(chuàng)建一個會話Bean
既然我們已經談論了XDoclet,現(xiàn)在讓我們來一個真實的示例吧。我們將以一個會話EJB開始。這個EJB是Xbeans框架的一部分,但是在這里,我們并不關心它是做什么的。我們僅僅關心怎樣通過Javadoc標簽把這個bean類標記出來,然后使用XDoclet來生成我們的元文件(meta files). ReceiverBean.java將包含方法:documentReady(Document doc).在這個XBean鏈表中,此方法使用一個DOM文檔(document)參數(shù),并且把它傳遞給下一個XBean。 類級別標簽的定義 在類級別中,我們需要定義: 1。這是一個無狀態(tài)的會話bean. 2。JNDI的名稱 3。環(huán)境實體 4。廠商的特定信息(Weblogic pooling信息) 標簽:@ejb:bean
在這個標簽中,唯一要設置的XDoclet屬性是bean的名稱。我們還將定義bean的類型,綁定到客戶樁的JNDI名稱以及顯示名稱: /** * This is the EJB Receiver Xbean * * @ejb:bean type="Stateless" * name="ejbReceiver" * jndi-name="org.xbeans.ejb.receiver.Receiver" * display-name="EJB Receiver Xbean" * * ... other javadoc tags ... */ public class ReceiverBean implements SessionBean, DOMSource {
ejb:bean最常用的屬性是: name:EJB的名稱(在描述中使用) type:定義bean的”類型“,對會話bean,是Stateful或Stateless,對實體bean是CMP或BMP jndi-name:JNDI名稱將在特定廠商的部署描述中使用(對遠程接口來說) local-jndi-name:和jndi-name相似,除了給本地接口使用外。 view-type:說明bean將支持的"接口視圖(views)",可以是remote,local或者both. 至于全部標簽,可以查看XDoclet文檔了解全部選項。
標簽:@ejb:env-entry 這個標簽定義一個經由特殊的java:comp/env上下文,被配置在JNDI的環(huán)境實體.我們將定義一個環(huán)境實體,在此實體中bean將在鏈表中尋找下一個Xbean. /** * This is the EJB Receiver Xbean * * ... other javadoc tags ... * * @ejb:env-entry name="channelBean" type="java.lang.String" * value="com.your.ChannelBean" * * ... other javadoc tags ... */ public class ReceiverBean implements SessionBean, DOMSource { 標簽:@weblogic:pool 現(xiàn)在我們將使用Weblogic的參數(shù)來配置特定廠商的池特征。為了表示我們在使用特定廠商,我么使用了weblogic命名空間: /** * This is the EJB Receiver Xbean * * ... other javadoc tags ... * * @weblogic:pool max-beans-in-free-pool="1000" * initial-beans-in-free-pool="10" * * ... other javadoc tags ... */ public class ReceiverBean implements SessionBean, DOMSource { 這個標簽將在weblogic的部署描述文件(weblogic-ejb-jar.xml)里配置池的參數(shù)。 當然了,在部署中,還可以使用許多其他類級別(class-level)的標簽。以下是經常被使用的標準標簽的一瞥: @ejb:bean 這是唯一要求必須的標簽,它用來配置bean的基本信息 @ejb:home 這個標簽提供了home接口的信息。你可以讓XDoclet去繼承一個自定義的接口,可以生成那種home接口(none,remote,local,or both),接口的package應該是什么,等等 @ejb:interface 和home標簽相似,除了可以配置相關接口的信息(遠程和/或本地)。 @ejb:finder 在實體beans的home接口中定義查找的方法 @ejb:select 在實體beans的home接口中定義選擇的方法 @ejb:pk 為實體bean定義主鍵。XDoclet能夠為你自動生成主鍵類。 @ejb:data-object 通過這個標簽,可以自動生成實體beans的數(shù)據(jù)對象。 @ejb:ejb-ref 配置EJB的引用 @ejb:ejb-external-ref 配置要引用在別的應用中的beans。在這里,你需要輸入象bean的類型,home/remote接口的類等 @ejb:resource-ref 配置資源引用。 @ejb:security-role-ref 配置安全角色引用 @ejb:transaction 為有事務行為的remote和home接口的所有方法定義事務類型。單獨方法的事務標簽可以覆蓋。 @ejb:permission 允許基于角色來調用remote和home接口的所有方法。 @ejb:security-identity 用來指定在執(zhí)行EJB的方法時,是否需要調用者的安全標識,或者是否需要一個特別的運行標識。 方法級別標簽的定義
如果我們想讓一個方法成為remote接口的一部分,那么只需要通過一個方法級別的標簽就可以了。示例如下: /** * The method that the sender uses to pass the Document * * @ejb:interface-method view-type="remote" */ public void documentReady(Document incomingDocument) { 這個標簽是必須。你將在bean類中完成這些方法,并且如果你希望讓客戶端也能夠訪問它,那么在你方法聲明處加入這個標簽。如果你想僅僅通過本地接口訪問,你只需要簡單把view-type值修改成為"local"就可以了。 以下是其他一些EJB方法級別的標簽: @ejb:relation 定義了EJB2.0 CMP實體bean之間的關系 @ejb:home-method 將方法定義為ejbHome*的方法 @ejb:persistent-field 在生成的CMP層類型(layer of type)中創(chuàng)建CMP的字段"X",并且具體實現(xiàn)getX/setX方法。 對于BMP來說,它將生成保持臟標志(dirty flag)的getX/setX方法(以方便ejbStore在需要的時候調用) @ejb:pk-field 標志主鍵字段 @ejb:transaction 給方法定義事務的行為(只能是以下有效屬性:NotSupported|Supports|Required|RequiresNew|Mandatory|Never. @ejb:permission 定義方法的權限(以逗號分隔的角色列表將被允許訪問這個方法)。
使用XDoclet來構建Bean 現(xiàn)在我們已經有一個使用XDoclet做了標記的ReceiverBean.java的源文件?,F(xiàn)在需要運行XDoclet來為生成所有我們需要的。更好的方法是使用Jakarta-Ant來構建系統(tǒng)。 Ant是一個基于java的普遍使用的構建系統(tǒng)。如果你還沒有使用Ant,那么就到Jakarta官方網站下載一個,或者參考Open Source Java:Ant XDoclet的團體已經開發(fā)好了Ant任務(task),所以我們只需要簡單加入到構建文件(build.xml)中就可以使用了. 主要有兩個任務:和.既然我們在使用EJB,那就讓我們在構建文件中仔細的研究一下ejbdoclet目標(target詳細請參考Ant文檔)。
classname="xdoclet.ejb.EjbDocletTask" classpath="${java.class.path};${xdoclet.jar.path}; ${log4j.jar.path};${ant.jar.path}"/> sourcepath="${java.dir}" destdir="${generated.java.dir}" ejbspec="2.0">
version="2.4" xmlencoding="UTF-8" />
|