Spring web MVC 框架提供了模型-視圖-控制的體系結(jié)構(gòu)和可以用來(lái)開發(fā)靈活、松散耦合的 web 應(yīng)用程序的組件。MVC 模式導(dǎo)致了應(yīng)用程序的不同方面(輸入邏輯、業(yè)務(wù)邏輯和 UI 邏輯)的分離,同時(shí)提供了在這些元素之間的松散耦合。
模型封裝了應(yīng)用程序數(shù)據(jù),并且通常它們由 POJO 組成。
視圖主要用于呈現(xiàn)模型數(shù)據(jù),并且通常它生成客戶端的瀏覽器可以解釋的 HTML 輸出。
Spring Web 模型-視圖-控制(MVC)框架是圍繞 DispatcherServlet 設(shè)計(jì)的,DispatcherServlet 用來(lái)處理所有的 HTTP 請(qǐng)求和響應(yīng)。Spring Web MVC DispatcherServlet 的請(qǐng)求處理的工作流程如下圖所示:
下面是對(duì)應(yīng)于 DispatcherServlet 傳入 HTTP 請(qǐng)求的事件序列:
收到一個(gè) HTTP 請(qǐng)求后,DispatcherServlet 根據(jù) HandlerMapping 來(lái)選擇并且調(diào)用適當(dāng)?shù)?em>控制器。
控制器接受請(qǐng)求,并基于使用的 GET 或 POST 方法來(lái)調(diào)用適當(dāng)?shù)?service 方法。Service 方法將設(shè)置基于定義的業(yè)務(wù)邏輯的模型數(shù)據(jù),并返回視圖名稱到 DispatcherServlet 中。
DispatcherServlet 會(huì)從 ViewResolver 獲取幫助,為請(qǐng)求檢取定義視圖。
上面所提到的所有組件,即 HandlerMapping、Controller 和 ViewResolver 是 WebApplicationContext 的一部分,而 WebApplicationContext 是帶有一些對(duì) web 應(yīng)用程序必要的額外特性的 ApplicationContext 的擴(kuò)展。
你需要映射你想讓 DispatcherServlet 處理的請(qǐng)求,通過使用在 web.xml 文件中的一個(gè) URL 映射。下面是一個(gè)顯式聲明和映射 HelloWeb DispatcherServlet 的示例:
web.xml 文件將被保留在你的應(yīng)用程序的 WebContent/WEB-INF 目錄下。好的,在初始化 HelloWeb DispatcherServlet 時(shí),該框架將嘗試加載位于該應(yīng)用程序的 WebContent/WEB-INF 目錄中文件名為 [servlet-name]-servlet.xml
的應(yīng)用程序內(nèi)容。在這種情況下,我們的文件將是 HelloWeb-servlet.xml。
接下來(lái),servlet-mapping
標(biāo)簽表明哪些 URLs 將被 DispatcherServlet 處理。這里所有以 .jsp 結(jié)束的 HTTP 請(qǐng)求將由 HelloWeb DispatcherServle t處理。
如果你不想使用默認(rèn)文件名 [servlet-name]-servlet.xml
和默認(rèn)位置 WebContent/WEB-INF,你可以通過在 web.xml 文件中添加 servlet 監(jiān)聽器 ContextLoaderListener 自定義該文件的名稱和位置,如下所示:
<web-app...>
....
<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>
現(xiàn)在,檢查 HelloWeb-servlet.xml 文件的請(qǐng)求配置,該文件位于 web 應(yīng)用程序的 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>
以下是關(guān)于 HelloWeb-servlet.xml 文件的一些要點(diǎn):
[servlet-name]-servlet.xml
文件將用于創(chuàng)建 bean 定義,重新定義在全局范圍內(nèi)具有相同名稱的任何已定義的 bean。
<context:component-scan>
標(biāo)簽將用于激活 Spring MVC 注釋掃描功能,該功能允許使用注釋,如 @Controller 和 @RequestMapping 等等。
/WEB-INF/jsp/hello.jsp
中實(shí)現(xiàn)的視圖。下一節(jié)將向你展示如何創(chuàng)建實(shí)際的組件,例如控制器,模式和視圖。
DispatcherServlet 發(fā)送請(qǐng)求到控制器中執(zhí)行特定的功能。@Controller 注釋表明一個(gè)特定類是一個(gè)控制器的作用。@RequestMapping 注釋用于映射 URL 到整個(gè)類或一個(gè)特定的處理方法。
@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 注釋定義該類作為一個(gè) Spring MVC 控制器。在這里,第一次使用的 @RequestMapping 表明在該控制器中處理的所有方法都是相對(duì)于 /hello 路徑的。下一個(gè)注釋 @RequestMapping(method = RequestMethod.GET) 用于聲明 printHello() 方法作為控制器的默認(rèn) service 方法來(lái)處理 HTTP GET 請(qǐng)求。你可以在相同的 URL 中定義其他方法來(lái)處理任何 POST 請(qǐng)求。
你可以用另一種形式來(lái)編寫上面的控制器,你可以在 @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";
}
}
值屬性表明 URL 映射到哪個(gè)處理方法,方法屬性定義了 service 方法來(lái)處理 HTTP GET 請(qǐng)求。關(guān)于上面定義的控制器,這里有以下幾個(gè)要注意的要點(diǎn):
你將在一個(gè) service 方法中定義需要的業(yè)務(wù)邏輯。你可以根據(jù)每次需求在這個(gè)方法中調(diào)用其他方法。
基于定義的業(yè)務(wù)邏輯,你將在這個(gè)方法中創(chuàng)建一個(gè)模型。你可以設(shè)置不同的模型屬性,這些屬性將被視圖訪問并顯示最終的結(jié)果。這個(gè)示例創(chuàng)建了一個(gè)帶有屬性 “message” 的模型。
對(duì)于不同的表示技術(shù),Spring MVC 支持許多類型的視圖。這些包括 JSP、HTML、PDF、Excel 工作表、XML、Velocity 模板、XSLT、JSON、Atom 和 RSS 提要、JasperReports 等等。但我們最常使用利用 JSTL 編寫的 JSP 模板。所以讓我們?cè)?/WEB-INF/hello/hello.jsp 中編寫一個(gè)簡(jiǎn)單的 hello 視圖:
<html>
<head>
<title>Hello Spring MVC</title>
</head>
<body>
<h2>${message}</h2>
</body>
</html>
其中,${message} 是我們?cè)诳刂破鲀?nèi)部設(shè)置的屬性。你可以在你的視圖中有多個(gè)屬性顯示。
基于上述概念,讓我們看看一些重要的例子來(lái)幫助你建立 Spring Web 應(yīng)用程序:
序號(hào) | 例子 & 描述 |
---|---|
1 | Spring MVC Hello World Example
這個(gè)例子將解釋如何編寫一個(gè)簡(jiǎn)單的 Spring Web Hello World 應(yīng)用程序。 |
2 | Spring MVC Form Handling Example
這個(gè)例子將解釋如何編寫一個(gè) Spring Web 應(yīng)用程序,它使用 HTML 表單提交數(shù)據(jù)到控制器,并且顯示處理結(jié)果。 |
3 | Spring Page Redirection Example
學(xué)習(xí)在 Spring MVC 框架中如何使用頁(yè)面重定向功能。 |
4 | Spring Static Pages Example
學(xué)習(xí)在 Spring MVC 框架中如何訪問靜態(tài)頁(yè)面和動(dòng)態(tài)頁(yè)面。 |
5 | Spring Exception Handling Example
學(xué)習(xí)在 Spring MVC 框架中如何處理異常。 |
更多建議: