您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > 学习笔记 7.6 集成其他Web框架
7.6集成其他Web框架虽然Spring本身也提供了一个功能非常强大的MVC框架,并且和Spring的IoC容器无缝集成,非常便于使用。不过,在实际情况中,我们还不得不考虑众多采用第三方MVC框架的Web应用程序,例如,采用Strtus、WebWork等。如果要将这些应用程序的逻辑组件和持久化组件纳入Spring的IoC容器中进行管理,就必须考虑如何集成这些第三方的MVC框架。Spring强大的集成和扩展能力使得集成第三方MVC框架成为轻而易举的事情。与第三方MVC框架集成时,需要考虑的问题是如何在第三方MVC框架中访问SpringIoC容器管理的Bean,或者说,如何获取SpringIoC容器的实例。我们还要保证在第三方MVC框架开始处理用户请求之前,Spring的IoC容器必须初始化完毕。有两种方式可以自动加载Spring的IoC容器。一种是利用第三方框架的扩展点,实现加载Spring的IoC容器,例如,Struts就提供了Plugin扩展。第二种方式是在web.xml中定义Listener或Servlet,让Web应用程序一启动就自动加载Spring的IoC容器。这种方式较为通用,对于一些不太常见的第三方MVC框架,也可以用这种方式来尝试与Spring集成。如果正在使用基于Servlet2.3或更高规范的Web服务器,则应当使用Spring提供的ContextLoaderListener来加载IoC容器,因为根据Servlet2.3规范,所有的Listener都会在Servlet被初始化之前完成初始化。由于我们希望尽可能早地完成SpringIoC容器的初始化,因此,采用ContextLoaderListener加载Spring的IoC容器是最合适的。采用ContextLoaderListener加载Spring的IoC容器时,在/WEB-INF/web.xml中定义如下。?xmlversion=1.0encoding=UTF-8?!DOCTYPEweb-appPUBLIC-//SunMicrosystems,Inc.//DTDWebApplication2.3//EN默认地,ContextLoaderListener会在/WEB-INF/目录下查找名为applicationContext.xml文件,作为Spring的XML配置文件加载。如果使用其他文件名,或者有多个XML配置文件,就需要预先在context-param中指定。context-paramparam-namecontextConfigLocation/param-nameparam-value/WEB-INF/cfg1.xml,/WEB-INF/cfg2.xml/param-value/context-param如果使用的Web服务器还不支持Servlet2.3规范,则无法使用Listener,也就无法通过ContextLoaderListener来加载Spring的IoC容器。为此,Spring提供了另一个ContextLoaderServlet,以Servlet的形式来加载Spring的IoC容器。servletservlet-namecontextLoader/servlet-nameservlet-classorg.springframework.web.context.ContextLoaderServlet/servlet-classload-on-startup0/load-on-startup/servletContextLoaderServlet查找Spring的XML配置文件的方式与ContextLoaderListener完全一致,不过,由于必须首先加载ContextLoaderServlet,然后加载其他的Servlet,才能保证Spring的IoC容器在其他Servlet处理用户请求之前初始化完毕。因此,设置load-on-startup为0,表示Web服务器一启动就加载ContextLoaderServlet,对于其他的Servlet,load-on-startup的值要设得大一些,保证ContextLoaderServlet有足够的时间初始化Spring的IoC容器。一旦完成了SpringIoC容器的加载,另一个问题是如何在第三方应用程序中获得SpringIoC容器的实例?事实上,不管采用何种方式加载Spring的IoC容器,Spring最终都会将IoC容器的实例绑定到ServletContext上。由于ServletContext在一个Web应用程序中是全局唯一的,因此该Web应用程序中所有的Servlet都可以访问到这个唯一的ServletContext,也就可以获得SpringIoC容器的实例。Spring提供了一个辅助类WebApplicationContextUtils,通过调用getWebApplicationContext(ServletContext)方法就可以获得SpringIoC容器的实例。对于参数ServletContext,可以在Servlet中随时调用getServletContext()获得。一旦获得了SpringIoC容器的实例,就可以获得Spring管理的所有的Bean组件。下面,我们分别详细介绍如何在Spring中集成Struts、WebWork2、Tiles和JSF。7.6.1集成StrutsStruts是目前JavaEEWeb应用程序中应用最广泛的MVC开源框架,自从2001年发布以来,Struts作为JavaEE领域的第一个MVC框架,极大地简化了基于JSP和Servlet的Web开发,提供了统一的MVC编程模型。虽然从现在看来,Struts的设计模型已不算先进,有许多其他MVC框架拥有更好的设计,但Struts仍具有庞大的社区支持和最多的开发人员,这些都使得Struts仍是JavaEE领域内Web开发的首选框架。不过,Strtus仅仅是一个用于表示层的MVC框架,它并没有提供一个完整的JavaEE框架的解决方案。如果要将Struts集成到Spring框架中,有两种方案可供选择。下面,我们将详细讲解如何将Struts集成到Spring框架中。在集成Struts之前,我们假定已经有了一个基于Struts的Web应用程序,这里我们使用的例子是一个简单的处理用户登录的Struts应用,这个Struts应用在浏览器中的效果如图7-54所示。图7-54在Eclipse中,我们建立了这个名为Struts的工程,其结构如图7-55所示。图7-55在Struts应用中,每个用户请求通过一个Action类来处理,这和Spring的Controller类似,但是Struts的Action是一个类而非接口,因此,所有的Action子类都只能从Action派生。由于Struts是一个Web层框架,需要考虑如何获得业务逻辑接口。一个较好的设计是首先设计一个BaseAction,其中定义了获得业务逻辑接口的方法,其他所有的Action从BaseAction派生即可非常方便地调用业务逻辑接口。publicclassBaseActionextendsAction{privatestaticfinalUserServiceuserService=newUserServiceImpl();publicUserServicegetUserService(){returnuserService;}}在BaseAction中,我们以静态变量持有业务逻辑接口UserService的引用,这是一个不太优雅的设计。如果使用Spring的IoC容器来配置和管理这些逻辑组件,则可以完全实现一个优雅的多层应用程序,Struts只处理Web表示层,业务逻辑层和数据持久层都交由Spring管理,便于维护和扩展。在Spring中有两种方式来集成Struts,关于Struts的更多详细用法的讨论已经超出了本书的范围。在本节中,假定读者对Struts已经有了一定的基础。下面我们分别介绍Spring集成Struts的两种方案,两种方案都需要Spring提供的一个名为ContextLoaderPlugin的Struts插件来启动IoC容器。由于是Web应用程序,ContextLoaderPlugin启动的是WebApplicationContext的实例。第一种方案是通过Spring提供的一个Struts插件来初始化IoC容器,然后从Spring提供的ActionSupport派生所有的Action,以便能通过getWebApplicationContext()获得ApplicationContext,一旦获得了ApplicationContext引用,就可以获得Spring的IoC容器中所有的Bean。我们建立一个Struts_Spring1工程,首先复制Struts工程的所有文件,然后在Struts配置文件的最后添加Spring的插件声明。struts-config...plug-inclassName=org.springframework.web.struts.ContextLoaderPlugIn//struts-config然后修改BaseAction,将其超类从Struts的Action改为Spring的ActionSupport。publicclassBaseActionextendsActionSupport{publicUserServicegetUserService(){return(UserService)getWebApplicationContext().getBean(userService);}}现在,BaseAction就可以随时通过Spring的ApplicationContext获得逻辑组件UserService的引用,这样所有的Action子类都可以直接通过getUserService()获得UserService组件。最后一步是编写Spring的XML配置文件,默认的文件名是servlet-name-servlet.xml,由于我们在web.xml中配置Struts的ActionServlet名称为action,因此,Spring的配置文件为action-servlet.xml,放到web/WEB-INF/目录下,定义所有的Bean组件,但不包括Struts的Action实例。?xmlversion=1.0encoding=UTF-8?beansxmlns=:xsi=:schemaLocation=://=userServiceclass=example.chapter7.UserServiceImpl//beans如果Spring的XML配置文件没有使用默认的文件名,就必须在Struts配置文件中声明Plugin时指定文件位置。struts-config...plug-inclassName=org.springframework.web.struts.C
本文标题:学习笔记 7.6 集成其他Web框架
链接地址:https://www.777doc.com/doc-6013726 .html