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方法接受表单提交的数据;