Spring - MVC框架概述



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

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

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

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

DispatcherServlet

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

Spring DispatcherServlet

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

  • 接收到HTTP請求後,DispatcherServlet會查詢處理器對映來呼叫相應的控制器。

  • 控制器接收請求,並根據使用的GETPOST方法呼叫相應的服務方法。服務方法將根據定義的業務邏輯設定模型資料,並將檢視名稱返回給DispatcherServlet。

  • DispatcherServlet將藉助檢視解析器來選擇請求的定義檢視。

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

所有上述元件,即處理器對映、控制器和檢視解析器,都是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的檔案載入應用程式上下文。在本例中,我們的檔案將是HelloWeb-servlet.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>

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

<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請求的服務方法。

以下是關於上面定義的控制器的幾個要點:

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

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

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

建立JSP檢視

Spring MVC支援許多不同表示技術的檢視型別。這些包括 - JSP、HTML、PDF、Excel工作表、XML、Velocity模板、XSLT、JSON、AtomRSS feed、JasperReports等。但是,最常見的是使用JSTL編寫的JSP模板。因此,讓我們在/WEB-INF/hello/hello.jsp中編寫一個簡單的hello檢視:

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

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

廣告
© . All rights reserved.