Tuscany Home
 

Struts1与spring在osgi之上的集成 II

From Tuscany中文社区

Jump to: navigation, search

目录

[编辑] struts1与spring的传统集成

一个plugin与一个controller: spring为struts1提供了一个plugin,它负责加载指定的spring xml(资源)文件。值得注意的是:在一个使用springframework的web应用中,可以通过在web.xml中声明org.springframework.web.context.ContextLoaderListener来加载制定的spring资源。如果同时使用这里所说的plugin,应当将目标资源区分开,以避免重复加载。

spring同时还为struts1提供了一个controller,它负责将原来对Action的引用转为对spring bean的引用。这个controller是struts1集成spring的核心。

[编辑] 如何在osgi模式下集成struts1与spring

在新的环境下,最重要的区别是: 没有了servlet context里面的那个ApplicationContext,所以我们面临的问题是:创建我们自己的controller,由它来负责获得ApplicationContext,并从中“定位”所需的Action对象。

Image:OSGi-Spring002.png

图中:我们实现了一个RequestProcessor,它重载父类了processActionCreate方法,从spring-osgi的ApplicationContext中获得Action对象。这里的ApplicationContext实际上是一个OsgiBundleXmlApplicationContext类型,在我们的设计里,是RequestProcessor的一个静态成员。

下一步,我们需要将struts1的主配置文件(如:struts-config.xml)中的controller该为我们自己的类。 原来的plugin不再需要!

[编辑] ApplicationContext在哪里

在前面的文章里,我提到通过一个Activator动态加载jsp编译器和struts环境,但是在集成spring-osgi的模式下,我们必须将这种方式调整一下。 spring-osgi不但兼容传统spring的所有特性,同时还提供了一个BundleContextAware接口,它与ApplictionContextAware接口的用途相近,使开发者可以在spring-osgi模式下,获得OSGi的BundleContext指针。 Image:OSGi-Spring003.png

图中:我们将创建一个对象,它同时继承BundleContextAware和ApplicationContextAware接口,由于先前的“动态代码”需要BundleContext指针,我们需要将这些代码放到setBundleContext方法中;同时,为了让我们的struts所使用的controller访问到ApplicationContext,必须在setApplicationContext中保存ApplicationContext指针。我们在controller中设置一个静态成员,并在此时为这个成员“付值”。

[编辑] Action访问服务层

在本应用中,我们将原来的服务层,如BookService设计为OSGi服务。我们并不需要对原来的类作任何修改,并且,这种“服务化”将由spring-osgi替我们做。 由于在这个应用中,Action仍然作为普通的spring bean存在。我们就可以通过spring-osgi的IoC将OSGi服务“注入”Action对象中。

服务可以存在于任何bundle中。

Personal tools