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

本文介绍如何在OSGi环境下集成JSP TagLib,包括通过ServletBridge封装JEE规范类并实现在不同bundle间共享TagLib资源的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值