Java web高級編程——Spring MVC

1. @ RequestMapping

使用RequestMapping特性縮小請求匹配範圍

方法的特性會繼承類@RequestMapping特性;

1.1 特性

(1)「URL限制」:
可以在中間使用多個通配符;
通過在類上添加URL,來減少冗餘;
匹配多個URL映射是,最具體的映射勝出;
可以將多個URL映射到指定的方法;

(2)「HTTP方法限制」
method特性指定方法;使用方法限制是一個安全的做法;

(3)「請求參數」
params特性:params={"param","param=value","!param", "param!=value"}四種方式限制;

(4)「請求頭限制」
類似參數限制,注意context-type可以對值使用通配符;

(5)「內容類型限制」
請求內容——使用consumes特性(必須匹配請求的Content-Type頭);
響應內容——使用produces特性(必須匹配請求的Accept頭);
如果@Controller類上指定了consumes和produces特性,方法上的設置會覆蓋它們;

1.2 控制器參數方法

(1)標準Servlet類型
HttpServletRequest
HttpServletResponse
HttpSession;
InputStream/Reader;
OutputStream/Writer;
Locale;
使用Spring類型:WebRequest;如果使用了前三個類型,就不應該使用這個類型參數;

(2)註解請求屬性
@RequestParam;
@RequestHeader;
@PathVariable:模塊變量;
@MatrixVari參數able:路徑變量;

(3)綁定表單對象:基於POJO:
@Valid:自動驗證;

(4)請求正文轉換和實體
對於POST,PUT方法,請求正文可能是json或XML等等方式;
使用@RequestBody可以自動轉換爲對應的控制器方法參數;

(5)Multipart請求數據
支持multipart/mixed,multipart/form-data;
通過HTTP消息轉換器,轉換不同類型的數據:JSON,XML或者二進制;

使用@RequestPart("uploads") List<MultipartFile> uploads;
另外表單對象也可以使用List<Part>,spring可以自動獲取值,進行轉換;

(6)模型類型
你可以使用如下類型的非標註類型參數:
Map<String, Oject>;
ModelMap;
Model;

1.3 返回類型

(1)模型類型
返回Map<String, Object>, ModelMap, Model;
使用RequestToViewTranslator自動確定視圖;

(2)視圖類型
View顯示視圖對象;
字符串:由視圖解析器解析;
ModelAndView:同時返回View和模型類型或者字符串視圖名稱;

(3)響應正文實體
return ResponseEntity<User>(user, HttpStatus.OK);
註解方式:@ResponseBody,@ResponseStatus;
@ResponseBody優先其他所有方式;

(4)返回任意類型
類似於參數可以自動裝配表單對象一樣,你可以返回POJO,Spirng會將它設置爲特性;
Spring使用RequestToViewNameTranslator自動確定視圖;

(5)異步類型
返回Callable<?>或DeferredResult<?>,將處理過程放到另一個單獨的線程中;
如果不希望調用異步請求處理的話,可以返回使用View,String等作爲Callable和DeferredResult的類型參數;
仍然可以使用@ResponseBody, @ResponseStatus,@ModelAttribute;

2. 模型和視圖模式(解釋爲什麼可以返回上述類型)

2.1 顯示視圖和視圖名稱

方式一:RedirectView("/{特性}", true是否相對於與上下文);
方式二:return "home/xxx";(需要配置視圖解析器)

2.2 隱式視圖

所謂的隱式視圖,值得是並不直接返回View對象或者字符串,而是返回Model;
需要配置視圖名稱轉換:
RequestToViewNameTranslator;由它獲取到視圖或視圖名稱,再通過ViewResolver路由到正確的頁面;

@ModelAttribute:爲模型賦一個指定的鍵名;

2.3 返回響應實體

除了直接返回視圖/視圖名稱,模型外,你也許並不想只是做一次轉發,而是直接返回響應實體;
HTTP通過Content-Type,除了將請求實體轉換成Java對象外,也要負責將Java對象轉換成響應實體;
而Content可能具有不同的MIME類型;在MIME和Java類型的簡單原則進行轉換;

決定響應實體有3個部分:
(1) HTTP消息轉換器
大部分情況下,spring自動產生的配置是足夠的:
spring維持一個converters列表,按順序添加默認的轉換器(順序很重要,不同轉換器,轉換寬度不同):
ByteArrayHttpMessageConverter;
StringHttpMessageConverter;
FormHttpMessageConverter;
SourceHttpMessageConverter;

如果你要支持XML的轉換,需要自己添加:Configuration類繼承WebMvcConfigureAdapter重寫configureMessageConverters;

(2) 內容協商
Http頭:Accept和服務器端返回的Content-Encoding的協商;
具體的過程就是服務解析客戶端的要求,選擇一個合適的轉換器:
(1)首先查看擴展名;
(2)檢查format參數;
(3)使用Accept希望返回的格式;

重寫WebMvcConfigurerAdapter中的configureContentNegotiation方法;

(3) @ResponseBody:觸發已配置的內容協商策略;

3. 使用表單對象簡化開發: 

spring的<form>的modelAttribute特性可以綁定Controller傳遞的模型;
一般可以使用GET方法返回表單頁面;POST方法接受表單提交的數據;

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