跳到主要内容

其他网络框架

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

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

Spring 框架的核心价值主张之一是实现 选择。从一般意义上讲,Spring 不会强迫你使用或接受任何特定的架构、技术或方法论(尽管它确实会推荐某些优于其他的选项)。这种选择架构、技术或方法论的自由,对开发者及其开发团队来说,最明显的体现在 web 领域,在这里 Spring 提供了自己的 web 框架(Spring MVCSpring 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>
xml

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

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

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

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

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

WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);
java

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>
xml

使用 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());
java

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 集成模块

进一步资源

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