以下內容翻譯自: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中設定的屬性。您可以在檢視中顯示多個屬性。