其他Web框架

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

Spring框架的核心价值主张之一是实现选择。从一般意义上讲,Spring不会强迫您使用或购买任何特定的架构、技术或方法论(尽管它确实推荐某些而不是其他)。Spring在Web领域提供了自己的Web框架(Spring MVCSpring 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 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有自己的强大的Web层,但通过使用Tapestry构建企业Java应用程序的Web用户界面和Spring容器的下层,可以获得许多独特的优势。

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

更多资源

以下链接指向本章中描述的各种Web框架的更多资源。