其他 Web 框架

本章詳細介紹 Spring 與第三方 Web 框架的整合。

Spring Framework 的核心價值主張之一是實現*選擇*。廣義而言,Spring 並不強迫您使用或購買任何特定的架構、技術或方法(儘管它肯定會推薦某些方法)。這種選擇最適合開發人員及其開發團隊的架構、技術或方法的自由,在 Web 領域中尤其明顯,Spring 在提供自己的 Web 框架(Spring MVCSpring WebFlux)的同時,也支援與許多流行的第三方 Web 框架整合。

通用組態

在深入探討每個受支援 Web 框架的整合細節之前,我們先來看看不特定於任何 Web 框架的通用 Spring 組態。(本節同樣適用於 Spring 自己的 Web 框架變體。)

Spring 的輕量級應用程式模型所倡導的概念之一(暫且這麼稱呼)是分層架構。請記住,在「經典」分層架構中,Web 層只是眾多層級之一。它充當伺服器端應用程式的入口點之一,並委派給服務層中定義的服務物件(Facade),以滿足特定業務(和與表示技術無關)的用例。在 Spring 中,這些服務物件、任何其他特定業務物件、資料存取物件和其他物件都存在於一個獨特的「業務 Context」中,該 Context 不包含任何 Web 或表示層物件(表示物件,例如 Spring MVC 控制器,通常在一個獨特的「表示 Context」中組態)。本節詳細介紹如何組態包含應用程式中所有「業務 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 Context 參數,則 ContextLoaderListener 會尋找名為 /WEB-INF/applicationContext.xml 的檔案來載入。載入 Context 檔案後,Spring 會根據 Bean 定義建立一個 WebApplicationContext 物件,並將其儲存在 Web 應用程式的 ServletContext 中。

所有 Java Web 框架都建立在 Servlet API 之上,因此您可以使用以下程式碼片段來存取由 ContextLoaderListener 建立的此「業務 Context」ApplicationContext

以下範例示範如何取得 WebApplicationContext

WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);

WebApplicationContextUtils 類別是為了方便起見,因此您無需記住 ServletContext 屬性的名稱。如果物件在 WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE 金鑰下不存在,則其 getWebApplicationContext() 方法會傳回 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 使用的標準 Unified EL 整合。它首先委派給 Spring 的「業務 Context」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 Software Foundation 託管的開放原始碼專案。Struts 1.x 大大簡化了 JSP/Servlet 程式設計範例,並贏得了許多使用專有框架的開發人員的青睞。它簡化了程式設計模型;它是開放原始碼;並且它有一個龐大的社群,這讓該專案成長並在 Java Web 開發人員中流行起來。

作為原始 Struts 1.x 的後繼者,請查看 Struts 2.x 或更新版本,以及 Struts 提供的 Spring Plugin 以進行內建 Spring 整合。

Apache Tapestry

Tapestry 是一個「面向元件的框架,用於在 Java 中建立動態、穩健、高度可擴展的 Web 應用程式。」

雖然 Spring 有自己的 強大的 Web 層,但使用 Tapestry 作為 Web 使用者介面,並使用 Spring 容器作為較低層級,來建構企業級 Java 應用程式,有許多獨特的優勢。

如需更多資訊,請參閱 Tapestry 專門針對 Spring 的 整合模組

其他資源

以下連結指向本章中描述的各種 Web 框架的其他資源。