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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值