在編碼的同時,寫點東西,休息一下。
在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文件。這個需要驗證。