equinox环境下web应用资源的部署

equinox环境下web应用资源的部署

在osgi的equinox实现环境下,web服务器和web应用都是以osgi的bundle的形式部署到equinox环境中的。

在equinox下部署web服务器的资源与非equinox(osgi)环境下有一些不同,这为使用Spring+Struts+Hibernate的应用向equinox环境转移带来了一定的困难。而在spring中使用acegi的应用的转换麻烦要更多一些。


equinox环境自带了jetty作为默认的web服务器。


OSGi 中在org.osgi.service.http.HttpService接口中提供向web服务器部署资源的两个方 法:registerServlet(...)和registerResources(...),为了看得清晰省略了两个方法中的形参列表。从这两个方法 的命名上可以看出,equinox实现了HttpService接口的类,可以提供两种类型资源的部署(或者说注册),一种是静态资源Resources 对应registerResources(...)方法;另一种是动态资源Servlet对应registerServlet(...)。


1、注册静态资源


registerResources(String alias, String name, HttpContext context)



静态的资源是以文件形式存在的、能被web服务程序以文件流的形式读取的内容。比如,html,image,css,javascript,properties等静态的文件。


2、注册动态资源


registerServlet(String alias, Servlet servlet, Dictionary initparams, HttpContext context)


其他非静态资源都以servlet的形式部署(注册)。比如,serlvet,filter,listener等。


equinox提供了几个servlet的适配器(adaptor),以满足需要初始参数的servlet、需要contextPath的servlet以及Listener和Filter的注册需要。


equinox环境下web应用资源的部署_第1张图片


由 于web服务器--jetty和web应用是分别处在不同的bundle中,每个bundle都是由独立的classLoader来加载资源的,所以,即 使在web应用的bundle内通过Spring将servlet、fitler、listener加载,对于web服务器--jetty的bundle 来说也是不可见的。必须使用registerServlet进行部署才能让jetty识别servlet、listener和filter。


在 jetty的资源部署时,一个URL的相对路径只能用一次。如果有两个servlet或者资源对应一个URL的相对路径就会出错。Filter也存在同样 的问题。用FilterServletAdaptor可以将一个servlet和Filter串接起来,在servlet之前先执行filter,然后 servlet再处理。但是多个Filter的串接还未能实现。这个filter的串接在acegi中是要使用的。


Acegi 是通过FilterToBeanProxy将Servlet容器和Spring容器结合起来。FilterToBeanProxy将拦截的请求通过 filterChainProxy发给一串filter处理。在非OSGi的环境中,由于是一个jvm环境,web服务器可以识别并使用由spring载 入的filter链,而在equinox环境中web服务器--jetty无法使用另一个bundle中未经过registerServlet注册的任何 servlet和filter。

你可能感兴趣的:(equinox环境下web应用资源的部署)