基于OSGI规范Equinox实现的Web组件化松耦合、热插拔架构

来源:互联网 发布:大数据精准推荐竞彩app 编辑:程序博客网 时间:2024/04/30 02:48

在编码的同时,写点东西,休息一下。

 

在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文件。这个需要验证。

原创粉丝点击