Tuscany Home
 

传统运行环境下的Web应用与OSGi环境下web应用分析对比

From Tuscany中文社区

Jump to: navigation, search

回到报告首页


目录

[编辑] 传统Web应用运行环境分析

在传统的运行环境中,运行环境是由同一个classloader加载到jvm中的。所有的资源相互之间都是可见的。所谓可见,就是可以方便的从当前线程的classloader中得到。


在传统的web运行环境中,一个web应用的所有可用资源都保存在WebApplicationContext (或者其他名称) 对象中。Web应用可以通过web.xml的描述,将需要初始化的内容保存其中。在web应用启动的时候通过某种机制将web.xml中的内容加载到jvm内并保存到WebApplicationContext对象中。之后,任何的对象需要使用web应用中的资源都可以从WebApplicationContext对象中得到。任何新增加的资源也会通过某种机制保存到WebApplicatonContext对象中或者通过WebApplicationContext对象可以获得。


上面所描述的情况,包括使用了struts框架以及servlet规范中的servlet、filter和listener等技术。这些技术框架都可以在web.xml中描述,从而载入到一个统一的环境中,特别要强调的是,他们存在于同一个classloader环境中,相互之间可见的。

在web应用中用到的Spring框架和前面提到的structs框架有些不同。Spring自己拥有一个ApplicationContext,这个ApplicationContext和前面提到的WebApplicationContext有些相似,所有Spring环境中的资源都要保存在这个对象当中。如果要用Spring中的资源就要从ApplicationContext对象中获得。同时这个ApplicationContext对象也保存了其所在web应用的WebApplicationContext对象。也就是说从Spring中可以通过ApplicationContext对象获得WebApplicationContext对象,得到Web应用中的所有可用资源;而Web应用却无法从自己的WebApplicationContext对象中得到Spring环境中的资源。


如果web应用需要用到Spring框架中的安全框架Acegi,就需要通过在web.xml文件描述的、一个由Spirng提供的、名为FilterToBeanFactory的filter。这个filter实现一个代理机制,实现从web应用对Spring资源的访问。


Web应用中如果使用Hibernate技术,通常由Spring来负责加载。这样Hibernate中的资源就成为Spring资源的一部分。从整体看,一个web应用中的环境保存分为两个部分:一个是web应用本身的webApplicatonContext,另一个是Spring的ApplicationContext 。在webx对SSH的改造之后,struts也交给了Spring。所以在基于传统的webx应用中,spring、struts和hibernate的资源几乎都保存在spring环境ApplicationContext中。

[编辑] OSGi环境下web应用的运行分析

Osgi环境下的资源是以bundle的形式部署的。每一个bundle都是由独立的classloader装载。各个bundle之间通过两种方式使用其他的bundle:一是通过服务的形式注册到OSGi环境中,另一个是通过Manifest.mf文件的import-package从OSGi环境中引入资源和export-package向OSGi环境中导出资源。如果不通过服务机制和Manifest.mf机制,各个bundle之间的资源是不可见的。不可见就是不可以使用。


Equinox环境默认使用了jetty作为web服务器。Jetty也是作为一个bundle部署到osgi环境中的。同时,web应用也作为一个bundle部署到osgi环境中。为了能让web服务器 jetty(以下以jetty表示web服务器)识别web应用bundle中的资源,必须通过osgi提供的HttpService接口进行注册。这是目前唯一一种将web应用资源部署到jetty环境中的办法。


HttpService接口提供了两个注册资源的方法:registerResource和registerServlet。


RegisterResource用来向jetty中部署静态的资源,比如web可以访问的目录,html文件,css,javascript以及properties配置文件等。


RegisterServlet则相对灵活一些。从名字上看,registerServlet是用来向jetty中部署servlet的方法。但是,为了适应servlet初始化以及listener和filter的需要,osgi环境提供了几个适配器adaptor,这些适配器继承了servlet接口,为其他的servlet对象提供注册代理。


从上面的描述可以得知,如果不经过这两个方法的注册,任何存在的资源jetty都是不识别的。如果在web应用中使用了struts、spring(Hibernate在后台处理不涉及url层面的请求)、acegi也必须使用以上连个方法将资源注册到jetty中。

[编辑] 传统web应用与OSGi环境下的web应用的比较

前面提到传统的java web应用服务器运行环境中包含两部分的Context,一个是WebApplicationContext属于web服务器,另一个ApplicationContext属于Spring 。而在OSGi运行环境中,web服务器jetty的环境,Spring的环境与web应用的环境是分成三个部分的。


Spring自动从安装到OSGi环境中的bundle中读取Spring相关的配置文件并将文件中描述的内容加载到Spring环境中;而jetty只是提供被动访问的环境。如果一个web应用bundle要使用spring,除了把自身的资源通过上述的两个方法注册到jetty环境中,还必须把用到的Spring环境中的资源也注册到jetty环境中。这是与传统的web服务器运行环境最大的区别。

[编辑] OSGi环境目前的不足

虽然通过HttpService可以将资源注册到jetty上,这里面还是有些限制的。


下面是两个方法的声明:

[1]registerServlet(String alias, Servlet servlet,Dictionary initparams, HttpContext context)
[2]registerResources(String alias, String name,	HttpContext context)


所有需要注册到jetty的资源都需要使用这两个方法。如果需要使用filter、listener等则需要使用equinox提供的工具包中的ServletAdaptor适配器。(见下面的图示)


图像:Osgi-servlet.jpg

另外,目前equinox环境下可用的web服务器只有jetty。

Personal tools