|
对于最新的稳定版本,请使用 Spring Framework 7.0.6! |
其他Web框架
本章详细介绍了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 的引用,就可以通过名称或类型获取 bean。大多数开发人员通过名称获取 bean,然后将其转换为其中一个实现的接口。
幸运的是,本节中的大多数框架都有更简单的方式来查找Bean。 它们不仅便于从Spring容器中获取Bean,还允许你在控制器中使用依赖注入。每个Web框架部分都对其特定的集成策略有更详细的说明。
JSF
JavaServer Faces (JSF) 是 JCP(Java Community Process)的标准组件化、事件驱动的 Web 用户界面框架。它是 Jakarta EE 技术体系的官方组成部分,同时也可独立使用,例如通过在 Tomcat 中嵌入 Mojarra 或 MyFaces 实现。
请注意,JSF的较新版本在应用服务器中与CDI基础设施紧密关联,一些新的JSF功能仅在此类环境中才能正常工作。Spring的JSF支持不再积极发展,主要是在现代化旧的基于JSF的应用程序时用于迁移目的。
Spring 的 JSF 集成的关键元素是 JSF ELResolver 机制。
Spring Bean解析器
SpringBeanFacesELResolver 是一个兼容 JSF 的 ELResolver 实现,
集成了 JSF 和 JSP 使用的标准统一 EL。它首先委托给
Spring 的"业务上下文" WebApplicationContext,然后再委托给
底层 JSF 实现的默认解析器。
在配置方面,您可以在JSF的SpringBeanFacesELResolver文件中定义faces-context.xml,如下例所示:
<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 参数。
以下示例展示了如何使用FacesContextUtils:
ApplicationContext ctx = FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance());
Apache挂毯
织锦是一个"用于在Java中创建动态、健壮、高度可扩展的Web应用程序的面向组件框架"。
虽然Spring有自己的强大的Web层,但结合使用Tapestry作为Web用户界面和Spring容器作为底层层来构建企业Java应用程序有许多独特的优势。
有关更多信息,请参阅 Tapestry 的专用 Spring 集成模块。