其他 Web 框架
本章詳細介紹 Spring 與第三方 Web 框架的整合。
Spring Framework 的核心價值主張之一是實現*選擇*。廣義而言,Spring 並不強迫您使用或購買任何特定的架構、技術或方法(儘管它肯定會推薦某些方法)。這種選擇最適合開發人員及其開發團隊的架構、技術或方法的自由,在 Web 領域中尤其明顯,Spring 在提供自己的 Web 框架(Spring MVC 和 Spring 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 整合。