对于最新的稳定版本,请使用 Spring Framework 7.0.6!spring-doc.cadn.net.cn

其他Web框架

本章详细介绍了Spring与第三方Web框架的集成。spring-doc.cadn.net.cn

Spring框架的核心价值主张之一就是提供选择。从一般意义上讲,Spring不会强制你使用或接受任何特定的架构、技术或方法(尽管它当然会推荐一些而不是其他)。开发人员及其开发团队可以选择最相关的架构、技术和方法,这种自由在Web领域尤为明显,Spring提供了自己的Web框架(Spring MVCSpring WebFlux),同时支持与许多流行的第三方Web框架集成。spring-doc.cadn.net.cn

通用配置

在深入探讨每个支持的Web框架的集成细节之前,让我们先看一下不特定于任何一个Web框架的常见Spring配置。(本节同样适用于Spring自身的Web框架变种。)spring-doc.cadn.net.cn

Spring轻量级应用模型所倡导的理念之一(由于没有更合适的词)是分层架构。请记住,在"经典"分层架构中,Web层仅是众多层级之一。它作为服务端应用程序的入口点之一,将任务委托给服务层中定义的服务对象(门面),以实现特定业务(且与表示层技术无关)的用例。在Spring中,这些服务对象、其他业务特定对象、数据访问对象等存在于独立的"业务上下文"中,该上下文不包含任何Web层或表示层对象(表示层对象,例如Spring MVC控制器,通常配置在独立的"表示层上下文"中)。本节将详细介绍如何配置包含应用程序中所有"业务Bean"的Spring容器(WebApplicationContext)。spring-doc.cadn.net.cn

具体来说,您只需在Web应用程序的标准Jakarta EE servlet web.xml文件中声明一个 ContextLoaderListener ,并在同一文件中添加一个 contextConfigLocation <context-param/>配置段,用于定义要加载的Spring XML配置文件集合。spring-doc.cadn.net.cn

考虑以下 <listener/> 配置:spring-doc.cadn.net.cn

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

进一步考虑以下 <context-param/> 配置:spring-doc.cadn.net.cn

<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 中。spring-doc.cadn.net.cn

所有Java Web框架都构建在Servlet API之上,因此您可以使用以下代码片段来访问这个由ContextLoaderListener创建的“业务上下文”ApplicationContextspring-doc.cadn.net.cn

以下示例显示了如何获取 WebApplicationContextspring-doc.cadn.net.cn

WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);

WebApplicationContextUtils 类是为了方便,因此您不需要记住 ServletContext 属性的名称。它的 getWebApplicationContext() 方法在对象不存在于 WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE 键下时返回 null。为了避免在应用程序中出现 NullPointerExceptions,最好使用 getRequiredWebApplicationContext() 方法。当 ApplicationContext 缺失时,此方法会抛出异常。spring-doc.cadn.net.cn

一旦你有了对 WebApplicationContext 的引用,就可以通过名称或类型获取 bean。大多数开发人员通过名称获取 bean,然后将其转换为其中一个实现的接口。spring-doc.cadn.net.cn

幸运的是,本节中的大多数框架都有更简单的方式来查找Bean。 它们不仅便于从Spring容器中获取Bean,还允许你在控制器中使用依赖注入。每个Web框架部分都对其特定的集成策略有更详细的说明。spring-doc.cadn.net.cn

JSF

JavaServer Faces (JSF) 是 JCP(Java Community Process)的标准组件化、事件驱动的 Web 用户界面框架。它是 Jakarta EE 技术体系的官方组成部分,同时也可独立使用,例如通过在 Tomcat 中嵌入 Mojarra 或 MyFaces 实现。spring-doc.cadn.net.cn

请注意,JSF的较新版本在应用服务器中与CDI基础设施紧密关联,一些新的JSF功能仅在此类环境中才能正常工作。Spring的JSF支持不再积极发展,主要是在现代化旧的基于JSF的应用程序时用于迁移目的。spring-doc.cadn.net.cn

Spring 的 JSF 集成的关键元素是 JSF ELResolver 机制。spring-doc.cadn.net.cn

Spring Bean解析器

SpringBeanFacesELResolver 是一个兼容 JSF 的 ELResolver 实现, 集成了 JSF 和 JSP 使用的标准统一 EL。它首先委托给 Spring 的"业务上下文" WebApplicationContext,然后再委托给 底层 JSF 实现的默认解析器。spring-doc.cadn.net.cn

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

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

使用 FacesContextUtils

一个自定义的 ELResolver 在将您的属性映射到 faces-config.xml 中的 bean 时效果很好,但有时您可能需要显式获取一个 bean。 FacesContextUtils 类使这变得容易。它类似于 WebApplicationContextUtils,只是它接受一个 FacesContext 参数而不是 ServletContext 参数。spring-doc.cadn.net.cn

以下示例展示了如何使用FacesContextUtilsspring-doc.cadn.net.cn

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

Apache Struts

由Craig McClanahan发明的Struts框架是由Apache软件基金会托管的开源项目。Struts 1.x极大地简化了JSP/Servlet编程范式,赢得了众多使用专有框架的开发者的青睐。它简化了编程模型,采用开源模式,并拥有庞大的社区,这些因素促使该项目不断发展壮大,并在Java Web开发者群体中广受欢迎。spring-doc.cadn.net.cn

作为原始Struts 1.x的继任者,您也可以查看Struts 2.x或更高版本以及Struts提供的 Spring插件以获得内置的Spring集成功能。spring-doc.cadn.net.cn

Apache挂毯

织锦是一个"用于在Java中创建动态、健壮、高度可扩展的Web应用程序的面向组件框架"。spring-doc.cadn.net.cn

虽然Spring有自己的强大的Web层,但结合使用Tapestry作为Web用户界面和Spring容器作为底层层来构建企业Java应用程序有许多独特的优势。spring-doc.cadn.net.cn

有关更多信息,请参阅 Tapestry 的专用 Spring 集成模块spring-doc.cadn.net.cn

更多资源

以下链接指向本章中描述的各种Web框架的其他资源。spring-doc.cadn.net.cn