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