基於OSGI規範Equinox實現的Web組件化松耦合、熱插拔架構

在編碼的同時,寫點東西,休息一下。

 

在ServletBridge中,對tomat(或者其他服務器的實現)的Servlet,ServletContex, ServletConfigure, ServletRequest, ServletContextFilter, ServletContextListener等標準的JEE規範類,進行封裝,生成多個XXXWrapper類,然後將這些封裝修改過的類型傳入OSGI web容器中。

 

在OSGI Bundle jar中,封裝了http servlet、jsp page和各種靜態資源,一個bundle jar類似一個普通的Web應用,有自己的WebContent目錄/Web.xml等。

 

對於web.xml中taglib的擴展,可以在上面的ServletContextWrapper中,對各個bundle web.xml中配置的jsp tag lib進行註冊。然後每個dispatch jsp文件的地方,給每個jsp文件前面加上tag lib的引用:

<%@ taglib uri="/WEB-INF/mytab.tld" prefix="mt" %>

 

這裏需要注意的是,開發者在編輯jsp文件的時候,uri上填的是虛擬的uri,並不是真實的對應.tld文件,但是tomcat的JspServlet(women不可能採用wrapper的方式進行封裝),是從自己的實現中獲得tag uri,這樣導致我們bundle web.xml中配置的taglib並不能被正確的加載。所幸,jsp規範中允許上面的taglib標籤, uri屬性可以用實際的資源path,這樣我們的解決方法爲:在我們的Servlet中dispatch jsp文件的時候,在其開頭,將tablic的uri修改爲真實的資源path。然後tomcat的JspServlet是從我們的ServletContextWrappper.getResource(String path)獲取該tld文件,此處我們可以將該地址轉化成bundle的全path,或者真實的tld文件。

 

有個猜想,如果uri使用虛擬的地址,在ServletContextWrappper.getResource(String path)處,我們也可以直接得到bundle中真實的tld文件。這個需要驗證。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章