其他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的标准基于组件的、事件驱动的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 Tapestry
Tapestry 是一个“用于在Java中创建动态、健壮、高度可扩展的Web应用程序的面向组件的框架”。
虽然Spring拥有自己的强大的Web层,但是通过结合使用Tapestry作为Web用户界面和Spring容器作为底层来构建企业级Java应用程序,具有一些独特的优势。
更多信息,请参见Tapestry的专用Spring集成模块。