【Spring實戰學習筆記】第5章 構建Spring WEB應用程序

目錄

5.1 Spring MVC起步

5.2 編寫基本的控制器

5.3 接受請求的輸入

5.4 處理表單

5.5 小結


SpringMVC基於模型視圖控制器(Model-View-Controller,MVC)模式實現,

它能夠幫你構建像Spring框架那樣靈活和鬆耦合的Web應用程序。

5.1 Spring MVC起步

5.1.1 跟蹤 Spring MVC 的請求

 

SpringMVC所有的請求都會通過一個前端控制器(front controller)Servlet。一個單實例的Servlet將請求委託給應用程序的其他組件來執行實際的處理。在SpringMVC中,DispatcherServlet就是前端控制器。

DispatcherServlet的任務是將請求發送給Spring MVC控制器(controller,控制器是一個用於處理請求的Spring組件)。在典型的應用程序中可能會有多個控制器,DispatcherServlet需要知道應該將請求發送給哪個控制器。所以DispatcherServlet會查詢一個或多個處理器映射(handler mapping)來確定請求的下一站在哪裏。處理器映射會根據請求所攜帶的URL信息來進行決策。

控制器在完成邏輯處理後,通常會產生一些信息,這些信息需要返回給用戶並在瀏覽器上顯示。這些信息被稱爲模型(model)。這些信息需要以用戶友好的方式進行格式化,一般會是HTML。所以,信息需要發送給一個視圖(view)

傳遞給DispatcherServlet的視圖名並不直接表示某個特定視圖。相反,它僅僅傳遞了一個邏輯名稱,這個名字將會用來查找產生結果的真正視圖。DispatcherServlet將會使用視圖解析器(view resolver)來將邏輯視圖名匹配爲一個特定的視圖實現

5.1.2 搭建 Spring MVC

配置 DispatcherServlet

DispatcherServlet是SpringMVC的核心。在這裏請求會第一次接觸到框架,它要負責將請求路由到其他的組件之中。

 

當DispatcherServlet啓動的時候,它會創建Spring應用上下文,並加載配置文件或配置類中所聲明的bean。

啓用 Spring MVC

最簡單的SpringMVC配置就是一個帶有@EnableWebMvc註解的類

 

5.2 編寫基本的控制器

在SpringMVC中,控制器只是方法上添加了@RequestMapping註解的類,這個註解聲明瞭它們所要處理的請求。

Controller是一個構造型(stereotype)的註解,它基於@Component註解。它的目的就是輔助實現組件掃描。類帶有@Controller註解,組件掃描器會自動找到它,並將其聲明爲Spring應用上下文中的一個bean。

@RequestMapping註解,它的value屬性指定了這個方法所要處理的請求路徑,method屬性細化了它所處理的HTTP方法

5.2.1 測試控制器

5.2.2 定義類級別的請求處理

當控制器在類級別上添加@RequestMapping註解時,這個註解會應用到控制器的所有處理器方法上。處理器方法上的@RequestMapping註解會對類級別上的@RequestMapping的聲明進行補充

5.2.3 傳遞模型數據到視圖中

在spittles()方法中給定了一個Model作爲參數。這樣,spittles()方法就能將Repository中獲取到的Spittle列表填充到模型中。Model實際上就是一個Map(也就是key-value對的集合),它會傳遞給視圖,這樣數據就能渲染到客戶端了。

 

5.3 接受請求的輸入

Spring MVC允許以多種方式將客戶端中的數據傳送到控制器的處理器方法中,包括:

  • 查詢參數(Query Parameter)。
  • 路徑變量(Path Variable)。
  • 表單參數(Form Parameter)。

5.3.1 處理查詢參數

查詢參數形如:http://ip:port/url?param1=value1&param2=value2

處理器方法要同時處理有參數和沒有參數的場景。@RequestParam註解的defaultValue屬性可以完成這項任務:

@RequestMapping(method=RequestMethod.GET)

public List<Spittle> spittles(

       @RequestParam(value="max", defaultValue=MAX_LONG_AS_STRING)long max,

       @RequestParam(value="count", defaultValue="20")int count) {

}

 

** 查詢參數都是String類型的

5.3.2 通過路徑參數接受輸入

在理想情況下,要識別的資源(Spittle)應該通過URL路徑進行標示,而不是通過查詢參數。對“/spittles/12345”發起GET請求要優於對“/spittles/show?spittle_id=12345”發起請求。前者能夠識別出要查詢的資源,而後者描述的是帶有參數的一個操作

爲了實現路徑變量,Spring MVC允許我們在@RequestMapping路徑中添加佔位符。佔位符的名稱要用大括號(“{”和“}”)括起來。路徑中的其他部分要與所處理的請求完全匹配,但是佔位符部分可以是任意的值。

@RequestMapping(value="/{spittleId}", method=RequestMethod.GET)

public String spittle(@PathVariable("spittleId")long spittleId, Model model)

{

    model.addAttribute(spittleRepository.findOne(spittleId));

    return"spittle";

}

spittleId參數上添加了@PathVariable("spittleId")註解,這表明在請求路徑中,不管佔位符部分的值是什麼都會傳遞到處理器方法的spittleId參數中。

** 如果@PathVariable中沒有value屬性的話,它會假設佔位符的名稱與方法的參數名相同。這時,如果要重命名參數,必須同時修改佔位符名稱。

5.4 處理表單

使用表單分爲兩個方面:展現表單以及處理用戶通過表單提交的數據

5.4.1 編寫處理表單的控制器

表單的樣式:

控制器:

processRegistration()方法,它接受一個Spitter對象作爲參數。這個對象有firstName、lastName、username和password屬性,這些屬性將會使用請求中同名的參數進行填充

當InternalResourceViewResolver看到視圖格式中的“redirect:”前綴時,它就知道要將其解析爲重定向的規則,而不是視圖的名稱。

5.4.2 校驗表單

Java校驗API定義了多個註解,這些註解可以放到屬性上,從而限制這些屬性的值。所有的註解都位於javax.validation.constraints包中

 

參數添加了@Valid註解,這會告知Spring,需要確保這個對象滿足校驗限制。

5.5 小結

藉助於註解,SpringMVC提供了近似於POJO的開發模式,這使得開發處理請求的控制器變得非常簡單

* @Controller 註解標明一個類是一個控制器

* @RequestMapping 註解的value屬性指定了這個方法所要處理的請求路徑,method屬性細化了它所處理的HTTP方法

* 接受輸入參數的三種方式:查詢參數、路徑變量、表單參數

* 在控制器方法中使用Model,可以將模型數據傳遞到視圖中

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章