其他Web框架

本章详细介绍了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>

进一步考虑以下<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的标准基于组件的、事件驱动的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

当将属性映射到faces-config.xml中的bean时,自定义的ELResolver运行良好,但是有时您可能需要显式地获取一个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作为Web用户界面和Spring容器作为底层来构建企业级Java应用程序,具有一些独特的优势。

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

更多资源

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