在前幾篇《你好,OSGi》系列文章中,我們已經奠定了 OSGi 服務平台運作原理的基礎。接下來的篇章將深入探討如何將 OSGi 可插拔、基於組件的開發模型應用於 Web 應用程式開發。您將學會建立一個基於 Bundle 的 OSGi 應用程式,為靜態資源、Servlet 或 JSP 提供伺服器端服務,並掌握在 Web 應用中利用 Equinox 框架發揮 OSGi 模組化、版本管理與動態服務優勢的實戰經驗。
本系列已介紹 OSGi 開發核心概念,示範如何使用 Equinox 建立簡單的 Hello World 應用,並說明 Spring DM(Spring Dynamic Modules)如何便利地將 Spring 應用部署至 OSGi 容器。本篇將解答開發者最關心的問題:既喜歡 OSGi 理念,該如何用它構建 Web 應用?
您將看到 OSGi 開發模式如何大幅簡化真正可插拔、模組化、組件化的伺服器端應用開發流程。實作將基於 OSGi 參考實作 Equinox,但這次我們將在伺服器端使用 Equinox。首先討論部署 OSGi Web 應用的選項(以 Jetty 或 Tomcat 為例),再提供配置 Web 應用開發環境的簡明指南,最後開發一個簡單的 Hello World OSGi Web 應用並示範多種部署方式。
使用伺服器端 Equinox 開發 OSGi Web 應用有兩種途徑:
好消息是:無論採用哪種方式,開發 OSGi Web 應用的流程完全相同。建議開發階段將 Servlet 容器內嵌入 OSGi 容器;應用就緒後再重新打包部署。接著將學習如何內嵌 Servlet 容器,但首先要完成開發環境建置。
伺服器端 Equinox 專案發展迅速,正持續增加對熱門 MVC 框架(如 Apache Struts)、Spring Web 框架,以及主流 ORM 工具(如 Hibernate)的支援。另一個 Eclipse 專案 Rich Ajax Platform 也允許搭配伺服器端 Equinox 開發 Ajax 應用。
本練習將輕量級 Servlet 容器內嵌至 OSGi Bundle(即 Eclipse 語境下的 Plug-in)。該外掛安裝至 OSGi 容器後,會監聽 HTTP 請求;收到請求時檢查是否有已安裝的外掛能處理,若有則轉發給對應外掛產生回應,最後由 OSGi 容器傳回客戶端。
伺服器端 Equinox 提供數個預製外掛(內嵌 Servlet 容器的 OSGi 外掛)簡化開發,包含內嵌 Servlet 容器的外掛有:
org.eclipse.equinox.http:佔用空間極小,適合資源受限環境org.eclipse.equinox.http.jetty:以 Jetty 為底層引擎,支援 Servlet API 2.4以下步驟示範將 Jetty 外掛匯入 Eclipse IDE 配置開發環境:
jettyhttp-anon.psf 至本機jettyhttp-anon.psf,如圖 1 所示
圖 1. 匯入外掛專案集
點擊 Finish 開始匯入,可能需數分鐘視網路速度而定,Eclipse 將從 dev.eclipse.org CVS 倉庫下載必要專案檔案。
匯入完成後,工作空間將出現以下 Bundles:
javax.servlet v2_4
org.apache.commons.logging v1_0_4
org.eclipse.equinox.http.jetty
org.eclipse.equinox.http.registry
org.eclipse.equinox.http.servlet
org.mortbay.jetty v5_1_11
開發環境已就緒,下一步是在 Equinox OSGi 框架中執行 Bundle(操作細節請參考本系列第一篇)。
若已在 Equinox OSGi 框架中執行 Bundle,主控台視圖將出現 osgi> 提示符,並可看到 Jetty Servlet 容器產生的資訊,類似列表 1:
列表 1. OSGi 主控台中的 Jetty 啟動資訊
osgi> May 21, 2008 12:28:06 PM org.mortbay.http.HttpServer DOStart
INFO: Version Jetty/5.1.x
May 21, 2008 12:28:07 PM org.mortbay.util.Container start
INFO: Started org.mortbay.jetty.servlet.ServletHandler@f47bf5
May 21, 2008 12:28:07 PM org.mortbay.util.Container start
INFO: Started HttpContext[/,/]
May 21, 2008 12:28:07 PM org.mortbay.http.SocketListener start
INFO: Started SocketListener on 0.0.0.0:80
May 21, 2008 12:28:07 PM org.mortbay.util.Container start
INFO: Started org.mortbay.http.HttpServer@1f6df4c
待看到 INFO: Started org.mortbay.http.HttpServer@1f6df4c 後再進行下一步。
瀏覽器輸入 https://localhost/ 驗證 Jetty 伺服器運作。預期會看到 404 錯誤頁面(列表 2),因為 Jetty 找不到請求資源,且 OSGi 外掛不提供預設索引頁:
列表 2. Jetty 404 錯誤資訊
HTTP ERROR: 404
ProxyServlet: /
RequestURI=/
Powered by Jetty://
若您的設置與上述吻合,下一篇即可開始第一個實作:使用伺服器端 Equinox 開發基於 OSGi 的 Web 應用程式,敬請期待!