1. 程式人生 > >Spring與Web框架(例如Spring MVC)漫談——關於Spring對於多個Web框架的支援

Spring與Web框架(例如Spring MVC)漫談——關於Spring對於多個Web框架的支援

  在看Spring MVC的官方文件時,最後一章是關於Spring對於其它Web框架的支援(如JSF,Apache Struts 2.x,Tapestry 5.x),當然Spring自己的MVC框架Spring MVC就不用多說了。

  這裡並不想討論其它的Web框架,而是記錄下這章開頭提到的關於Spring為何還要支援其它Web框架。

 

  Spring Framwork的一個核心價值觀是:允許開發者自由選擇。

  一般而言,Spring並不會強迫你使用或者購買某些特別的架構、技術或者方案,儘管它們肯定會特別推薦一些。

  儘管Spring自己也提供了一個Web框架,即Spring MVC,但是選擇這些技術方案的自由取決於開發者以及他們的團隊。

  所以Spring仍然提供了對多個其它Web框架的整合與支援。

 

  不論是選擇什麼樣的Web框架,都需要對Spring進行通用的配置。

  Spring的輕量級應用模型所信奉的理念是:軟體架構需要分層。

  而在“經典”分層體系結構中,web層只是眾多層中的一個。它作為服務端程式的一個入口點,將處理委託給業務邏輯層中的物件(Service objects),進行特定的業務處理。

  在Spring中, service objects,或者business-specific objects、data-access objects或其它,這些都存在與不同的業務上下文中(business context,不包含web或者表示層物件。表示層物件,例如Spring MVC controllers,通常在不同的“表示上下文(presentation context)”中配置)。

  這一章的目的,就是詳細介紹如何配置一個Spring容器(一個WebApplicationContext),然後在這個容器中包含你的應用中所有的business beans。

  你所需要做得是,在Web專案的web.xml中宣告一個ContextLoaderListener的<listen/>元素,併為它新增<context-param/> 元素,以指定Spring的XML配置檔案的載入位置,如下:

<listener>
    <listenerclass>
        org.springframework.web.context.ContextLoaderListener
    
</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext*.xml</param-value> </context-param>

 

  如果沒有指定XML配置檔案,ContextLoaderListener會自動尋找“/WEB-INF/applicationContext.xml”來載入。

  一旦載入完成,Spring便創造了一個基於applicationContext.xml中相關bean定義的WebApplicationContext 物件例項,並把這個例項儲存在Web應用的ServletContext中。(一個Web應用只有一個ServletContext)。

 

  所有的Java Web框架都基於 Servlet API,所以都可以通過以下方式訪問這個由ContextLoaderListener建立的,包含“business context”的ApplicationContext:

WebApplicationContext ctx =  WebApplicationContextUtils.getWebApplicationContext(servletContext);    

 

  WebApplicationContextUtils類是為了方便起見,以便不需要記住ServletContext中對應的屬性名。而如果WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE鍵下不存在物件,則其getWebApplicationContext()方法返回null。

  為了免去在應用程式中獲取NullPointerExceptions的風險,最好使用getRequiredWebApplicationContext()方法。 當ApplicationContext丟失時,此方法丟擲異常。

 

  一旦你有了對WebApplicationContext物件的引用,你就可以根據bean的名稱或型別檢索它們。大多數開發人員按名稱檢索bean,然後將它們轉換為一個其實現的介面。

  而且Web框架都提供了簡易的方式查詢bean,他們不僅可以方便地從Spring的容器中獲取bean,還允許你在它們的Controller上進行依賴注入。