2,spring MVC的注解驱动控制器,rest风格的支持
作为spring mvc的明星级别的功能,无疑是使得自己的code比较优雅的秘密武器;
参数名 | 意义 | 补充说明 |
value | url的全称 | 支持ant风格和占位符(入参中使用@PathVariable取得占位符的数据),实现REST风格的关键 |
param | 请求参数 | 限定参数名称 |
method | 请求方法 | 最佳实践是get方法获得页面,post方法执行更新操作 |
header | 请求头 | 限定请求的资源类型 |
输入参数 | 说明 | 补充 |
@RequestParam | 指定参数名 | 有value(参数名),required(是否必须),defaul(默认值)t三个属性 |
@CookieValue | 绑定请求中的cookie值 | 比如sessionId,也有同上的三个属性 |
@RequestHeader | 绑定请求报文头的数据 | 比如content-type |
实体对象(命令/表单对象) | 绑定表单的对象 | 通常是一个pojo类,可以级联的指定属性 |
Servlet的api | 支持原生的servlet api | HttpServletRequest,HttpSession,WebRequest |
io流 | InputStream,OutputStream,Reader,Writer | 实际对应Request,response获取的流 |
Local,Principal | 通过Request对象获得 | 设置本地化信息 |
使用方式 | 位置 | 补充 |
@RequestBody /@ResponseBody | 处理方法进行标注 | 访问报文体的数据 |
HttpEntity<T> / ResponseEntity<T> | 作为处理方法的入参或者返回值 | 还可访问报文头的数据 |
需要注意的几点:
1,只有上面的两种方式之一,才调用注册的HttpMessageConverter对请求和响应消息进行处理
2,根据请求的Accept属性选择匹配的转换器
3,不许成对出现,两种方式等效
可以通过声明相应的转换器来处理xml和json数据
处理模型数据:模型数据是spring mvc的核心,控制器处理之后是为了得到模型数据,视图获取模型数据进行渲染呈现给用户;
spring提供的输出模型数据的途径:
途径 | 说明 | 补充 |
ModelAndView | 可在模型中添加数据 | 最终的模型 |
Model 或者Map | map中的数据在返回时会添加到数据模型中 | |
@ModelAttribute | 入参的对象会放到数据模型中 | 在方法级别和入参上添加,先获取方法级别上的数据,然后再执行入参级别的 |
@SessionAttribute | 多个请求可以共享指定的属性 | 可通过属性名称湖综合属性的类型指定内容 |
3,spring MVC的类型转换,格式转化,输入校验
在请求的数据到达入参之前,spring mvc还完成比较多的工作,主要是类型转换,格式转化,输入校验这三类工作,先看看核心流程
核心是DataBinder,conversionService完成类型转换和格式转化的工作,validator完成输入校验的工作
数据转换接口格式转换接口,ConversionService ,通过ConversionServiceFactoryBean在spring中自定义转换器,如果内置的不够用,
自定义可以扩展Coverter<S,T>或者GenericConverter,ConverterFactory;
也可通过@InitBinder来定义单个Contoller专用的类型转换器
或者扩展WebBindingInitializer来指定全局的类型转换器,在AnnotationMethodHandlerAdapter中指定;这里略去;
数据格式化关键接口Formatter<T>,注解驱动格式化的重要接口AnnotationFormateFactory,如图,来指定格式化
内置了对日期和数字的格式转化。
输入校验:spring mvc拥有自己的数据校验框架,同时支持jsr303标准校验框架,但是spring并没有提供jsr303的具体实现,hibernate validator实现了该标准,可以通过引用这个来支持jsr303的校验,
获取校验结果:通过在入参中定一个参数BindingResult即可获得,页面通过spring的标签 <form:errors path="*"/>来显示输入校验的结果;
国际化输入校验结果:略
//todo
4,spring MVC的视图
5,spring MVC的本地化解析,文件上传,静态资源处理,拦截器,异常处理等
6,小结