其他Web框架
本章详细介绍了Spring与第三方Web框架的集成。
Spring框架的核心价值主张之一是实现选择。从一般意义上讲,Spring不会强迫您使用或购买任何特定的架构、技术或方法论(尽管它确实推荐某些而不是其他)。Spring在Web领域提供了自己的Web框架(Spring MVC和Spring WebFlux),同时支持与多个流行的第三方Web框架集成,这种选择自由最明显体现在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框架部分都有关于其特定集成策略的更多详细信息。
JavaServer Faces(JSF)
JavaServer Faces(JSF)是JCP的标准基于组件、事件驱动的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的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
类使这变得容易。它类似于WebApplicationContextUtils
,只是它接受一个FacesContext
参数,而不是ServletContext
参数。
以下示例显示如何使用FacesContextUtils
:
ApplicationContext ctx = FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance());
Apache Tapestry
Tapestry是一个“用于在Java中创建动态、强大、高度可扩展Web应用程序的组件导向框架”。
虽然Spring有自己的强大的Web层,但通过使用Tapestry构建企业Java应用程序的Web用户界面和Spring容器的下层,可以获得许多独特的优势。
有关更多信息,请参阅Tapestry专用的Spring集成模块。