Spring - MVC 框架



Spring Web MVC 框架提供模型-檢視-控制器 (MVC) 架構和可用於開發靈活且松耦合 Web 應用程式的現成元件。MVC 模式導致分離應用程式的不同方面(輸入邏輯、業務邏輯和 UI 邏輯),同時提供這些元素之間的松耦合。

  • 模型封裝應用程式資料,通常由 POJO 組成。

  • 檢視負責呈現模型資料,通常生成客戶端瀏覽器可以解釋的 HTML 輸出。

  • 控制器負責處理使用者請求並構建適當的模型,並將其傳遞給檢視進行呈現。

DispatcherServlet

Spring Web 模型-檢視-控制器 (MVC) 框架圍繞一個DispatcherServlet 設計,該DispatcherServlet 處理所有 HTTP 請求和響應。下圖說明了 Spring Web MVC DispatcherServlet 的請求處理工作流程:

Spring DispatcherServlet

以下是對應於傳入 HTTP 請求到DispatcherServlet 的事件序列:

  • 在收到 HTTP 請求後,DispatcherServlet 會諮詢HandlerMapping 以呼叫相應的Controller

  • Controller 獲取請求並根據使用的 GET 或 POST 方法呼叫相應的服務方法。服務方法將根據定義的業務邏輯設定模型資料,並將檢視名稱返回給DispatcherServlet

  • DispatcherServlet 將藉助ViewResolver 獲取請求的定義檢視。

  • 一旦檢視確定,DispatcherServlet 將模型資料傳遞給檢視,最終在瀏覽器上呈現。

所有上述元件,即 HandlerMapping、Controller 和 ViewResolver 都是WebApplicationContext 的一部分,WebApplicationContext 是普通ApplicationContext 的擴充套件,具有一些 Web 應用程式所需的其他功能。

所需配置

您需要使用web.xml 檔案中的 URL 對映來對映您希望DispatcherServlet 處理的請求。以下是一個顯示HelloWeb DispatcherServlet 示例的宣告和對映的示例:

<web-app id = "WebApp_ID" version = "2.4"
   xmlns = "http://java.sun.com/xml/ns/j2ee" 
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://java.sun.com/xml/ns/j2ee 
   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    
   <display-name>Spring MVC Application</display-name>
   
   <servlet>
      <servlet-name>HelloWeb</servlet-name>
      <servlet-class>
         org.springframework.web.servlet.DispatcherServlet
      </servlet-class>
      <load-on-startup>1</load-on-startup>
   </servlet>

   <servlet-mapping>
      <servlet-name>HelloWeb</servlet-name>
      <url-pattern>*.jsp</url-pattern>
   </servlet-mapping>

</web-app>

web.xml 檔案將儲存在 Web 應用程式的 WebContent/WEB-INF 目錄中。在HelloWeb DispatcherServlet 初始化時,框架將嘗試從應用程式 WebContent/WEB-INF 目錄中名為[servlet-name]-servlet.xml 的檔案中載入應用程式上下文。在本例中,我們的檔案將為HelloWebservlet.xml

接下來,<servlet-mapping> 標籤指示哪些 URL 將由哪個 DispatcherServlet 處理。此處,所有以.jsp 結尾的 HTTP 請求都將由HelloWeb DispatcherServlet 處理。

如果您不想使用[servlet-name]-servlet.xml 作為預設檔名,也不想使用WebContent/WEB-INF 作為預設位置,您可以透過在 web.xml 檔案中新增 servlet 監聽器ContextLoaderListener 來自定義此檔名和位置,如下所示:

<web-app...>

   <!-------- DispatcherServlet definition goes here----->
   ....
   <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/HelloWeb-servlet.xml</param-value>
   </context-param>

   <listener>
      <listener-class>
         org.springframework.web.context.ContextLoaderListener
      </listener-class>
   </listener>
   
</web-app>

現在,讓我們檢查HelloWeb-servlet.xml 檔案所需的配置,該檔案位於您的 Web 應用程式的WebContent/WEB-INF 目錄中:

<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:context = "http://www.springframework.org/schema/context"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://www.springframework.org/schema/beans     
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/context 
   http://www.springframework.org/schema/context/spring-context-3.0.xsd">

   <context:component-scan base-package = "com.tutorialspoint" />

   <bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver">
      <property name = "prefix" value = "/WEB-INF/jsp/" />
      <property name = "suffix" value = ".jsp" />
   </bean>

</beans>

以下是關於HelloWeb-servlet.xml 檔案的重要說明:

  • [servlet-name]-servlet.xml 檔案將用於建立定義的 bean,覆蓋全域性範圍內任何具有相同名稱的 bean 的定義。

  • <context:component-scan...> 標籤將用於啟用 Spring MVC 註解掃描功能,該功能允許使用 @Controller 和 @RequestMapping 等註解。

  • InternalResourceViewResolver 將定義用於解析檢視名稱的規則。根據上述定義的規則,名為hello 的邏輯檢視將委託給位於/WEB-INF/jsp/hello.jsp 的檢視實現。

以下部分將向您展示如何建立實際元件,即控制器、模型和檢視。

定義控制器

DispatcherServlet 將請求委託給控制器以執行特定於它的功能。@Controller 註解表示特定類充當控制器的角色。@RequestMapping 註解用於將 URL 對映到整個類或特定處理程式方法。

@Controller
@RequestMapping("/hello")
public class HelloController { 
   @RequestMapping(method = RequestMethod.GET)
   public String printHello(ModelMap model) {
      model.addAttribute("message", "Hello Spring MVC Framework!");
      return "hello";
   }
}

@Controller 註解將類定義為 Spring MVC 控制器。這裡,@RequestMapping 的第一次使用表示此控制器上的所有處理方法都相對於/hello 路徑。下一個註解@RequestMapping(method = RequestMethod.GET) 用於將 printHello() 方法宣告為控制器的預設服務方法,以處理 HTTP GET 請求。您可以在同一 URL 上定義另一個方法來處理任何 POST 請求。

您可以以另一種形式編寫上述控制器,您可以在其中新增其他屬性到@RequestMapping 中,如下所示:

@Controller
public class HelloController {
   @RequestMapping(value = "/hello", method = RequestMethod.GET)
   public String printHello(ModelMap model) {
      model.addAttribute("message", "Hello Spring MVC Framework!");
      return "hello";
   }
}

value 屬性指示處理程式方法對映到的 URL,method 屬性定義服務方法以處理 HTTP GET 請求。關於上面定義的控制器的以下要點需要注意:

  • 您將在服務方法中定義所需的業務邏輯。您可以根據需要在此方法內呼叫另一個方法。

  • 根據定義的業務邏輯,您將在此方法中建立模型。您可以使用 setter 設定不同的模型屬性,這些屬性將被檢視訪問以呈現最終結果。此示例使用其屬性“message”建立模型。

  • 定義的服務方法可以返回一個字串,其中包含要用於呈現模型的檢視的名稱。此示例返回“hello”作為邏輯檢視名稱。

建立 JSP 檢視

Spring MVC 支援針對不同表示技術的多種型別的檢視。這些包括 - JSP、HTML、PDF、Excel 工作表、XML、Velocity 模板、XSLT、JSON、Atom 和 RSS 提要、JasperReports 等。但最常見的是我們使用用 JSTL 編寫的 JSP 模板。

讓我們在 /WEB-INF/hello/hello.jsp 中編寫一個簡單的hello 檢視:

<html>
   <head>
      <title>Hello Spring MVC</title>
   </head>
   
   <body>
      <h2>${message}</h2>
   </body>
</html>

這裡${message} 是我們在控制器內部設定的屬性。您可以有多個屬性在您的檢視中顯示。

Spring Web MVC 框架示例

基於上述概念,讓我們檢查一些重要的示例,這些示例將幫助您構建 Spring Web 應用程式:

序號 示例及描述
1 Spring MVC Hello World 示例

此示例將解釋如何編寫簡單的 Spring Web Hello World 應用程式。

2 Spring MVC 表單處理示例

此示例將解釋如何使用 HTML 表單編寫 Spring Web 應用程式,以將資料提交到控制器並顯示處理後的結果。

3 Spring 頁面重定向示例

瞭解如何在 Spring MVC 框架中使用頁面重定向功能。

4 Spring 靜態頁面示例

瞭解如何在 Spring MVC 框架中訪問靜態頁面以及動態頁面。

5 Spring 異常處理示例

瞭解如何在 Spring MVC 框架中處理異常。

廣告