你開發(fā)過EJB么,?當(dāng)你去創(chuàng)建和操作EJB的XML部署描述以及接口時,,是否受過挫折呢?我當(dāng)然有過,。 我近來正在用EJB開發(fā)一個叫Xbeans的開源項目,,并且決定使用另外一個開源工具 -- XDoclet -- 來生成XML描述和EJB接口. 使用XDoclet可以讓你在J2EE框架內(nèi)更高效的工作。你將有一個更簡單的beans之間的視圖和關(guān)系,, 并且可以去除很多你在開發(fā)中的煩惱,。 這篇文章將討論XDoclet,以及如何去使用和擴展它。在這里,,我們將創(chuàng)建一個使用javadoc標記(tag)的會話(Session)Bean,并且使用XDoclet運行它,。
什么是XDoclet? XDoclet是在Rickard Oberg創(chuàng)建的EJBDoclet基礎(chǔ)上演化過來的一個工具,。它的想法很簡單:通過bean類本身來查看整個組件,,而不是通過操作多個ejb文件。它是怎樣做到的呢,?java除了有javadoc標記外,,并沒有.NET所宣傳的"屬性"。我們可以在javadoc注釋中放入特殊@標簽,,讓一個Doclet的工具來尋找這些標簽,,讓后根據(jù)bean給的信息集合來生成合適的XML描述和接口。XDoclet以EJBDoclet觀念為基礎(chǔ),,并且把此框架擴展在EJB領(lǐng)域之外,,現(xiàn)在你可以生成Web Services,Web Applicaiton的描述,甚至通過擴展來滿足你個人的需要。 @標簽有一個標準的格式:一個“命名空間(namespace)”和一個屬于命名空間的“標簽名稱(tagname)",然后是經(jīng)由 name="value"的屬性傳遞給標簽,。 下面是一個通用的示例: /** * @namespace:tag name="value" name2="value2" ... */ 當(dāng)前的命名空間有: ejb:標準EJB信息(不包括特定廠商) jboss:關(guān)于Jboss應(yīng)用服務(wù)器的特定信息 weblogic:關(guān)于BEA‘s Weblogic 應(yīng)用服務(wù)器的特定信息 wegSphere:關(guān)于IBM‘s WebSphere 應(yīng)用服務(wù)器的特定信息 orion:關(guān)于Orion應(yīng)用服務(wù)器(Oracle)的特定信息 castor:根據(jù)Castor框架生成相關(guān)的映射信息 mvcsoft:根據(jù)MVCSoft EJB2.0的持久管理器生成相關(guān)的文件 soap:生成SOAP描述 structs:根據(jù)FORM和Action生成structs-config.xml web:根據(jù)Web Application生成web.xml配置 jsp:生成tld信息 正如你看到的,,除了EJB還支持很多其他的框架,所有EJBDoclet改名成XDoclet.(譯者:當(dāng)然了,,現(xiàn)在支持的框架更多了,,包括近來流行的spring,hibernate等,具體參考官方網(wǎng)站 http://xdoclet.) 會話Bean:通過使用特殊的Javadoc標簽創(chuàng)建一個會話Bean
既然我們已經(jīng)談?wù)摿薠Doclet,,現(xiàn)在讓我們來一個真實的示例吧,。我們將以一個會話EJB開始。這個EJB是Xbeans框架的一部分,,但是在這里,,我們并不關(guān)心它是做什么的。我們僅僅關(guān)心怎樣通過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
在這個標簽中,,唯一要設(shè)置的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 這個標簽定義一個經(jīng)由特殊的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ù),。 當(dāng)然了,在部署中,,還可以使用許多其他類級別(class-level)的標簽,。以下是經(jīng)常被使用的標準標簽的一瞥: @ejb:bean 這是唯一要求必須的標簽,,它用來配置bean的基本信息 @ejb:home 這個標簽提供了home接口的信息。你可以讓XDoclet去繼承一個自定義的接口,,可以生成那種home接口(none,remote,local,or both),接口的package應(yīng)該是什么,,等等 @ejb:interface 和home標簽相似,除了可以配置相關(guān)接口的信息(遠程和/或本地),。 @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 配置要引用在別的應(yīng)用中的beans。在這里,,你需要輸入象bean的類型,,home/remote接口的類等 @ejb:resource-ref 配置資源引用。 @ejb:security-role-ref 配置安全角色引用 @ejb:transaction 為有事務(wù)行為的remote和home接口的所有方法定義事務(wù)類型,。單獨方法的事務(wù)標簽可以覆蓋,。 @ejb:permission 允許基于角色來調(diào)用remote和home接口的所有方法。 @ejb:security-identity 用來指定在執(zhí)行EJB的方法時,,是否需要調(diào)用者的安全標識,,或者是否需要一個特別的運行標識。 方法級別標簽的定義
如果我們想讓一個方法成為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之間的關(guān)系 @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在需要的時候調(diào)用) @ejb:pk-field 標志主鍵字段 @ejb:transaction 給方法定義事務(wù)的行為(只能是以下有效屬性:NotSupported|Supports|Required|RequiresNew|Mandatory|Never. @ejb:permission 定義方法的權(quán)限(以逗號分隔的角色列表將被允許訪問這個方法)。
使用XDoclet來構(gòu)建Bean 現(xiàn)在我們已經(jīng)有一個使用XDoclet做了標記的ReceiverBean.java的源文件?,F(xiàn)在需要運行XDoclet來為生成所有我們需要的,。更好的方法是使用Jakarta-Ant來構(gòu)建系統(tǒng)。 Ant是一個基于java的普遍使用的構(gòu)建系統(tǒng),。如果你還沒有使用Ant,那么就到Jakarta官方網(wǎng)站下載一個,,或者參考Open Source Java:Ant XDoclet的團體已經(jīng)開發(fā)好了Ant任務(wù)(task),所以我們只需要簡單加入到構(gòu)建文件(build.xml)中就可以使用了. 主要有兩個任務(wù):和.既然我們在使用EJB,那就讓我們在構(gòu)建文件中仔細的研究一下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" />
|