Java控件設計入門
為什么需要控件(Controls)
企業資源訪問是企業應用開發過程中的重要內容,然而企業資源的多樣性對于軟件開發者而言是個大難題。盡管J2EE標準中對于眾多資源的訪問接口進行了定義,然而對于軟件開發者而言,這些接口仍然是太多了。我們簡單的描述一下這個問題,首先看一下J2EE1.4的架構圖。

圖1J2EE 1.4架構
上面這張圖是J2EE 1.4標準中的J2EE架構圖,從這張圖上我們可以看到,J2EE標準中提供了豐富的組件、協議和系統服務滿足企業的需求,比如EJB、JMS、JDBC、Web Services、JavaMail等等,方便企業根據不同的需求通過組合調用這些組件、協議和系統服務來建設企業的業務系統,然而企業本身業務隨著市場的變化在不停的調整,不同時期、不同市場環境下的不同需求導致企業內部業務系統建設的極度不均衡,不同的數據庫、不同的J2EE應用中間件、不同的架構設計導致企業應用開發的復雜度成倍增加。
舉個簡單的例子,讓我們來看看如果要使用這些技術開發一個企業級系統,開發者需要完成的工作:
在一個企業級應用系統中,業務邏輯通常會被封裝成EJB,開發者需要通過JNDI來訪問EJB中的業務邏輯;異步的消息傳遞通常會使用JMS服務器,開發者需要通過調用服務器支持的隊列或者主題來完成消息發送和接收;更多的情況下,開發者需要通過JDBC來訪問企業數據庫,完成相關數據的持久化工作,下面我們簡單的看看訪問這些資源所需要編寫的代碼片斷。
訪問一個EJB需要完成的代碼
這些只是J2EE標準中不到四分之一服務的客戶端調用代碼片斷,從中我們可以發現每種企業資源的訪問方式和API都不相同,而且每一種調用代碼的編寫都不是一件非常輕松的事情,而J2EE中還提供了更多的企業資源接訪問接口方式如Web Services,JavaMail等,對于開發者而言,要完全掌握J2EE1.4客戶端調用代碼對每一個開發者而言都不是一件輕松的事情。
控件(Controls)架構為解決這個難題提供了行之有效的方法。在控件(Controls)架構中,我們使用Java控件(Control)對資源訪問進行封裝,隱藏資源訪問細節。開發者只需要繼承這些Java控件(Control),而后提供自己的業務方法,使用Java控件(Control)中提供的特定注釋(Annotation)來注釋這些業務方法,就可以完成企業資源的訪問工作。這種方式不但快捷高效,而且對于資源訪問者而言,他始終采用同一接口去調用不同的資源,根本不需要去了解資源訪問的細節。
Beehive和控件(Controls)
Beehive目前是Apache軟件基金會的開放源代碼軟件項目,基于Apache License Version 2.0發布,旨在為基于J2EE和SOA的應用程序發布一個跨容器的、易于使用的編程模型和應用程序框架。
控件(Controls)是Beehive的重要組成部分,用于協助軟件開發者基于注釋機制快速訪問企業資源訪問,簡化J2EE應用開發復雜度,同時保證軟件的可配置性。
Beehive的另外一個重要部分是NETUI,用于為Web應用開發提供MVC框架和簡單易用的標簽庫。
關于Beehive的更多知識請訪問參考資源部分提供的鏈接。
控件架構
控件架構由企業資源訪問客戶端、Java控件和企業資源三大主要部分組成,圖2顯示了控件運行時架構和架構中所有組成部分之間的相互關系。

圖2 控件架構
一個Java控件由一個公共接口、控件實現類和為控件實現類提供輔助功能的控件屬性訪問包裝器類組成,他們互相協作,共同完成企業資源訪問的封裝。
他們三者之間的關系如 圖3所示。

圖3 控件組成部分及相互關系
公共接口、控件實現類由開發者提供,而控件屬性包裝器類則是由編譯工具根據公共接口、控件實現類自動生成的。
下面的圖4描述了控件組成部分完成控件框架(見圖2)支持功能時各部分的具體工作。

圖4 控件組成部分工作圖
第一個例子—Hello World!
下面我們通過一個簡單的Hello World!的例子來介紹如何開發一個具備基本功能的控件。這個控件的唯一作用是提供名為“getHelloString”的業務接口,當開發者調用該接口時返回“Hello World!”字符串。
在開始開發工作之前,我們必須安裝一些必需的軟件。
現在我們開始創建HelloWorld!例子。在C:/創建目錄”HelloWorld” (下面的例子中將使用%HELLOWORLD_HOME%引用這個目錄)。
創建控件接口(HelloWorldControl.java),它的全部源代碼見清單1。
清單1 srcorgvivianjeehiventrolsxamplesHelloWorldControl.java
HelloWorldControl接口聲明了一個業務方法getHelloString,它接收傳入的String類型參數,返回內容也是String類型。這段代碼中唯一讓人困惑的是第5行的。是控件(Controls)架構中提供的注釋,在接口聲明前面使用注釋表明接下來定義的這個接口是一個Java控件的公共接口。
接下來我們要創建控件實現類(HelloWorlControlImpl.java),它的全部代碼見清單2。
清單2 srcorgvivianjeehiventrolsxamplesHelloWorlControlImpl.java
HelloWorldControlImpl類繼承了控件公共接口HelloWorldControl(參見清單1),提供了getHelloString方法的具體實現。在代碼的第5行出現了@ ControlImplementation。@ ControlImplementation注釋是控件(Controls)架構中提供的注釋,在類聲明前面使用ControlImplementation表明接下來定義的這個類是一個Java控件的接口實現類。
編譯控件
下面的步驟是Windows平臺下編譯控件的主要步驟。
C:HelloWorld> set path=%JAVA_HOME%/bin;%ANT_HOME%/bin使用JUnit測試控件
JUnit是最常用的Java單元測試框架,為了測試新創建的控件,我們建立一個JUnit TestCase來測試它。在開發TestCase之前,我們需要準備些軟件。
本文所帶例子HelloWorld.zip中的lib目錄下也可以找到。
現在我們來創建控件的測試類(HelloWorldControlTest),它的全部代碼見清單5。
清單5 testorgvivianjeehiventrolsxamplesNittestHelloWorldControlTest.java
下面的步驟是Windows平臺下編譯控件測試代碼的主要步驟。
C:HelloWorld> ant run_tests
測試類成功執行后,命令行窗口中的顯示內容如圖5所示。

圖5 控件測試類執行效果
實例簡單分析
從上面的例子中,我們可以看到,除了控件變量聲明比較特殊之外,其他的并沒有什么差異。我們來簡單的分析一下控件變量聲明和實例化過程。
15.
16.public HelloWorldControlBean _bean;
上面這兩行代碼是Junit單元測試中用于實例化控件的代碼。
15行中的是控件架構中提供的注釋,表明接下來的這行變量聲明是控件變量的聲明。
16行中,我們聲明了一個變量,他的類型是HelloWorldControlBean。請注意,我們開發例子時創建的公共接口是HelloWorldControl,接口實現類是HelloWorlControlImpl。那么HelloWorldControlBean是什么?又是從哪里來的呢?答案是HelloWorldControlBean是“HelloWorld!”例子中控件的屬性包裝器類,它是控件編譯過程中自動生成的,自動命名規則是“%控件公共接口名稱%”+”Bean”。
所有控件都可以直接使用類似的代碼、聲明式實例化方式進行實例化,控件架構在控件調用時自動生成被注釋控件的實例。
結束語
J2EE架構中提供超過10種、可用于實際應用開發環境的技術和資源如EJB、WebServices等,雖然這些技術和資源能夠為我們提供更加廣泛的選擇范圍,然而要學會如何使用客戶端去訪問這些不同形式的技術卻成為開發者的難題。
控件(Controls)架構為解決這個難題提供了一種可行的方式。在控件架構中,我們使用控件(Control)來封裝企業資源訪問的具體細節,為開發者提供統一的訪問方式。
本文中首先簡單的介紹了控件的基本原理,然后通過”Hello World!”的例子演示了開發、測試控件的基本步驟。當然,這個簡單的例子還不足以體現控件架構的巨大威力。想了解更多的關于控件的知識,請關注作者后續的文章。
企業資源訪問是企業應用開發過程中的重要內容,然而企業資源的多樣性對于軟件開發者而言是個大難題。盡管J2EE標準中對于眾多資源的訪問接口進行了定義,然而對于軟件開發者而言,這些接口仍然是太多了。我們簡單的描述一下這個問題,首先看一下J2EE1.4的架構圖。

圖1J2EE 1.4架構
上面這張圖是J2EE 1.4標準中的J2EE架構圖,從這張圖上我們可以看到,J2EE標準中提供了豐富的組件、協議和系統服務滿足企業的需求,比如EJB、JMS、JDBC、Web Services、JavaMail等等,方便企業根據不同的需求通過組合調用這些組件、協議和系統服務來建設企業的業務系統,然而企業本身業務隨著市場的變化在不停的調整,不同時期、不同市場環境下的不同需求導致企業內部業務系統建設的極度不均衡,不同的數據庫、不同的J2EE應用中間件、不同的架構設計導致企業應用開發的復雜度成倍增加。
舉個簡單的例子,讓我們來看看如果要使用這些技術開發一個企業級系統,開發者需要完成的工作:
在一個企業級應用系統中,業務邏輯通常會被封裝成EJB,開發者需要通過JNDI來訪問EJB中的業務邏輯;異步的消息傳遞通常會使用JMS服務器,開發者需要通過調用服務器支持的隊列或者主題來完成消息發送和接收;更多的情況下,開發者需要通過JDBC來訪問企業數據庫,完成相關數據的持久化工作,下面我們簡單的看看訪問這些資源所需要編寫的代碼片斷。
訪問一個EJB需要完成的代碼
1. //初始化EJB訪問上下文 2. Context context = new InitialContext(); 3. //查找jndiName對應的EJB調用入口 4. Object o = ctx.lookup(“jndiName”); 5. //生成EJB訪問的home接口 6. XXXHome home = (XXXHome) javax.rmi.PortableRemoteObject 7. .narrow(o,XXXHome.class); 8. //創建EJB對象 9. XXX xxx = home.create(); 10. //完成相關業務方法調用 11. … 12. //EJB使用完畢,清除EJB對象 13. xxx.remove();訪問JDBC數據源要完成的代碼
1. //加載數據庫驅動 2. Class.forName(“driver_name_of_jdbc_driver”); 3. //通過DriverManager獲取數據庫連接 4. Connection conn = DriverManager 5. .getConnection(jdbcUrl,userName,password); 6. //創建Statement對象 7. Statement stmt = conn.createStatement(); 8. //完成相關數據的訪問 9. … 10. //關閉Statement對象 11. stmt.close(); 12. //關閉數據庫連接 13. conn.close();訪問JMS需要完成的部分代碼
1. //初始化EJB訪問上下文 2. Context context = new InitialContext(); 3. //通過JNDI查詢連接工廠 4. TopicConnectionFactory factory = (TopicConnectionFactory) ctx 5. .lookup(“weblogic.jws.jms. TopicConnectionFactory”); 6. //使用連接工廠創建JMS連接 7. TopicConnection conn = factory.createTopicConnection(); 8. //創建JMS會話 9. TopicSession session = connection 10. .createTopicSession(false,Session.AUTO_ACKNOWLEDGE); 11. //通過jndiName查找目的地(主題) 12. Topic topic = (Topic) ctx.lookup(“jndiName”); 13. //創建消息發生者 14. TopicPublisher publisher = session.createPublisher(topic); 15. //創建要發送的文本消息 16. TextMessage message = session.createTextMessage(); 17. message.setText(“Hello World!”); 18. //發送文本消息 19. publisher.publish(message);
這些只是J2EE標準中不到四分之一服務的客戶端調用代碼片斷,從中我們可以發現每種企業資源的訪問方式和API都不相同,而且每一種調用代碼的編寫都不是一件非常輕松的事情,而J2EE中還提供了更多的企業資源接訪問接口方式如Web Services,JavaMail等,對于開發者而言,要完全掌握J2EE1.4客戶端調用代碼對每一個開發者而言都不是一件輕松的事情。
控件(Controls)架構為解決這個難題提供了行之有效的方法。在控件(Controls)架構中,我們使用Java控件(Control)對資源訪問進行封裝,隱藏資源訪問細節。開發者只需要繼承這些Java控件(Control),而后提供自己的業務方法,使用Java控件(Control)中提供的特定注釋(Annotation)來注釋這些業務方法,就可以完成企業資源的訪問工作。這種方式不但快捷高效,而且對于資源訪問者而言,他始終采用同一接口去調用不同的資源,根本不需要去了解資源訪問的細節。
Beehive和控件(Controls)
Beehive目前是Apache軟件基金會的開放源代碼軟件項目,基于Apache License Version 2.0發布,旨在為基于J2EE和SOA的應用程序發布一個跨容器的、易于使用的編程模型和應用程序框架。
控件(Controls)是Beehive的重要組成部分,用于協助軟件開發者基于注釋機制快速訪問企業資源訪問,簡化J2EE應用開發復雜度,同時保證軟件的可配置性。
Beehive的另外一個重要部分是NETUI,用于為Web應用開發提供MVC框架和簡單易用的標簽庫。
關于Beehive的更多知識請訪問參考資源部分提供的鏈接。
控件架構
控件架構由企業資源訪問客戶端、Java控件和企業資源三大主要部分組成,圖2顯示了控件運行時架構和架構中所有組成部分之間的相互關系。

圖2 控件架構
- 資源訪問客戶端指需要訪問企業資源的一段Java代碼,他和支持其調用的Java控件處在同一個Java虛擬機中,資源訪問客戶端采用本地Java方法調用控件支持的業務方法。
- 企業資源根據不同企業的不同環境,可能和資源訪問客戶端處在同一個Java虛擬機中,也可能位于一個單獨的Java虛擬機中。
- Java控件為資源訪問客戶端提供企業資源訪問接口和屬性訪問接口,方便資源訪問客戶端控制Java控件的相關屬性,同時負責通過相對固定的方式訪問企業資源。
- 資源訪問端可以通過Java控件提供的接口直接訪問企業資源中的數據,或者通過向Java控件注冊的事件進行觸發。
- 資源訪問時可以使用JSR-175標準中規定的元數據來定義控件實例、類或者方法所需要的參數,也可以使用其他方式(比如配置描述符文件)來提供這些參數,控件框架中提供了獨立的配置模型實現配置參數和控件的綁定,可能需要配置的參數包括JNDI名稱、資源訪問協議、消息格式等經常需要變化的參數。
- Java控件本身通過資源訪問代理訪問企業資源,資源訪問代理可能是EJB home接口、JMS連接和會話、web服務訪問代理等,控件負責這些代理的創建和生命周期管理。控件根據不同的資源類型自動選擇通過本地方法或者遠程調用實現企業資源訪問。
一個Java控件由一個公共接口、控件實現類和為控件實現類提供輔助功能的控件屬性訪問包裝器類組成,他們互相協作,共同完成企業資源訪問的封裝。
- 公共接口
公共接口定義了控件和資源訪問客戶端之間的交互行為,包括業務接口和事件。 - 控件實現類
控件實現類提供公共接口的具體實現,包括了企業資源訪問接口的創建、狀態管理、接口調用。 - 控件屬性包裝器類
他們三者之間的關系如 圖3所示。

圖3 控件組成部分及相互關系
公共接口、控件實現類由開發者提供,而控件屬性包裝器類則是由編譯工具根據公共接口、控件實現類自動生成的。
下面的圖4描述了控件組成部分完成控件框架(見圖2)支持功能時各部分的具體工作。

圖4 控件組成部分工作圖
第一個例子—Hello World!
下面我們通過一個簡單的Hello World!的例子來介紹如何開發一個具備基本功能的控件。這個控件的唯一作用是提供名為“getHelloString”的業務接口,當開發者調用該接口時返回“Hello World!”字符串。
在開始開發工作之前,我們必須安裝一些必需的軟件。
- 下載、安裝JDK5.0或者以上版本
JDK5.X是Java開發包的最新版本,請訪問java.sun.com網站上下載安裝版本,下載后安裝到C:/jdk目錄下,文章的后續內容中將使用%JAVA_HOME%變量來引用這個目錄。 - 下載、安裝Beehive1.0
現在我們開始創建HelloWorld!例子。在C:/創建目錄”HelloWorld” (下面的例子中將使用%HELLOWORLD_HOME%引用這個目錄)。
創建控件接口(HelloWorldControl.java),它的全部源代碼見清單1。
清單1 srcorgvivianjeehiventrolsxamplesHelloWorldControl.java
1. package org.vivianj.beehive.controls.examples; 2. 3. import org.apache.beehive.controls.api.bean.ControlInterface; 4. 5. 6. public interface HelloWorldControl { 7. /* 聲明需要封裝的業務方法getHelloString */ 8. public String getHelloString(String dest); 9. } HelloWorldControl接口聲明了一個業務方法getHelloString,它接收傳入的String類型參數,返回內容也是String類型。這段代碼中唯一讓人困惑的是第5行的。是控件(Controls)架構中提供的注釋,在接口聲明前面使用注釋表明接下來定義的這個接口是一個Java控件的公共接口。
接下來我們要創建控件實現類(HelloWorlControlImpl.java),它的全部代碼見清單2。
清單2 srcorgvivianjeehiventrolsxamplesHelloWorlControlImpl.java
1. package org.vivianj.beehive.controls.examples; 2. 3. import org.apache.beehive.controls.api.bean.ControlImplementation; 4. 5. 6. public class HelloWorldControlImpl 7. implements HelloWorldControl,java.io.Serializable { 8. 9. /* 實現接口中聲明的業務方法getHelloString */ 10. public String getHelloString(String dest) { 11. return “Hello World!”; 12. } 13. } HelloWorldControlImpl類繼承了控件公共接口HelloWorldControl(參見清單1),提供了getHelloString方法的具體實現。在代碼的第5行出現了@ ControlImplementation。@ ControlImplementation注釋是控件(Controls)架構中提供的注釋,在類聲明前面使用ControlImplementation表明接下來定義的這個類是一個Java控件的接口實現類。
編譯控件
下面的步驟是Windows平臺下編譯控件的主要步驟。
- 在%HELLOWORLD_HOME%目錄下創建build.properties文件。文件內容如清單3。
清單3 build.properties
#請將beehive.home的屬性修改為您安裝Beehive的目錄
beehive.home=c:/beehive - 在%HELLOWORLD_HOME%目錄下創建build.xml文件,文件內容如清單4。
清單4 build.xml1. <project name="controls-blank" default="usage" basedir="."> 2. 3. <property environment="os"/> 4. <property file="build.properties"/> 5. <import file="/beehive-imports.xml"/> 6. <import file="/ant/beehive-tools.xml"/> 7. 8. <property name="source.dir" location="/src"/> 9. <property name="build.dir" location="/build"/> 10. <property name="build.classes" location="/classes"/> 11. <property name="build.beansrc" location="/beansrc"/> 12. <property name="build.jar" value="mycontrols.jar"/> 13. 14. <path id="build.classpath"> 15. <pathelement path=""/> 16. <path refid="controls.dependency.path"/> 17. </path> 18. 19. <target name="clean" description="Delete all generated files"> 20. <delete dir=""/> 21. <delete file="velocity.log"/> 22. </target> 23. 24. <target name="build" description="Build control sources"> 25. <mkdir dir=""/> 26. <mkdir dir=""/> 27. 28. <build-controls srcdir="" 29. destdir="" 30. tempdir="" 31. classpathref="build.classpath"/> 32. 33. <control-jar destfile="/" basedir="" /> 34. </target> 35. 36. <target name="usage" description="Print the usage for this build.xml"> 37. <echo message=""/> 38. <echo message=""/> 39. <echo message="Controls Project Build file"/> 40. <echo message=""/> 41. <echo message=""/> 42. <echo message="----------------------------------------------------------------"/> 43. <echo message="| Standard Targets |"/> 44. <echo message="----------------------------------------------------------------"/> 45. <echo message="clean - Delete all generated files"/> 46. <echo message="build - Build control source files"/> 47. <echo message="----------------------------------------------------------------"/> 48. </target> 49. 50. </project>
- 調整系統環境變量
打開命令行界面,進入%HELLOWORLD_HOME%目錄,將%JAVA_HOME%/bin目錄和%ANT_HOME%/bin目錄加入到PATH環境中。隨后調用build.xml中提供的build任務可以完成整個Web應用的編譯工作。
在windows環境下編譯時使用的命令如下,在其他環境下運行編譯命令請參考不同操作系統的幫助文檔進行修改。- 設置環境變量
C:HelloWorld> set path=%JAVA_HOME%/bin;%ANT_HOME%/bin
命令行中的%JAVA_HOME%指的是JDK的安裝目錄,%ANT_HOME%指的是ANT的安裝目錄,請根據您的環境替換它們的內容。 - 運行編譯任務
C:HelloWorld> set path=%JAVA_HOME%/bin;%ANT_HOME%/bin使用JUnit測試控件
JUnit是最常用的Java單元測試框架,為了測試新創建的控件,我們建立一個JUnit TestCase來測試它。在開發TestCase之前,我們需要準備些軟件。
- 下載、安裝Junit3.8.2
請訪問www.junit.org下載JUnit3.8.2版本,將下載的zip文件解壓縮到C:/junit目錄下。
本文中的所有講述均針對JUnit3.8.2版本,由于Junit4.X版本了的開發方式和JUnit3.8.2版本存在差異,如果您選擇下載JUnit4.X版本,請根據實際情況進行調整。 - 安裝BeehiveForJUnit.jar
本文所帶例子HelloWorld.zip中的lib目錄下也可以找到。
現在我們來創建控件的測試類(HelloWorldControlTest),它的全部代碼見清單5。
清單5 testorgvivianjeehiventrolsxamplesNittestHelloWorldControlTest.java
1. package org.vivianj.beehive.controls.examples.unittest; 2. 3. import junit.framework.TestCase; 4. 5. import org.apache.beehive.controls.api.bean.Control; 6. import org.apache.beehive.test.tools.milton.junit.MiltonTestCase; 7. import org.vivianj.beehive.controls.examples.HelloWorldControlBean; 8. 9. /** 10. * HelloWorldControlTest用于 11. */ 12. public class HelloWorldControlTest extends MiltonTestCase { 13. 14. /* 使用聲明是實例化方式創建控件實例 */ 15. 16. public HelloWorldControlBean _bean; 17. 18. /* 必須創建構造器,否則控件調用時無法獲取上下文環境 */ 19. public HelloWorldControlTest(String name) throws Exception 20. { 21. super(name); 22. } 23. 24. public void testGetHelloString() { 25. /* 調用HelloWorldControl控件的業務方法,獲取返回字符串 */ 26. String s = _bean.getHelloString("World"); 27. 28. /* 使用JUnit的比對語句完成期望結果和控件調用返回結果值的比對 */ 29. assertEquals(s, "Hello World!"); 30. } 31. 32. public static void main(String[] args){ 33. junit.textui.TestRunner.run(HelloWorldControlTest.class); 34. } 35. } 下面的步驟是Windows平臺下編譯控件測試代碼的主要步驟。
- 修改%HELLOWORLD_HOME%目錄下的build.properties文件。修改后的文件內容如清單6。
清單6 build.properties1. # 請將beehive.home的屬性修改為您安裝Beehive的目錄 2. beehive.home=E:/MasteringBeehive/apache-beehive-1.0.1 3. 4. # 請將junit.home的屬性修改為您安裝junit的目錄 5. junit.home=F:/OpenSource/junit3.8.2
- 修改%HELLOWORLD_HOME%目錄的build.xml文件。
增加新的path元素” test.classpath”,增加新的任務”build_tests”和”run_tests”。修改后的文件內容如清單7。
清單7 build.xml1. <project name="controls_helloworld" default="usage" basedir="."> 2. 3. <property environment="os" /> 4. <property file="build.properties" /> 5. <import file="/beehive-imports.xml" /> 6. <import file="/ant/beehive-tools.xml" /> 7. 8. <property name="source.dir" location="/src" /> 9. <property name="test.source.dir" location="/test" /> 10. <property name="build.dir" location="/build" /> 11. <property name="build.classes" location="/bin" /> 12. <property name="build.beansrc" location="/beansrc" /> 13. <property name="build.jar" value="mycontrols.jar" /> 14. 15. <path id="build.classpath"> 16. <pathelement path="" /> 17. <path refid="controls.dependency.path" /> 18. </path> 19. 20. <path id="test.classpath"> 21. <pathelement path="./build/mycontrols.jar" /> 22. <pathelement path="/junit.jar" /> 23. <pathelement path="./lib/BeehiveForJUnit.jar" /> 24. <fileset dir="/lib/common"> 25. <include name="**/*.jar"/> 26. </fileset> 27. <path refid="build.classpath" /> 28. </path> 29. 30. <target name="clean" description="Delete all generated files"> 31. <delete dir="" /> 32. <delete dir="" /> 33. <delete file="velocity.log" /> 34. </target> 35. 36. <target name="build" description="Build control sources"> 37. <mkdir dir="" /> 38. <mkdir dir="" /> 39. 40. <build-controls srcdir="" destdir="" tempdir="" classpathref="build.classpath" /> 41. 42. <control-jar destfile="/" basedir="" /> 43. </target> 44. 45. <target name="build_tests" description="Build control tests"> 46. <mkdir dir="" /> 47. <mkdir dir="" /> 48. 49. <build-controls srcdir="" destdir="" tempdir="" classpathref="test.classpath" /> 50. </target> 51. 52. <target name="run_tests" description="Run control tests"> 53. <java classname="org.vivianj.beehive.controls.examples.unittest.HelloWorldControlTest" classpathref="test.classpath" /> 54. </target> 55. 56. <target name="usage" description="Print the usage for this build.xml"> 57. <echo message="" /> 58. <echo message="" /> 59. <echo message="Controls Project Template Build file" /> 60. <echo message="" /> 61. <echo message="" /> 62. <echo message="----------------------------------------------------------------" /> 63. <echo message="| Standard Targets |" /> 64. <echo message="----------------------------------------------------------------" /> 65. <echo message="clean - Delete all generated files" /> 66. <echo message="build - Build control sources" /> 67. <echo message="build_tests - Build control tests" /> 68. <echo message="run_tests - Runs control tests" /> 69. <echo message="----------------------------------------------------------------" /> 70. </target> 71. 72. </project>
- 編譯控件測試類
我們可以在命令行中進入%HELLOWORLD_HOME%目錄下,設置系統環境后運行下面的腳本編譯新創建的測試類。
C:HelloWorld> ant build_tests - 運行測試類
C:HelloWorld> ant run_tests
測試類成功執行后,命令行窗口中的顯示內容如圖5所示。

圖5 控件測試類執行效果
實例簡單分析
從上面的例子中,我們可以看到,除了控件變量聲明比較特殊之外,其他的并沒有什么差異。我們來簡單的分析一下控件變量聲明和實例化過程。
15.
16.public HelloWorldControlBean _bean;
上面這兩行代碼是Junit單元測試中用于實例化控件的代碼。
15行中的是控件架構中提供的注釋,表明接下來的這行變量聲明是控件變量的聲明。
16行中,我們聲明了一個變量,他的類型是HelloWorldControlBean。請注意,我們開發例子時創建的公共接口是HelloWorldControl,接口實現類是HelloWorlControlImpl。那么HelloWorldControlBean是什么?又是從哪里來的呢?答案是HelloWorldControlBean是“HelloWorld!”例子中控件的屬性包裝器類,它是控件編譯過程中自動生成的,自動命名規則是“%控件公共接口名稱%”+”Bean”。
所有控件都可以直接使用類似的代碼、聲明式實例化方式進行實例化,控件架構在控件調用時自動生成被注釋控件的實例。
結束語
J2EE架構中提供超過10種、可用于實際應用開發環境的技術和資源如EJB、WebServices等,雖然這些技術和資源能夠為我們提供更加廣泛的選擇范圍,然而要學會如何使用客戶端去訪問這些不同形式的技術卻成為開發者的難題。
控件(Controls)架構為解決這個難題提供了一種可行的方式。在控件架構中,我們使用控件(Control)來封裝企業資源訪問的具體細節,為開發者提供統一的訪問方式。
本文中首先簡單的介紹了控件的基本原理,然后通過”Hello World!”的例子演示了開發、測試控件的基本步驟。當然,這個簡單的例子還不足以體現控件架構的巨大威力。想了解更多的關于控件的知識,請關注作者后續的文章。