在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的注册需要。
由
于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。