知識
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價值,我們在追求其視覺表現(xiàn)的同時,更側(cè)重于功能的便捷,營銷的便利,運營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序為后期升級提供便捷的支持!
您當(dāng)前位置>首頁 » 新聞資訊 » 網(wǎng)站建設(shè) >
OSGi技術(shù)在Java Web開發(fā)中的應(yīng)用
發(fā)表時間:2016-8-23
發(fā)布人:葵宇科技
瀏覽次數(shù):57
隨著Java SE對模塊化功能原生支持的一再推遲(據(jù)最新的消息,Jigsaw項目——Java SE中的標(biāo)準(zhǔn)模塊系統(tǒng)——的開發(fā)工作相對滯后,已經(jīng)延期到了Java 9中,Java 9到2015年才有希望發(fā)布),OSGi作為事實標(biāo)準(zhǔn)的Java模塊化實現(xiàn)得到了長足的發(fā)展,尤其是隨著云計算和分布式技術(shù)的興起,OSGi這種模塊化、動態(tài)部署的核心功能將會受到越來越多的重視。
目前OSGi規(guī)范的主流實現(xiàn)框架是Eclipse Equinox以及Apache Felix,其實際的應(yīng)用場景也早就從起初的嵌入式設(shè)備擴(kuò)展到桌面應(yīng)用甚至Java企業(yè)級開發(fā)領(lǐng)域。最為大家所熟知的OSGi應(yīng)用是Eclipse IDE,其實像Sun GlassFish、IBM WebSphere Application Server、JBoss Application Server以及Apache的大量開源項目如Camel、Sling、ServiceMix、Kafaf等都使用了OSGi技術(shù),隨著其應(yīng)用的日益廣泛,技術(shù)的可用性和成熟度經(jīng)受了充分的考驗,實踐證明OSGi是一項可靠的技術(shù),完全可以應(yīng)用于企業(yè)級應(yīng)用的開發(fā)。尤其值得一提的是,隨著OSGi Core Release 5和OSGi Enterprise Release 5版本的發(fā)布,預(yù)計OSGi技術(shù)將會受到更多的關(guān)注,國內(nèi)外已經(jīng)有將OSGi應(yīng)用于云計算和分布式計算的案例。
本文將選取OSGi應(yīng)用于傳統(tǒng)Java Web開發(fā)的場景,介紹借助于OSGi技術(shù),怎樣實現(xiàn)將Web應(yīng)用拆分成滿足OSGi規(guī)范的bundle,實現(xiàn)組件的動態(tài)部署。目前,為了實現(xiàn)在bundle中支持JSP、Servlet等Java Web開發(fā)技術(shù)和規(guī)范,有兩種主要的開發(fā)部署方式,本文都將進(jìn)行介紹,但是這兩種方案在實現(xiàn)上與傳統(tǒng)的Java Web應(yīng)用開發(fā)模式有較大的不同,且對JEE規(guī)范的支持尚不完整。
按照Eclipse Equinox的習(xí)慣,會將bundle稱為插件,在后文中會根據(jù)具體的應(yīng)用場景穿插使用這兩個名詞,但其本質(zhì)是相同的。
1.1 將Web容器作為bundle置于Equinox中進(jìn)行開發(fā)
在這種模式下,我們需要將支持JEE規(guī)范的容器也以bundle形式發(fā)布到OSGi容器中,而包含JSP、Servlet的bundle將會使用該容器接受對請求的訪問,這種方式的好處在于OSGi容器管理整個運行環(huán)境,是個純粹的可熱插拔運行環(huán)境,其缺點在于需要Web容器支持以bundle的形式進(jìn)行發(fā)布,對運行環(huán)境有一定的限制,目前支持該要求的Web容器有Tomcat和Jetty,但是主流的企業(yè)級應(yīng)用服務(wù)器尚不支持這種部署方式。
鑒于Eclipse開發(fā)環(huán)境中已經(jīng)包含了Jetty服務(wù)器,所以我們將會使用該服務(wù)器進(jìn)行Web應(yīng)用的開發(fā)。
首先我們需要使用Eclipse的工程向?qū)?chuàng)建一個插件工程。根據(jù)工程的需要,我們不生成啟動類(activator),不使用任何模版,創(chuàng)建過程如下:
新建一個插件工程:
輸入工程的基本信息:
此處我們不使用任何模版,因為我們不會用到Eclipse的UI功能:
新建完成的項目結(jié)構(gòu)如下所示:
為了測試進(jìn)行Web開發(fā),我們新建目錄結(jié)構(gòu)/WebRoot/jsp(該目錄名稱是任意的,只需在后續(xù)定義擴(kuò)展點時進(jìn)行匹配即可)并在該目錄下創(chuàng)建一個JSP文件,此時的工程結(jié)構(gòu)如下:
JSP的代碼如下:

<%@pagelanguage="java"contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPEhtmlPUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <metahttp-equiv="Content-Type"content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> Hello,world! </body> </html>

為了使用JSP和Servlet,我們需要使用一個擴(kuò)展點,該擴(kuò)展的名稱為org.eclipse.equinox.http.registry.servlets,我們需要使用該擴(kuò)展點進(jìn)行JSP目錄和訪問地址的匹配,在這個樣例中我們匹配了/WebRoot/jsp目錄,其訪問地址的前綴將會是/jsp/:
除此以外,我們還需要添加對org.eclipse.equinox.jsp.jasper.registry插件的依賴,以實現(xiàn)JSP的編譯功能。
最后,我們在運行時配置里將testweb和Jetty所依賴的插件全部選中,如下:
點擊“Run”按鈕,此時就會啟動OSGi運行環(huán)境,我們可以在控制臺通過使用“ss”命令來查看運行插件的狀態(tài)情況:
此時,可以在瀏覽器中輸入http://localhost/jsp/index.jsp(Jetty的默認(rèn)端口是80,可進(jìn)行配置),就會看到我們所編寫的JSP的代碼了:
要實現(xiàn)訪問Servlet和靜態(tài)資源(CSS、圖片等),也需要類似的配置,下圖是一個包含靜態(tài)資源和Servlet的配置樣例所對應(yīng)的plugin.xml文件內(nèi)容:

<?xml version="1.0" encoding="UTF-8"?> <?eclipse version="3.4"?> <plugin> <extension point="org.eclipse.equinox.http.registry.servlets"> <servlet alias="/servlet/myfirstservlet" class="testjsp.LoginServlet" load-on-startup="true"> </servlet> <servlet alias="/jsp/*.jsp" class="org.eclipse.equinox.jsp.jasper.registry.JSPFactory:/WebRoot/jsp/"> </servlet> </extension> <extension point="org.eclipse.equinox.http.registry.resources"> <resource alias="/web" base-name="/WebRoot/images"/> </extension> </plugin>

以上就實現(xiàn)了訪問JSP和Servlet等Java Web技術(shù)的功能,如果要將其用在實際的運行環(huán)境中,可以將這個插件打成jar包的形式,將該jar包和其依賴的插件放在Equinox指定目錄下,通過命令行來啟動bundle并進(jìn)行訪問。
1.2 將Equinox置于web容器中進(jìn)行開發(fā)
以上的開發(fā)模式對于習(xí)慣于傳統(tǒng)JEE開發(fā)模式的開發(fā)人員在接受上有一定的難度,直接使用Equinox作為運行環(huán)境在解決集群部署方面也有一定的難度,除此以外,主流的應(yīng)用服務(wù)器并不提供bundle形式的jar以運行在OSGi容器中。所以,開發(fā)人員摸索出了另一種開發(fā)和部署模式。
在這種模式中,會將Equinox和我們開發(fā)的插件都打成一個標(biāo)準(zhǔn)的war包的格式,因此可以運行在任意支持JEE的容器中。Equinox的生命周期是通過Servlet來進(jìn)行控制。這種模式被稱為橋接模式。Equinox官方提供了該模式的實現(xiàn),后來的社區(qū)貢獻(xiàn)者基于此進(jìn)行了功能的完善。
將下載后的代碼導(dǎo)入到Eclipse中,工程目錄如下所示:
從該目錄可以看出,這是一個典型JEE工程,可以運行在任意的支持規(guī)范的Web容器或應(yīng)用服務(wù)器中,查看web.xml,我們可以看到這樣的配置:

<servlet id="bridge"> <servlet-name>equinoxbridgeservlet</servlet-name> <display-name>Equinox Bridge Servlet</display-name> <description>Equinox Bridge Servlet</description> <servlet-class>org.eclipse.equinox.servletbridge.BridgeServlet</servlet-class> <init-param> <param-name>commandline</param-name> <param-value>-console</param-value> </init-param> <init-param> <param-name>enableFrameworkControls</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>extendedFrameworkExports</param-name> <param-value></param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>equinoxbridgeservlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>equinoxbridgeservlet</servlet-name> <url-pattern>*.jsp</url-pattern> </servlet-mapping>

我們可以看到這個Servlet攔截了所有的請求,由該Servlet代理所有的請求。
在部署階段,可以把插件打成jar包,放到/WEB-INF/eclipse/plugins目錄下即可。如將我們上例中的testweb導(dǎo)出為jar包后,置于指定目錄下。然后在Tomcat中運行該應(yīng)用。訪問http://localhost:8080/bridge/jsp/index.jsp就可以看到我們編寫的JSP頁面了。
使用以上的模式進(jìn)行開發(fā),對原有的開發(fā)和部署模式?jīng)_擊較小而且支持所有的應(yīng)用服務(wù)器。
參考資料:
http://www.ibm.com/developerworks/cn/web/0907_osgiweb_liuqing/
相關(guān)案例查看更多
相關(guān)閱讀
- 搜索引擎排名
- 網(wǎng)站建設(shè)費用
- 楚雄小程序開發(fā)
- 跳轉(zhuǎn)小程序
- 微信分銷
- 網(wǎng)站收錄
- web服務(wù)
- 云南網(wǎng)站建設(shè)快速優(yōu)化
- 汽車報廢
- 百度人工排名
- 支付寶小程序被騙
- 云南小程序開發(fā)報價
- 云南網(wǎng)站建設(shè)制作
- 商標(biāo)
- 小程序定制
- 英文網(wǎng)站建設(shè)公司
- 昆明網(wǎng)站設(shè)計
- 網(wǎng)站排名優(yōu)化
- 開通微信小程序被騙
- 網(wǎng)站建設(shè)公司哪家好
- 出入小程序
- 小程序被攻擊
- 云南小程序定制
- 小程序模板開發(fā)公司
- 網(wǎng)站上首頁
- 云南省住房建設(shè)廳網(wǎng)站
- 云南小程序開發(fā)推薦
- 云南網(wǎng)站建設(shè)公司
- 小程序開發(fā)平臺前十名
- 網(wǎng)站優(yōu)化哪家好