Spring MVC-概述(轉載實踐)

weixin_33896726發表於2017-08-29

以下內容翻譯自:https://www.tutorialspoint.com/springmvc/springmvc_overview.htm

說明:示例基於Spring MVC 4.1.6

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

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

  • 檢視負責呈現模型資料,並在總體上產生HTML輸出,客戶端的瀏覽器可以解釋。

  • 控制器負責處理使用者的請求和建立適當的模型,並將其傳遞到用於呈現該檢視。

DispatcherServlet

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

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

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

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

  • 所述的DispatcherServlet將幫助從的ViewResolver到拾取該請求的已定義檢視。

  • 一旦檢視完成,DispatcherServlet將模型資料傳遞到最終在瀏覽器上呈現的檢視。

所有上述元件即HandlerMapping,Controller和ViewResolver是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中的檔案將被保留在WebContent/WEB-INF的Web應用程式目錄。OK,初始化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>

現在,我們檢查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請求。上述控制器有以下重點要注意:

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

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

  • 定義的服務方法可以返回一個包含用於渲染模型的檢視(View)名稱的String 。此示例返回“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}是我們在Controller中設定的屬性。您可以在檢視中顯示多個屬性。

相關文章