24. 与其他 web 框架集成

24.1 简介


春天 Web 流

Spring Web Flow(SWF)旨在成为 web application 页面流的 management 的最佳解决方案。

SWF 在 Servlet 和 Portlet 环境中与现有框架(如 Spring MVC 和 JSF)集成。如果您有一个业务 process(或进程)可以从对话 model 而不是纯请求 model 中受益,那么 SWF 可能就是解决方案。

SWF 允许您将逻辑页面流捕获为可在不同情况下重用的 self-contained 模块,因此非常适合 building web application 模块,这些模块可引导用户完成驱动业务流程的受控导航。

有关 SWF 的更多信息,请参阅Spring Web Flow 网站


本章详细介绍了 Spring 与第三方 web 框架的整合,例如JSF

Spring Framework 的核心 value 命题之一是支持选择。从一般意义上讲,Spring 并不强迫人们使用或购买任何特定的架构,技术或方法(虽然它肯定推荐一些其他人)。这种选择与开发人员及其开发团队最相关的 architecture,技术或方法的自由在 web 区域中最为明显,其中 Spring 提供了自己的 web framework(Spring MVC),同时提供了 time 与一些流行的第三方 web 框架集成。这允许我们继续利用在特定的 web framework(如 JSF)中获得的任何和所有技能,同时 time 能够享受 Spring 在其他领域提供的好处,例如数据访问,声明 transaction management,灵活的 configuration 和 application 程序集。

放弃了羊毛销售模式(c.f.前一段),本章的其余部分将集中讨论将您最喜欢的 web framework 与 Spring 整合在一起的丰富细节。从其他语言进入 Java 的开发人员经常评论的一件事是 Java 中可用的 web 框架。 Java 空间确实有很多 web 框架;事实上,在一章中有太多的内容可以涵盖任何相似的细节。因此,本章从 Java 中选择了四个比较流行的 web 框架,从 Spring configuration 开始,这是所有受支持的 web 框架的 common,然后详细说明每个支持的 web framework 的特定 integration 选项。

请注意,本章不会尝试解释如何使用任何受支持的 web 框架。例如,如果您想将 JSF 用于 web application 的表示层,则假设您已熟悉 JSF 本身。如果您需要有关任何受支持的 web 框架本身的更多详细信息,请参阅本章末尾的第 24.6 节,“更多资源”

24.2 Common configuration

在深入研究每个支持的 web framework 的 integration 细节之前,让我们先看一下 Spring configuration,它不是任何一个 web framework 特有的。 (本节同样适用于 Spring 自己的 web framework,Spring MVC.)

(Spring 的)轻量级 application model 支持的一个概念(想要一个更好的词)是一个分层的 architecture。请记住,在“经典”分层 architecture 中,web 图层只是众多图层中的一个;它作为服务器端 application 的入口点之一,它委托服务层中定义的服务 objects(Facade)来满足业务特定(和 presentation-technology 不可知)的用例。在 Spring 中,这些服务 objects,任何其他 business-specificobjects,数据访问 objects 等存在于一个独特的'business context'中,它不包含 web 或表示层 objects(表示 objects,如 Spring MVC 控制器通常配置为不同的'演示文稿 context')。本节详细介绍了如何在一个 application 中配置包含所有'business beans'的 Spring 容器(WebApplicationContext)。

具体问题:所有需要做的就是在一个 web application 的标准 Java EE servlet web.xml文件中声明ContextLoaderListener,并添加一个contextConfigLocation <context-param/>部分(在同一个文件中),定义要加载的 Spring XML configuration files 集合。

在下面找到<listener/> configuration:

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

在下面找到<context-param/> configuration:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext*.xml</param-value>
</context-param>

如果未指定contextConfigLocation context 参数,则ContextLoaderListener将查找要加载的名为/WEB-INF/applicationContext.xml的文件。加载 context files 后,Spring 会根据 bean 定义创建WebApplicationContext object,并将 store 存储在 web application 的ServletContext中。

所有 Java web 框架都构建在 Servlet API 之上,因此可以使用以下 code 代码段来访问ContextLoaderListener创建的'business context'ApplicationContext

WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);

WebApplicationContextUtils class 是为了方便起见,因此您不必记住ServletContext属性的 name。如果WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE key 下不存在 object,它的 getWebApplicationContext()方法将_ret 。而不是冒险在 application 中获取NullPointerExceptions,最好使用getRequiredWebApplicationContext()方法。当ApplicationContext缺失时,此方法抛出 exception。

一旦你的 reference,你可以通过 name 或类型检索 beans。大多数开发人员通过 name 检索 beans,然后将它们转换为其实现的接口之一。

幸运的是,本节中的大多数框架都有更简单的查找 beans 的方法。它们不仅可以轻松地从 Spring 容器中获取 beans,而且还允许您在其控制器上使用依赖注入。每个 web framework 部分都有关于其特定 integration 策略的更多细节。

24.3 JavaServer Faces 1.2

JavaServer Faces(JSF)是 JCP 的标准 component-based,event-driven web 用户界面 framework。从 Java EE 5 开始,它是 Java EE 保护伞的官方部分。

对于流行的 JSF 运行时以及流行的 JSF component libraries,请查看Apache MyFaces 项目。 MyFaces 项目还提供 common JSF extensions,例如MyFaces Orchestra:Spring-based JSF 扩展,提供丰富的会话范围支持。

Spring Web Flow 2.0 通过其新建立的 Spring Faces 模块提供丰富的 JSF 支持,包括 JSF-centric 用法(如本节所述)和 Spring-centric 用法(使用 Spring MVC 调度程序中的 JSF 视图)。查看Spring Web Flow 网站了解详情!

Spring 的 JSF integration 中的 key 元素是 JSF ELResolver机制。

24.3.1 SpringBeanFacesELResolver(JSF 1.2)

SpringBeanFacesELResolver是符合 JSF 1.2 的ELResolver implementation,与 JSF 1.2 和 JSP 2.1 使用的标准 Unified EL 集成。与SpringBeanVariableResolver一样,它首先委托给 Spring 的'business context'WebApplicationContext,然后委托给底层 JSF implementation 的默认解析器。

Configuration-wise,只需在 JSF 1.2 faces-context.xml 文件中定义SpringBeanFacesELResolver

<faces-config>
    <application>
        <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
        ...
    </application>
</faces-config>

24.3.2 FacesContextUtils

自定义VariableResolver在 faces-config.xml 中将一个 properties 映射到 beans 时效果很好,但有时可能需要 grab 显式 grab。 这时,FacesContextUtils class 使这很容易。它类似于WebApplicationContextUtils,除了它采用FacesContext参数而不是ServletContext参数。

ApplicationContext ctx = FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance());

24.4 Apache Struts 2.x

由 Craig McClanahan 发明,支柱是由 Apache 软件基金会主办的一个开源项目。在 time,它大大简化了 JSP/Servlet 编程范例,并赢得了许多使用专有框架的开发人员。它简化了编程 model,它是开源的(因此在啤酒中是免费的),它有一个庞大的社区,它允许项目在 Java web 开发人员中成长并变得流行。

查看 Struts Spring 插件,了解 Struts 附带的 built-in Spring integration。

24.5 挂毯 5.x

来自Tapestry 主页

Tapestry 是一个“面向 Component 的 framework,用于在 Java 中创建动态,健壮,高度可扩展的 web applications”。

虽然 Spring 有自己的强大的 web 层,但是使用 Tapestry 用于 web 用户界面和 Spring 容器用于较低层,构建企业 Java 应用程序有许多独特的优势。

有关更多信息,请查看 Tapestry 的专用Spring 的 integration 模块

24.6 更多资源

在下面找到有关本章所述各种 web 框架的更多资源的链接。