跳到主要内容
版本:6.2.3

其他网络框架

ChatGPT-4o-mini 中英对照 Other Web Frameworks

本章详细介绍了 Spring 与第三方 Web 框架的集成。

Spring 框架的核心价值主张之一是实现 选择。从一般意义上讲,Spring 不会强迫你使用或接受任何特定的架构、技术或方法论(尽管它确实会推荐某些优于其他的选项)。这种选择架构、技术或方法论的自由,对开发者及其开发团队来说,最明显的体现在 web 领域,在这里 Spring 提供了自己的 web 框架(Spring MVC 和 Spring WebFlux),同时也支持与许多流行的第三方 web 框架的集成。

常见配置​

在深入每个支持的 web 框架的集成细节之前,让我们首先看看一些不特定于任何一个 web 框架的常见 Spring 配置。(这一部分同样适用于 Spring 自身的 web 框架变体。)

Spring 的轻量级应用模型所倡导的一个概念(不妨称之为概念)是分层架构。请记住,在“经典”分层架构中,web 层只是众多层中的一层。它作为服务器端应用程序的一个入口点,并将请求委托给在服务层中定义的服务对象(外观),以满足特定于业务(且与展示技术无关)的用例。在 Spring 中,这些服务对象、任何其他特定于业务的对象、数据访问对象等都存在于一个独特的“业务上下文”中,该上下文不包含 web 或展示层对象(展示对象,例如 Spring MVC 控制器,通常在一个独特的“展示上下文”中配置)。本节详细说明如何配置一个包含您应用程序中所有“业务 bean”的 Spring 容器(WebApplicationContext)。

接下来具体说明,您需要做的就是在您的 web 应用程序的标准 Jakarta EE servlet web.xml 文件中声明一个 ContextLoaderListener,并添加一个 contextConfigLocation <context-param/> 部分(在同一个文件中),该部分定义要加载的 Spring XML 配置文件集。

考虑以下 <listener/> 配置:

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

进一步考虑以下 <context-param/> 配置:

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

如果您没有指定 contextConfigLocation 上下文参数,ContextLoaderListener 会查找名为 /WEB-INF/applicationContext.xml 的文件进行加载。一旦上下文文件被加载,Spring 会根据 bean 定义创建一个 WebApplicationContext 对象,并将其存储在 web 应用程序的 ServletContext 中。

所有 Java Web 框架都是建立在 Servlet API 之上的,因此您可以使用以下代码片段来访问由 ContextLoaderListener 创建的这个“业务上下文” ApplicationContext。

以下示例展示了如何获取 WebApplicationContext:

WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);

WebApplicationContextUtils 类是为了方便使用,因此你不需要记住 ServletContext 属性的名称。它的 getWebApplicationContext() 方法在 WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE 键下不存在对象时返回 null。与其冒着在应用程序中出现 NullPointerExceptions 的风险,不如使用 getRequiredWebApplicationContext() 方法。该方法在缺少 ApplicationContext 时会抛出异常。

一旦你获得了对 WebApplicationContext 的引用,你可以通过它们的名称或类型来检索 beans。大多数开发者通过名称检索 beans,然后将它们转换为实现的接口之一。

幸运的是,本节中的大多数框架都有更简单的查找 bean 的方法。它们不仅使从 Spring 容器中获取 bean 变得容易,还允许您在它们的控制器上使用依赖注入。每个 web 框架部分都有关于其特定集成策略的更多细节。

JSF​

JavaServer Faces (JSF) 是 JCP 的标准组件化、事件驱动的网页用户界面框架。它是 Jakarta EE 伞下的官方组成部分,但也可以单独使用,例如,通过在 Tomcat 中嵌入 Mojarra 或 MyFaces。

请注意,最近版本的 JSF 与应用服务器中的 CDI 基础设施紧密相关,一些新的 JSF 功能仅在这种环境中有效。Spring 的 JSF 支持不再积极发展,主要用于在现代化旧的基于 JSF 的应用程序时进行迁移。

Spring 的 JSF 集成中的关键元素是 JSF ELResolver 机制。

Spring Bean Resolver​

SpringBeanFacesELResolver 是一个符合 JSF 的 ELResolver 实现,集成了 JSF 和 JSP 使用的标准统一 EL。它首先委托给 Spring 的“业务上下文” WebApplicationContext,然后再委托给底层 JSF 实现的默认解析器。

在配置方面,您可以在 JSF faces-context.xml 文件中定义 SpringBeanFacesELResolver,如下例所示:

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

使用 FacesContextUtils​

自定义 ELResolver 在将属性映射到 faces-config.xml 中的 bean 时效果很好,但有时您可能需要显式获取一个 bean。[FacesContextUtils](https://docs.spring.io/spring-framework/docs/6.2.3/javadoc-api/org/springframework/web/jsf/FacesContextUtils.html) 类使这变得简单。它类似于 WebApplicationContextUtils,不同之处在于它接受一个 FacesContext 参数,而不是 ServletContext 参数。

以下示例展示了如何使用 FacesContextUtils:

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

Apache Struts​

由 Craig McClanahan 发明的 Struts 是一个由 Apache 软件基金会托管的开源项目。Struts 1.x 大大简化了 JSP/Servlet 编程范式,并赢得了许多使用专有框架的开发者的青睐。它简化了编程模型;它是开源的;并且拥有一个庞大的社区,这使得该项目得以发展并在 Java Web 开发者中变得流行。

作为原始 Struts 1.x 的继任者,可以查看 Struts 2.x 或更新版本,以及 Struts 提供的 Spring 插件 以实现内置的 Spring 集成。

Apache Tapestry​

Tapestry 是一个“面向组件的框架,用于在 Java 中创建动态、强大、高度可扩展的 Web 应用程序。”

虽然 Spring 有其自身的 强大网络层,但使用 Tapestry 构建网络用户界面并结合 Spring 容器用于底层的企业 Java 应用程序有许多独特的优势。

有关更多信息,请参阅 Tapestry 的专用 Spring 集成模块。

进一步资源​

以下链接提供了关于本章中描述的各种网页框架的更多资源。