劉 慶, 軟件工程師, IBM中國軟件開發(fā)中心 朱 志輝 ([email protected]), 軟件工程師, IBM 中國軟件開發(fā)中心
簡介: OSGi 作為新的事實工業(yè)標準正在各領域蓬勃發(fā)展起來,,而 Web 開發(fā)技術則早已作為軟件行業(yè)的主流技術被普遍使用著。傳統(tǒng)的 Web 開發(fā)人員如何將 Web 開發(fā)與 OSGi 技術結合起來從中獲益則是我們要關注的重點,。通過本教程的學習,您可以全面掌握使用 Equinox 框架進行 OSGi 環(huán)境下 Web 開發(fā)的兩種方式,。 本文的標簽: ajax, java_技術, javascript, jsp_(javaserver_pages)_technology, osgi, 應用集成, 技巧 OSGi 的本質(zhì)是將 Java 面向?qū)ο蟮拈_發(fā)轉向面向組件和服務的開發(fā)。OSGi 框架提供了一套完善的機制用于管理和控制組件(Bundle),、服務(Service)的生命周期,,以及組件和服務在其生命周期內(nèi)的交互。OSGi 在提出核心框架規(guī)范的同時為一些常用的服務如日志服務(LogService),,配置管理服務(ConfigAdmin),,事件管理服務(EventAdmin),,HTTP 服務(HTTPService)等提供了實現(xiàn),。 OSGi 框架在 2006 年之前還不為廣大的開發(fā)者所知,最初的 OSGi 標準主要應用于 J2ME 和 J2SE,。Equinox 項目是 Eclipse 開源組織提供的 OSGi 框架的實現(xiàn),。Equinox 的加入使得 OSGi 標準的應用領域不斷擴充, Equinox 不僅提供了大部分 OSGi 標準服務的 bundle 實現(xiàn),,還借助 Eclipse 環(huán)境的一些自身的特點,,提供了很多功能擴展服務。 Equinox 實現(xiàn)了 OSGi 在 J2ME,、J2SE 方面的應用的同時,,也推動了 OSGi 在 J2EE 方面的應用。Equinox 提供了一組基礎的 Bundle,,使得使用 JSP,、Servlet 和 Struts 等 J2EE 技術的 Web 應用項目可以運行于 EquinoxOSGi 環(huán)境中。同樣的, Equinox 通過一組 Bundle,,可以將 Equinox OSGi 應用嵌入到現(xiàn)有的 Web 服務器(如 Tomcat,,Jetty 等)和應用服務器(如 Websphere,Weblogic 等)中,。這就是我們使用 Equinox 進行 Web 開發(fā)的兩種方式,。 本文的內(nèi)容就是圍繞 Equinox 針對 OSGi 在 J2EE 領域的實現(xiàn)而展開的。我們將在本文中結合實例詳細的介紹如何應用 Equinox 框架將傳統(tǒng)的 Web 開發(fā)和 OSGi 技術更好的結合起來,。 工欲善其事,,必先利其器。開始前先讓我們來搭建我們的開發(fā)環(huán)境,,為了減少因為環(huán)境不一致而引起的問題,,建議讀者使用與本文相同的軟件版本: 下載并安裝 JDK( 本文使用版本為 Sun JDK 5) ; 下載并解壓 Eclipse( 本文使用版本為 Eclipse Ganymede J2EE SR2 版本 ); 下載并安裝 Tomcat( 本文使用版本為 Tomcat6.0.18); 我們的開發(fā)環(huán)境搭建相當簡單,,經(jīng)過上面三個步驟之后,,只需要在 Eclipse 首選項中將我們的 Tomcat 配置一下即可。 圖 1. 配置 Tocmat 接下來就讓我們看一下用 Equinox 框架進行 Web 開發(fā)的第一種方式,。 將 HTTP Server 置于 Equinox 框架中開發(fā) Web 應用 這種方式是一種完全的 OSGi 方式,,HTTP Server( 本例中為 Jetty) 作為一個 Bundle 運行在整個 Equinox 框架中。在這種開發(fā)方式下,,我們需要首先建立一個 Eclipse 插件項目:打開 Eclipse 的插件開發(fā)視圖,,新建一個插件項目。 圖 2. 在插件開發(fā)視圖中新建插件項目 我們?yōu)樾马椖棵麨?com.sample.web, 在項目屬性設置中,,我們將項目的運行 target 設置為 Equinox 圖 3. 為新項目設置屬性 在接下來的屬性設置中,,我們不要選擇創(chuàng)建 Activator,具體的原因我們將在文章的后續(xù)部分講到,。 圖 4. 不要為插件設定 Activator 剩余步驟中按照默認設置即可完成項目的創(chuàng)建工作,。這樣一個插件項目就創(chuàng)建完畢了。 然后我們在項目的根目錄下創(chuàng)建 WebRoot,,img 和 jsp 幾個文件夾分別用來放置普通資源文件 ( 例如圖片文件 ) 和 JSP 文件,。在 Java 源文件目錄下創(chuàng)建一個簡單的 Servlet: LoginServlet.java 現(xiàn)在,項目結構圖如下: 圖 5. 項目結構圖 這個時候大家會看到項目有編譯錯誤,,不要著急,。我們先來看一下我們的 servlet 中的內(nèi)容 : 清單 1:LoginServlet.java
這個例子雖然簡單,卻將傳統(tǒng) Web 開發(fā)方式中常用的場景,,比如 request, response 和 session 的使用都涵蓋其中了,。項目有編譯錯誤,是因為我們使用了 javax.servlet 包中的類,,所以我們點擊錯誤信息,,Eclipse 會自動幫助我們修改項目的 MANIFEST.MF 文件,,將需要的包添加到 Import-Package 中去。下面是我們項目中的 index.jsp 文件的內(nèi)容 清單 2:index.jsp 文件
到目前為止,,我們已經(jīng)把項目需要的各種準備工作做好了,,比如建立文件夾,建立相關 jsp 文件,,servlet 文件等,。但是此時的項目還是不能具備解析 http 請求,轉發(fā)到相應資源文件或 jsp 及 servlet 上的能力的,。為了使項目具備這個能力,,通常有向 httpservice 中注冊 servlet 以及使用擴展點兩種方法。本例中采用較為簡單并較為廣泛使用的擴展點方法,。 為了配置擴展點,,我們可以在項目的根目錄下手動建立一個 plugin.xml 或者打開 MANIFEST.MF 文件 , 在其 Overview 視圖標簽頁上找到擴展點設置區(qū)域,點擊 extensions 即可對其擴展點進行配置,。 圖 6. 配置擴展點 plugin.xml 文件的內(nèi)容如清單 3 所示,,我們在其中定義了兩個擴展點,一個用來處理對資源文件例如圖片文件等的請求,,另外一個用來處理 JSP 和 Servlet 的請求,。 清單 3:plugin.xml 文件
通過擴展點的配置,我們還需要對 MANIFEST.MF 文件進行相應的修改,,引入需要的 bundle 和 package,。最終的 MANIFEST.MF 文件如下 : 清單 4:MANIFEST.MF 文件
Ok, 到現(xiàn)在終于將所有的設置和所需文件都準備就緒,,看起來是時候來運行了,。別急,還有最后一項配置,。打開項目的運行配置窗口,,先反選所有的 target platform, 然后再點擊 Add Required Bundles 按鈕。這樣在運行時候 Eclipse 不會將所有的 bundle 都啟動,,而只選擇性的啟動我們在配置文件中配置的 bundle,。 圖 7. 運行配置窗口 當我們在 Eclipse 的控制臺中輸入 ss 命令,看到我們的 com.sample.web 這個 bundle 的狀態(tài)是 active 的時候,,我們就可以啟動瀏覽器來訪問我們的 Web 應用了,。 圖 8. OSGi 控制臺 各位讀者可以試著在你們的瀏覽器中輸入下面的 URL 看看有什么現(xiàn)象發(fā)生 , 并結合我們剛才的 plugin.xml 中擴展點的配置,思考一下他們的因果關系,。 http://localhost/images/1.jpg http://localhost/jsp/index.jsp http://localhost/servlet/myfirstservlet?userName=Levin 如果一切正常的話,,訪問 JSP,您將會看到類似圖 9 的運行界面,。 圖 9. JSP 運行圖 將 Equinox 置于 Servlet 容器中開發(fā) Web 應用 這種開發(fā)方式和剛才不同,,這種開發(fā)方式是將 Equinox 框架以及項目的 bundle 做成一個 War 文件部署到 Servlet 容器中,,和以前我們做普通的 Web 開發(fā)一樣,當做一個普通的 Web 應用運行,。在這種方式下,,使用了一種叫做 Servlet Bridge(Servlet 橋 ) 的技術,用戶對該 Web 應用的 http 請求被 servlet 容器轉發(fā)給該 Web 應用,,Equinox 框架運行在該 Web 應用中,,統(tǒng)一處理對于該應用的請求,并將請求轉發(fā)給對應的 bundle,。 采用這種方式開發(fā),,一般情況下首先需要到 Equinox 站點上 下載bridge.war 文件,這個文件是 2007 年 4 月的版本,。我們在前面創(chuàng)建工程的時候沒有讓大家選擇創(chuàng)建 activator, 原因就是在于 activator 引用的有些類在這個版本的 bridge.war 中不存在,。此外:在我們的 sample 項目中,需要支持 JSP,,所以需要幾個額外的 bundle,。為了大家的方便,我另外做了一個 bridge.war, 里面包含這些需要的 bundle,。大家可以直接源代碼下載部分 下載,。 下載該 war 文件成功后,將其導入到我們的 Eclipse 工作空間中來,。 接下來,,我們將剛才創(chuàng)建的 sample 項目導出為一個 bundle:打開我們的 sample 項目的 build.proerties 文件,將我們需要的 WebRoot 文件夾及其子文件夾以及 plugin.xml 都選中,。 圖 10. 修改 build 屬性 然后將我們的 sample 項目右鍵導出為一個 Deployable plug-ins and fragments 圖 11. 導出項目為 bundle 其他按照缺省設置即可,,這時候大家會看到 Eclipse 會在你指定的目錄下生成 plugins /com.sample.web_1.0.0.jar 文件,將該 jar 文件放到剛才導入的 bridge 項目的 plugins 文件夾下,。 圖 12. 工作空間示意圖 在這種方式下,,我們不需要去運行我們的 sample 項目 , 而是運行我們的 bridge 項目,選中 bridge 項目 , 右鍵 ->run as->run on server 將 bridge 項目運行到我們配置的 Tomcat 中去,。由于我們并沒有設置讓我們的 sample 項目默認自動啟動,,所以大家在此處需要啟動我們的 sample 項目的 bundle. 圖 13. 啟動 sample bundle 啟動完成后,大家來訪問一下如下的 URL,,看看有什么現(xiàn)象,。考慮一下在這種開發(fā)方式下,,同樣的 bundle,,URL 和剛才第一種方式下的有什么不同? http://localhost:8080/bridge/servlet/myfirstservlet?userName=Levin http://localhost:8080/bridge/jsp/index.jsp http://localhost:8080/bridge/images/1.jpg 如果一切正常的話,,在訪問 Servlet 的時候您將會看到類似下圖的運行效果,。Tocmat 的默認端口是 8080,,而圖 9 中的 Jetty 默認端口是 80。并且,,由于所有的 bundle 都是部署在 bridge 項目中,,所以訪問的 URL 也變成了以 http://localhost:8080/bridge/ 為基路徑了。 圖 14. Servlet 運行圖 在實際的開發(fā)過程中,,如果每次都需要將我們的項目導出為 jar 文件放置到 bridge 中,,開發(fā)效率是非常低下的。上述的步驟其實只適合在項目開發(fā)完成以后,,實際部署到服務器上的時候才需要,。在我們在開發(fā)過程中我們可以采取以下辦法來簡化開發(fā): 打開 bridge 項目的 WebContent/Web-INF/eclipse/configuration/config.ini 文件,在其 osgi.bundles 的配置中增加對我們 sample project 的引用,,例如: reference\:file\:D:/eclipse-jee-ganymede-SR2-win32/workspace/com.sample.web@start 這時如果我們選中 bridge 項目 , 右鍵 ->run as->run on server 將 bridge 項目運行到我們配置的 Tomcat 中去的話,,bridge 會根據(jù) config.ini 中的配置,自動將我們的 sample project 也當做一個 bundle 啟動,。 Bundle 間 Session 的數(shù)據(jù)共享 剛才我們通過學習,,可以發(fā)現(xiàn)不同的 Web 應用可以做成相對獨立的 bundle 部署在 OSGi 環(huán)境中同時運行并對外提供 Web 服務,那么這些 Web 應用的 bundle 之間能否共享 Session 中的數(shù)據(jù)呢,?如果可以共享 Session 數(shù)據(jù)的話,,又會給我們以后的開發(fā)工作帶來什么啟示呢?這些都是很有意思的話題,,有興趣的讀者可以在閱讀完本文后自己做一些實驗來一探究竟,。 我們知道很多 J2EE 框架,如 Struts, Spring MVC,,Echo 和 DWR 等,,其運行基礎很相似,都是基于 Servlet,。通過配置 Servlet 的 URL pattern,,將 HTTP 請求轉發(fā)到框架的 Servlet 然后再實行派發(fā),。在我們剛才的 Web 項目例子中,,對普通資源文件,jsp 和 servlet 的支持就為我們在項目中整合其他 J2EE 框架提供了可能,。有興趣的讀者可以自己嘗試一下,,本文不再贅述。 本文對 OSGi 環(huán)境下的 Web 開發(fā)技術做了一個簡要的介紹 , OSGi 和 Web 的結合作為一種新型的開發(fā)方式值得研究的地方還很多,。相信通過本文的示例項目,,可以幫助您更快的掌握這種全新的開發(fā)方式并為以后的學習打下很好的基礎。 本文所有示例均在 Windows XP SP3 系統(tǒng)中測試完成,。您需要一臺能流暢運行 Windows XP 系統(tǒng)的機器,,除此之外您還需要一些工具才能使用本教程中的代碼,。所有這些工具都可以免費下載: JDK1.5 或更高版本 Eclipse 3.4 或更高版本 Tomcat 6.0 或更高版本 |
|
來自: CevenCheng > 《OSGI》