# SpringMVC3強大的請求映射規則詳解 第六章 注解式控制器詳解——跟著開濤學SpringMVC
聲明:本系列都是原創內容,覺得好就頂一個,讓更多人知道!!寫博客不容易,寫原創更不容易!!
## 6.5、請求映射
處理器定義好了,那接下來我們應該定義功能處理方法,接收用戶請求處理并選擇視圖進行渲染。首先我們看一下圖6-1:
```
http請求信息包含六部分信息:
```
```
①請求方法,如GET或POST,表示提交的方式;
```
```
②URL,請求的地址信息;
```
```
③協議及版本;
```
```
④請求頭信息(包括Cookie信息);
```
```
⑤回車換行(CRLF);
```
```
⑥請求內容區(即請求的內容或數據),如表單提交時的參數數據、URL請求參數(?abc=123 ?后邊的)等。
```
```
想要了解HTTP/1.1協議,請訪問[http://tools.ietf.org/html/rfc2616](http://tools.ietf.org/html/rfc2616)。
```
```
那此處我們可以看到有①、②、④、⑥一般是可變的,因此我們可以這些信息進行請求到處理器的功能處理方法的映射,因此請求的映射分為如下幾種:
```
URL路徑映射:使用URL映射請求到處理器的功能處理方法;
請求方法映射限定:如限定功能處理方法只處理GET請求;
請求參數映射限定:如限定只處理包含“abc”請求參數的請求;
請求頭映射限定:如限定只處理“Accept=application/json”的請求。
接下來看看具體如何映射吧。
**6.5.1、URL路徑映射**
#### 6.5.1.1、普通URL路徑映射
@RequestMapping(value={"/test1", "/user/create"}):多個URL路徑可以映射到同一個處理器的功能處理方法。
#### 6.5.1.2、URI模板模式映射
@RequestMapping(value="/users/{userId}"):{×××}占位符, 請求的URL可以是 “/users/123456”或
“/users/abcd”,通過6.6.5講的通過@PathVariable可以提取URI模板模式中的{×××}中的×××變量。
@RequestMapping(value="/users/{userId}/create"):這樣也是可以的,請求的URL可以是“/users/123/create”。
@RequestMapping(value="/users/{userId}/topics/{topicId}"):這樣也是可以的,請求的URL可以是“/users/123/topics/123”。
#### 6.5.1.3、Ant風格的URL路徑映射
@RequestMapping(value="/users/**"):可以匹配“/users/abc/abc”,但“/users/123”將會被【URI模板模式映射中的“/users/{userId}”模式優先映射到】【**詳見4.14的最長匹配優先**】。
@RequestMapping(value="/product?"):可匹配“/product1”或“/producta”,但不匹配“/product”或“/productaa”;
@RequestMapping(value="/product*"):可匹配“/productabc”或“/product”,但不匹配“/productabc/abc”;
@RequestMapping(value="/product/*"):可匹配“/product/abc”,但不匹配“/productabc”;
@RequestMapping(value="/products/**/{productId}"):可匹配“/products/abc/abc/123”或“/products/123”,也就是Ant風格和URI模板變量風格可混用;
此處需要注意的是【**4.14中提到的最長匹配優先**】,Ant風格的模式請參考4.14。
#### 6.5.1.4、正則表達式風格的URL路徑映射
從Spring3.0開始支持正則表達式風格的URL路徑映射,格式為{變量名:正則表達式},這樣我們就可以通過6.6.5講的通過@PathVariable提取模式中的{×××:正則表達式匹配的值}中的×××變量了。
@RequestMapping(value="/products/{categoryCode:\\d+}-{pageNumber:\\d+}"):可以匹配“/products/123-1”,但不能匹配“/products/abc-1”,這樣可以設計更加嚴格的規則。
**正則表達式風格的URL路徑映射是一種特殊的URI模板模式映射:**
URI模板模式映射是{userId},不能指定模板變量的數據類型,如是數字還是字符串;
正則表達式風格的URL路徑映射,可以指定模板變量的數據類型,可以將規則寫的相當復雜。
#### 6.5.1.5、組合使用是“或”的關系
如 @RequestMapping(value={"/test1", "/user/create"})組合使用是或的關系,即“/test1”或“/user/create”請求URL路徑都可以映射到@RequestMapping指定的功能處理方法。
以上URL映射的測試類為:cn.javass.chapter6.web.controller.mapping.MappingController.java。
到此,我們學習了Spring Web MVC提供的強大的URL路徑映射,而且可以實現非常復雜的URL規則。Spring Web MVC不僅僅提供URL路徑映射,還提供了其他強大的映射規則。接下來我們看一下請求方法映射限定吧。
**6.5.2、請求方法映射限定**
一般我們熟悉的表單一般分為兩步:第一步展示,第二步提交,如4.9、SimpleFormController那樣,那如何通過@RequestMapping來實現呢?
#### 6.5.2.1、請求方法映射限定
我們熟知的,展示表單一般為GET請求方法;提交表單一般為POST請求方法。但6.5.1節講的URL路徑映射方式對任意請求方法是全盤接受的,因此我們需要某種方式來告訴相應的功能處理方法只處理如GET請求方法的請求或POST請求方法的請求。
接下來我們使用@RequestMapping來實現SimpleFormController的功能吧。
```
package cn.javass.chapter6.web.controller.method;
//省略import
@Controller
@RequestMapping("/customers/**") //①處理器的通用映射前綴
public class RequestMethodController {
@RequestMapping(value="/create", method = RequestMethod.GET)//②類級別的@RequestMapping窄化
public String showForm() {
System.out.println("===============GET");
return "customer/create";
}
@RequestMapping(value="/create", method = RequestMethod.POST)//③類級別的@RequestMapping窄化
public String submit() {
System.out.println("================POST");
return "redirect:/success";
}
}
```
①處理器的通用映射前綴(父路徑):表示該處理器只處理匹配“/customers/**”的請求;
②對類級別的@RequestMapping進行窄化,表示showForm可處理匹配“/customers/**/create”且請求方法為“GET”的請求;
③對類級別的@RequestMapping進行窄化,表示submit可處理匹配“/customers/**/create”且請求方法為“POST”的請求。
#### 6.5.2.2、組合使用是“或”的關系
@RequestMapping(value="/methodOr", method = {RequestMethod._POST_, RequestMethod._GET_}):即請求方法可以是 GET 或 POST。
提示:
1、一般瀏覽器只支持GET、POST請求方法,如想瀏覽器支持PUT、DELETE等請求方法只能模擬,稍候章節介紹。
2、除了GET、POST,還有HEAD、OPTIONS、PUT、DELETE、TRACE。
3、DispatcherServlet默認開啟對 GET、POST、PUT、DELETE、HEAD的支持;
4、如果需要支持OPTIONS、TRACE,請添加DispatcherServlet在web.xml的初始化參數:dispatchOptionsRequest 和 dispatchTraceRequest 為true。
請求方法的詳細使用請參考RESTful架構風格一章。
以上請求方法映射限定測試類為:cn.javass.chapter6.web.controller.method.RequestMethodController。
**6.5.3、請求參數數據映射限定**
#### 6.5.3.1、請求數據中有指定參數名
```
package cn.javass.chapter6.web.controller.parameter;
//省略import
@Controller
@RequestMapping("/parameter1") //①處理器的通用映射前綴
public class RequestParameterController1 {
//②進行類級別的@RequestMapping窄化
@RequestMapping(params="create", method=RequestMethod.GET)
public String showForm() {
System.out.println("===============showForm");
return "parameter/create";
}
//③進行類級別的@RequestMapping窄化
@RequestMapping(params="create", method=RequestMethod.POST)
public String submit() {
System.out.println("================submit");
return "redirect:/success";
}
}
```
②@RequestMapping(params="create", method=RequestMethod._GET_)?:表示請求中有“create”的參數名且請求方法為“GET”即可匹配,如可匹配的請求URL“http://×××/parameter1?create”;
③@RequestMapping(params="create", method=RequestMethod._POST_):表示請求中有“create”的參數名且請求方法為“POST”即可匹配;
此處的create請求參數名表示你請求的動作,即你想要的功能的一個標識,常見的CRUD(增刪改查)我們可以使用如下請求參數名來表達:
**◇**(create請求參數名?且?GET請求方法)?新增頁面展示、(create請求參數名?且?POST請求方法)新增提交;
**◇**(update請求參數名?且?GET請求方法)?新增頁面展示、(update請求參數名?且?POST請求方法)新增提交;
**◇**(delete請求參數名?且?GET請求方法)?新增頁面展示、(delete請求參數名?且?POST請求方法)新增提交;
**◇**(query請求參數名?且?GET請求方法)?新增頁面展示、(query請求參數名?且?POST請求方法)?新增提交;
**◇**(list請求參數名?且?GET請求方法)?列表頁面展示;
**◇**(view請求參數名?且?GET請求方法)?查看單條記錄頁面展示。
#### 6.5.3.2、請求數據中沒有指定參數名
```
//請求參數不包含 create參數名
@RequestMapping(params="!create", method=RequestMethod.GET)//進行類級別的@RequestMapping窄化
```
@RequestMapping(params="!create", method=RequestMethod._GET_):表示請求中沒有“create”參數名且請求方法為“GET”即可匹配,如可匹配的請求URL“http://×××/parameter1?abc”。
#### 6.5.3.3、請求數據中指定參數名=值
```
package cn.javass.chapter6.web.controller.parameter;
//省略import
@Controller
@RequestMapping("/parameter2") //①處理器的通用映射前綴
public class RequestParameterController2 {
//②進行類級別的@RequestMapping窄化
@RequestMapping(params="submitFlag=create", method=RequestMethod.GET)
public String showForm() {
System.out.println("===============showForm");
return "parameter/create";
}
//③進行類級別的@RequestMapping窄化
@RequestMapping(params="submitFlag=create", method=RequestMethod.POST)
public String submit() {
System.out.println("===============submit");
return "redirect:/success";
}
}
```
②@RequestMapping(params="submitFlag=create", method=RequestMethod._GET_):表示請求中有“submitFlag=create”請求參數且請求方法為“GET”即可匹配,如請求URL為[http://×××/parameter2?submitFlag=create](http://localhost:9080/springmvc-chapter6/parameter?submitFlag=toCreate);
③@RequestMapping(params="submitFlag=create", method=RequestMethod._POST_):表示請求中有“submitFlag=create”請求參數且請求方法為“POST”即可匹配;
此處的submitFlag=create請求參數表示你請求的動作,即你想要的功能的一個標識,常見的CRUD(增刪改查)我們可以使用如下請求參數名來表達:
**◇**(submitFlag=create請求參數名?且?GET請求方法)?新增頁面展示、(submitFlag=create請求參數名?且?POST請求方法)?新增提交;
**◇**(submitFlag=update請求參數名?且?GET請求方法)?新增頁面展示、(submitFlag=update請求參數名?且?POST請求方法)?新增提交;
**◇**(submitFlag=delete請求參數名?且?GET請求方法)?新增頁面展示、(submitFlag=delete請求參數名?且?POST請求方法)?新增提交;
**◇**(submitFlag=query請求參數名?且?GET請求方法)?新增頁面展示、(submitFlag=query請求參數名?且?POST請求方法)?新增提交;
**◇**(submitFlag=list請求參數名?且?GET請求方法)?列表頁面展示;
**◇**(submitFlag=view請求參數名?且?GET請求方法)?查看單條記錄頁面展示。
#### 6.5.3.4、請求數據中指定參數名!=值
```
//請求參數submitFlag 不等于 create
@RequestMapping(params="submitFlag!=create", method=RequestMethod.GET)
```
@RequestMapping(params="submitFlag!=create", method=RequestMethod._GET_):表示請求中的參數“submitFlag!=create”且請求方法為“GET”即可匹配,如可匹配的請求URL“http://×××/parameter1?submitFlag=abc”。
#### 6.5.3.5、組合使用是“且”的關系
```
@RequestMapping(params={"test1", "test2=create"}) //②進行類級別的@RequestMapping窄化
```
@RequestMapping(params={"test1",?"test2=create"}):表示請求中的有“test1”參數名?且?有“test2=create”參數即可匹配,如可匹配的請求URL“http://×××/parameter3?test1&test2=create。
以上請求參數數據映射限定測試類為:cn.javass.chapter6.web.controller.method包下的RequestParameterController1、RequestParameterController2、RequestParameterController3。
**6.5.4、請求頭數據映射限定**
#### 6.5.4.1、準備環境
瀏覽器:建議chrome最新版本;
插件:ModHeader
安裝地址:[https://chrome.google.com/webstore/detail/idgpnmonknjnojddfkpgkljpfnnfcklj](https://chrome.google.com/webstore/detail/idgpnmonknjnojddfkpgkljpfnnfcklj)
插件安裝步驟:
1、打開[https://chrome.google.com/webstore/detail/idgpnmonknjnojddfkpgkljpfnnfcklj](https://chrome.google.com/webstore/detail/idgpnmonknjnojddfkpgkljpfnnfcklj),如圖6-2

圖6-2
2、點擊“添加至chrome”后彈出“確認安裝”對話框,點擊“安裝”按鈕即可,如圖6-3:

圖6-3
3、安裝成功后,在瀏覽器右上角出現如圖6-4的圖標表示安裝成功:

圖6-4
4、鼠標右擊右上角的“Modify Header”圖標,選擇選項,打開如圖6-5:

圖6-5
7、修改完成后,輸入URL請求,你可以在chrome的“開發人員工具的”網絡選項卡下,看到如圖6-7的信息表示添加請求頭成功了:

圖6-7
到此我們的工具安裝完畢,接下來看看如何使用請求頭數據進行映射限定。
#### 6.5.4.2、請求頭數據中有指定參數名
@RequestMapping(value="/header/test1", headers =?"Accept"):表示請求的URL必須為“/header/test1”
且 請求頭中必須有Accept參數才能匹配。
@RequestMapping(value="/header/test1", headers =?"abc"):表示請求的URL必須為“/header/test1”
且 請求頭中必須有abc參數才能匹配,如圖6-8時可匹配。

圖6-8
#### 6.5.4.3、請求頭數據中沒有指定參數名
@RequestMapping(value="/header/test2", headers =?"!abc"):表示請求的URL必須為“/header/test2”
且 請求頭中必須沒有abc參數才能匹配。(將Modify Header的abc參數值刪除即可)。

#### 6.5.4.4、請求頭數據中指定參數名=值
@RequestMapping(value="/header/test3", headers =?"Content-Type=application/json"):表示請求的URL必須為“/header/test3”?且 請求頭中必須有“Content-Type=application/json”參數即可匹配。(將Modify Header的Content-Type參數值改為“application/json”即可);

當你請求的URL為“/header/test3”?但?如果請求頭中沒有或不是“Content-Type=application/json”參數(如“text/html”其他參數),將返回“HTTP Status 415”狀態碼【表示不支持的媒體類型(Media Type),也就是MIME類型】,即我們的功能處理方法只能處理application/json的媒體類型。
@RequestMapping(value="/header/test4", headers =?"Accept=application/json"):表示請求的URL必須為“/header/test4”?且 請求頭中必須有“Accept =application/json”參數即可匹配。(將Modify Header的Accept參數值改為“application/json”即可);

當你請求的URL為“/header/test4”?但?如果請求頭中沒有“Accept=application/json”參數(如“text/html”其他參數),將返回“HTTP Status 406”狀態碼【不可接受,服務器無法根據Accept頭的媒體類型為客戶端生成響應】,即客戶只接受“application/json”媒體類型的數據,即我們的功能處理方法的響應只能返回“application/json”媒體類型的數據。
@RequestMapping(value="/header/test5", headers =?"Accept=text/*")?:表示請求的URL必須為“/header/test5”?且 請求頭中必須有如“Accept=text/plain”參數即可匹配。(將Modify Header的Accept參數值改為“text/plain”即可);
Accept=text/*:表示主類型為text,子類型任意,如“text/plain”、“text/html”等都可以匹配。
@RequestMapping(value="/header/test6", headers =?"Accept=*/*")?:表示請求的URL必須為“/header/test6”?且 請求頭中必須有任意Accept參數即可匹配。(將Modify Header的Accept參數值改為“text/html”或“application/xml”等都可以)。
Accept=*/*:表示主類型任意,子類型任意,如“text/plain”、“application/xml”等都可以匹配。
#### 6.5.4.5、請求頭數據中指定參數名!=值
@RequestMapping(value="/header/test7", headers =?"Accept!=text/vnd.wap.wml"):表示請求的URL必須為“/header/test7”?且 請求頭中必須有“Accept”參數但值不等于“text/vnd.wap.wml”即可匹配。
#### 6.5.4.6、組合使用是“且”的關系
@RequestMapping(value="/header/test8", headers = {"Accept!=text/vnd.wap.wml","abc=123"}):表示請求的URL必須為“/header/test8”?且 請求頭中必須有“Accept”參數但值不等于“text/vnd.wap.wml”且 請求中必須有參數“abc=123”即可匹配。
注:Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
如果您的請求中含有Accept:“*/*”,則可以匹配功能處理方法上的如“text/html”、“text/*”,“application/xml”等。
[源代碼下載](/blog/1683388)
### 目錄:[
第一章 Web MVC簡介 —— 跟開濤學SpringMVC](/blog/1593441 "第一章 Web MVC簡介 —— 跟開濤學SpringMVC")
### [第二章 Spring MVC入門 —— 跟開濤學SpringMVC](/blog/1594806 "第二章 Spring MVC入門 —— 跟開濤學SpringMVC ")
### [第三章 DispatcherServlet詳解 ——跟開濤學SpringMVC](/blog/1602617 "第三章 DispatcherServlet詳解 ——跟開濤學SpringMVC")
### [第四章 Controller接口控制器詳解(1)——跟著開濤學SpringMVC](/blog/1608234 "第四章 Controller接口控制器詳解(1)——跟著開濤學SpringMVC")
### [第四章 Controller接口控制器詳解(2)——跟著開濤學SpringMVC](/blog/1611743 "第四章 Controller接口控制器詳解(2)——跟著開濤學SpringMVC")
### [第四章 Controller接口控制器詳解(3)——跟著開濤學SpringMVC](/blog/1622684 "第四章 Controller接口控制器詳解(3)——跟著開濤學SpringMVC")
### [第四章 Controller接口控制器詳解(4)——跟著開濤學SpringMVC](/blog/1629956 "第四章 Controller接口控制器詳解(4)——跟著開濤學SpringMVC")
### [第四章 Controller接口控制器詳解(5)——跟著開濤學SpringMVC](/blog/1630585 "第四章 Controller接口控制器詳解(5)——跟著開濤學SpringMVC")
### [第四章 Controller接口控制器詳解(6)——跟著開濤學SpringMVC](http://www.iteye.com/blogs/subjects/records/1594 "第四章 Controller接口控制器詳解(6)——跟著開濤學SpringMVC")
### [第五章 處理器攔截器詳解——跟著開濤學SpringMVC](http://www.iteye.com/blogs/subjects/records/1655 "第五章 處理器攔截器詳解——跟著開濤學SpringMVC")
### ?[注解式控制器運行流程及處理器定義 第六章 注解式控制器詳解——跟著開濤學SpringMVC](http://www.iteye.com/blogs/subjects/records/1684 "注解式控制器運行流程及處理器定義 第六章 注解式控制器詳解——跟著開濤學SpringMVC")
- 跟我學 Spring3
- 【第二章】 IoC 之 2.1 IoC基礎 ——跟我學Spring3
- 【第二章】 IoC 之 2.2 IoC 容器基本原理 ——跟我學Spring3
- 【第二章】 IoC 之 2.3 IoC的配置使用——跟我學Spring3
- 【第三章】 DI 之 3.1 DI的配置使用 ——跟我學spring3
- 【第三章】 DI 之 3.2 循環依賴 ——跟我學spring3
- 【第三章】 DI 之 3.3 更多DI的知識 ——跟我學spring3
- 【第三章】 DI 之 3.4 Bean的作用域 ——跟我學spring3
- 【第四章】 資源 之 4.1 基礎知識 ——跟我學spring3
- 【第四章】 資源 之 4.2 內置Resource實現 ——跟我學spring3
- 【第四章】 資源 之 4.3 訪問Resource ——跟我學spring3
- 【第四章】 資源 之 4.4 Resource通配符路徑 ——跟我學spring3
- 【第五章】Spring表達式語言 之 5.1 概述 5.2 SpEL基礎 ——跟我學spring3
- 【第五章】Spring表達式語言 之 5.3 SpEL語法 ——跟我學spring3
- 【第五章】Spring表達式語言 之 5.4在Bean定義中使用EL—跟我學spring3
- 【第六章】 AOP 之 6.1 AOP基礎 ——跟我學spring3
- 【第六章】 AOP 之 6.2 AOP的HelloWorld ——跟我學spring3
- 【第六章】 AOP 之 6.3 基于Schema的AOP ——跟我學spring3
- 【第六章】 AOP 之 6.4 基于@AspectJ的AOP ——跟我學spring3
- 【第六章】 AOP 之 6.5 AspectJ切入點語法詳解 ——跟我學spring3
- 【第六章】 AOP 之 6.6 通知參數 ——跟我學spring3
- 【第六章】 AOP 之 6.7 通知順序 ——跟我學spring3
- 【第六章】 AOP 之 6.8 切面實例化模型 ——跟我學spring3
- 【第六章】 AOP 之 6.9 代理機制 ——跟我學spring3
- 【第七章】 對JDBC的支持 之 7.1 概述 ——跟我學spring3
- 【第七章】 對JDBC的支持 之 7.2 JDBC模板類 ——跟我學spring3
- 【第七章】 對JDBC的支持 之 7.3 關系數據庫操作對象化 ——跟我學spring3
- 【第七章】 對JDBC的支持 之 7.4 Spring提供的其它幫助 ——跟我學spring3【私塾在線原創】
- 【第七章】 對JDBC的支持 之 7.5 集成Spring JDBC及最佳實踐 ——跟我學spring3
- 【第八章】 對ORM的支持 之 8.1 概述 ——跟我學spring3
- 【第八章】 對ORM的支持 之 8.2 集成Hibernate3 ——跟我學spring3
- 【第八章】 對ORM的支持 之 8.3 集成iBATIS ——跟我學spring3
- 【第八章】 對ORM的支持 之 8.4 集成JPA ——跟我學spring3
- 【第九章】 Spring的事務 之 9.1 數據庫事務概述 ——跟我學spring3
- 【第九章】 Spring的事務 之 9.2 事務管理器 ——跟我學spring3
- 【第九章】 Spring的事務 之 9.3 編程式事務 ——跟我學spring3
- 【第九章】 Spring的事務 之 9.4 聲明式事務 ——跟我學spring3
- 【第十章】集成其它Web框架 之 10.1 概述 ——跟我學spring3
- 【第十章】集成其它Web框架 之 10.2 集成Struts1.x ——跟我學spring3
- 【第十章】集成其它Web框架 之 10.3 集成Struts2.x ——跟我學spring3
- 【第十章】集成其它Web框架 之 10.4 集成JSF ——跟我學spring3
- 【第十一章】 SSH集成開發積分商城 之 11.1 概述 ——跟我學spring3
- 【第十一章】 SSH集成開發積分商城 之 11.2 實現通用層 ——跟我學spring3
- 【第十一章】 SSH集成開發積分商城 之 11.3 實現積分商城層 ——跟我學spring3
- 【第十二章】零配置 之 12.1 概述 ——跟我學spring3
- 【第十二章】零配置 之 12.2 注解實現Bean依賴注入 ——跟我學spring3
- 【第十二章】零配置 之 12.3 注解實現Bean定義 ——跟我學spring3
- 【第十二章】零配置 之 12.4 基于Java類定義Bean配置元數據 ——跟我學spring3
- 【第十二章】零配置 之 12.5 綜合示例-積分商城 ——跟我學spring3
- 【第十三章】 測試 之 13.1 概述 13.2 單元測試 ——跟我學spring3
- 【第十三章】 測試 之 13.3 集成測試 ——跟我學spring3
- 跟我學 Spring MVC
- SpringMVC + spring3.1.1 + hibernate4.1.0 集成及常見問題總結
- Spring Web MVC中的頁面緩存支持 ——跟我學SpringMVC系列
- Spring3 Web MVC下的數據類型轉換(第一篇)——《跟我學Spring3 Web MVC》搶先看
- Spring3 Web MVC下的數據格式化(第二篇)——《跟我學Spring3 Web MVC》搶先看
- 第一章 Web MVC簡介 —— 跟開濤學SpringMVC
- 第二章 Spring MVC入門 —— 跟開濤學SpringMVC
- 第三章 DispatcherServlet詳解 ——跟開濤學SpringMVC
- 第四章 Controller接口控制器詳解(1)——跟著開濤學SpringMVC
- 第四章 Controller接口控制器詳解(2)——跟著開濤學SpringMVC
- 第四章 Controller接口控制器詳解(3)——跟著開濤學SpringMVC
- 第四章 Controller接口控制器詳解 (4)——跟著開濤學SpringMVC
- 第四章 Controller接口控制器詳解(5)——跟著開濤學SpringMVC
- 跟著開濤學SpringMVC 第一章源代碼下載
- 第二章 Spring MVC入門 源代碼下載
- 第四章 Controller接口控制器詳解 源代碼下載
- 第四章 Controller接口控制器詳解(6)——跟著開濤學SpringMVC
- 第四章 Controller接口控制器詳解(7 完)——跟著開濤學SpringMVC
- 第五章 處理器攔截器詳解——跟著開濤學SpringMVC
- 源代碼下載 第五章 處理器攔截器詳解——跟著開濤學SpringMVC
- 注解式控制器運行流程及處理器定義 第六章 注解式控制器詳解——跟著開濤學SpringMVC
- 源代碼下載 第六章 注解式控制器詳解
- SpringMVC3強大的請求映射規則詳解 第六章 注解式控制器詳解——跟著開濤學SpringMVC
- Spring MVC 3.1新特性 生產者、消費者請求限定 —— 第六章 注解式控制器詳解——跟著開濤學SpringMVC
- SpringMVC強大的數據綁定(1)——第六章 注解式控制器詳解——跟著開濤學SpringMVC
- SpringMVC強大的數據綁定(2)——第六章 注解式控制器詳解——跟著開濤學SpringMVC
- SpringMVC數據類型轉換——第七章 注解式控制器的數據驗證、類型轉換及格式化——跟著開濤學SpringMVC
- SpringMVC數據格式化——第七章 注解式控制器的數據驗證、類型轉換及格式化——跟著開濤學SpringMVC
- SpringMVC數據驗證——第七章 注解式控制器的數據驗證、類型轉換及格式化——跟著開濤學SpringMVC