Spring MVC概述
Spring MVC框架是一個開源的Java平臺,爲開發強大的基於Java的Web應用程序提供全面的基礎架構支持非常容易和非常快速。
Spring框架最初由Rod Johnson撰寫,並於2003年6月根據Apache 2.0許可證首次發佈。
本教程是基於2015年3月發佈的Spring Framework版本4.1.6
編寫的。
Spring web MVC框架提供了MVC(模型 - 視圖 - 控制器)架構和用於開發靈活和鬆散耦合的Web應用程序的組件。 MVC模式導致應用程序的不同方面(輸入邏輯,業務邏輯和UI邏輯)分離,同時提供這些元素之間的鬆散耦合。
- **模型(Model)**封裝了應用程序數據,通常它們將由
POJO
類組成。 - **視圖(View)**負責渲染模型數據,一般來說它生成客戶端瀏覽器可以解釋HTML輸出。
- **控制器(Controller)**負責處理用戶請求並構建適當的模型,並將其傳遞給視圖進行渲染。
DispatcherServlet組件類
Spring Web模型 - 視圖 - 控制器(MVC)框架是圍繞DispatcherServlet
設計的,它處理所有的HTTP請求和響應。 Spring Web MVC DispatcherServlet的請求處理工作流如下圖所示:
以下是對應於到DispatcherServlet
的傳入HTTP請求的事件順序:
- 在接收到HTTP請求後,
DispatcherServlet
會查詢HandlerMapping
以調用相應的Controller
。 -
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
文件將保存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>
現在來看看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.yiibai" />
<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
註釋掃描功能,允許使用[](https://github.com/Controller "@Controller")[@Controller](https://github.com/Controller "@Controller")
和[](https://github.com/RequestMapping "@RequestMapping")[@RequestMapping](https://github.com/RequestMapping "@RequestMapping")
等註釋。InternalResourceViewResolver
將定義用於解析視圖名稱的規則。根據上面定義的規則,hello
的邏輯視圖將委託給位於/WEB-INF/jsp/hello.jsp
這個視圖來實現。
下一節將演示如何創建實際組件。即:控制器,模型和視圖。
定義控制器
DispatcherServlet
將請求委派給控制器以執行特定於其的功能。 [@Controller](https://github.com/Controller "@Controller")
註釋指示特定類充當控制器的角色。[@RequestMapping](https://github.com/RequestMapping "@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](https://github.com/Controller "@Controller")
註釋將類定義爲Spring MVC
控制器。這裏[@RequestMapping](https://github.com/RequestMapping "@RequestMapping")
的第一個用法表示此控制器上的所有處理方法都與/hello
路徑相關。 下一個註釋[@RequestMapping](https://github.com/RequestMapping "@RequestMapping")(method = RequestMethod.GET)
用於聲明printHello()
方法作爲控制器的默認服務方法來處理HTTP GET請求。可以定義另一個方法來處理同一URL
的任何POST請求。
可以以另一種形式在上面的控制器中編寫,在[@RequestMapping](https://github.com/RequestMapping "@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
」的模型。 - 定義的服務方法可以返回一個
String
,它包含要用於渲染模型的視圖的名稱。此示例將「hello
」返回爲邏輯視圖名稱。
創建JSP視圖
Spring MVC支持許多類型的視圖用於不同的表示技術。包括 - JSP,HTML,PDF,Excel工作表,XML,Velocity模板,XSLT,JSON,Atom 和 RSS 源,JasperReports等。但最常見的是使用JSPL編寫的JSP模板,這裏使用的是JSP模板,並在/WEB-INF/hello/hello.jsp
中寫一個簡單的hello
視圖:
<html>
<head>
<title>Hello Spring MVC</title>
</head>
<body>
<h2>${message}</h2>
</body>
</html>
這裏${message}
是在Controller
中設置的屬性。可以在視圖中顯示多個屬性。