Java web高級編程——Spring MVC
使用RequestMapping特性縮小請求匹配範圍:
方法的特性會繼承類@RequestMapping特性;
(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)標準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)模型類型:
返回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;
方式一:RedirectView("/{特性}", true是否相對於與上下文);
方式二:return "home/xxx";(需要配置視圖解析器)
所謂的隱式視圖,值得是並不直接返回View對象或者字符串,而是返回Model;
需要配置視圖名稱轉換:
RequestToViewNameTranslator;由它獲取到視圖或視圖名稱,再通過ViewResolver路由到正確的頁面;
@ModelAttribute:爲模型賦一個指定的鍵名;
除了直接返回視圖/視圖名稱,模型外,你也許並不想只是做一次轉發,而是直接返回響應實體;
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:觸發已配置的內容協商策略;
spring的<form>的modelAttribute特性可以綁定Controller傳遞的模型;
一般可以使用GET方法返回表單頁面;POST方法接受表單提交的數據;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.