一、概述
1、springmvc 特点
- 注解开发很方便;
- 支持rest风格url;
2、HelloWorld程序
- 导包:四个spring 核心包、一个aop包、两个 web 包和一个logging 包;
- 配置 web xml 就是配置一个 dispatcherServlet,设置开机自启,指定springmvc配置文件位置;
- 配置springmvc文件,就是一个包扫描和一个视图解析器(前后缀);
- 写一个类用@controller 标记,其中的方法用@requestMapping来实现和url 的映射关系;
二、使用及原理(注解开发)
1、@requestMapping 注解
(1)可以用在方法和类上,起到窄化请求的作用;
(2)其中的属性还包含 method、param 和 header,都是更加精确请求的作用;
(3)@PathVariable 注解指定 url 占位符和方法参数之间的映射;
2、rest 风格 URL
(1)CRUD 示例
- 新增:/order post
- 删除:/order/1 delete
- 修改:/order/1 put
- 查询:/order/1 get
(2)put 和 delete 请求怎么发送
- web xml 中配置 HiddenhttpMethodFilter;
- 发送 post 请求;
- 表单中增加一个 name=“_method” 的隐藏域,其值是 delete 和 put;
3、参数相关注解
(1)@RequestParam注解
- 作用就是映射请求参数;
- 注解有三个属性:value(请求参数的名字)、required(默认为true)、defaultValue(请参的默认值)
(2)@RequestHeader 和 @CookieValue 注解
- 作用就是将请求头和cookie 的信息映射到方法的参数;
- 注解的属性和用法都和requestParam 差不多;
(3)请求参数映射到 pojo
- 保证请求参数的名字和pojo 的属性名一致即可自动完成映射,还支持级联属性;
- 名字不一则无法映射,相应的值为 null;
(4)方法参数还支持 servlet 的原生 API,支持的类型包括:
- request、response、session、Principal
- InputStream、outputStream、reader、writer
4、模型数据处理
(1)方法返回 ModelAndView
- mv 可以包含视图和模型的信息;最终这些数据都是存放到 request 域中;
(2)方法可以添加 Map 或者 Model 类型的参数
(3)@sessionAttributes
- 这个注解是类注解,不能修饰方法;
- 可以通过名称指定也可以通过类型来指定放到 session 中的数据;
5、目标方法 pojo 类型入参过程
(1)@ModelAttribute注解:这个注解标记的方法会在每个目标方法执行前被执行
1、基本过程
- 执行这个注解修饰的方法,从数据库中取出对象放入 map,键值类名首字母小写;
- 从 map 中取出对象,并把表单传来的请求参数赋值到对象的相应属性中;
- 对象传入目标方法参数;
2、修饰目标方法参数
- springmvc 会用这个注解中指定的名称到 implicitModel 去找对象,找到就直接入参;
- 同时会将这个名称为key,pojo对象为 value 存到 request 中;
(2)pojo 入参过程
(3)使用 @sessionAttributes 注解抛出异常的解决方法
- sessionAttributes 中的名称和方法参数 modelAttribute 中指定的名称不一致即可;
- 要么就是必须得有 modelAttribute 标记的方法,保证能够取到 sessionAttributes 名称对应的对象就不会抛异常;
6、视图解析
(1)视图解析流程
- 目标方法无论返回的是 string、model还是 mv,最终都是包装成 modelAndView返回;
- 视图的作用:渲染模型数据;
- 视图解析器的作用:将逻辑视图转换为物理视图;
- 常用的视图解析器:BeanNameViewResolver 和 InternalResourceViewResolver;配置多个解析器的话存在优先级的;
(2)jstlView 和 view-controller 标签
- 项目加入jstl 的jar,springmvc 自动将视图解析为 jstlView;
- 若要使用 jstl fmt 标签要在 springmvc 的配置文件中配置一个 messageSource;
- view-controller 和 annotion-driven 标签合起来使用可以实现直接将请求跳转到视图,不用经过 handler;
(3)自定义视图和重定向
- 自定义视图:实现view 接口,重写 render 方法;最后还要在 springmvc 的配置文件中配置beanNameViewresolver,注意解析器的优先级;
- 转发和重定向:就是在 return 的 String 中加入前缀 forward: 或者 redirect:
三、其他补充
1、RESTFULL-CRUD
(1)spring 的表单标签
(2)springmvc 的静态资源映射
(3)a 标签的 get 请求转 post 通过 js 完成
(4)方法入参的时候对象在 map 中的键名没有指定的话默认就是类名第一个字母小写
2、数据绑定
(1)数据绑定的流程:核心就是DataBinder
(2)数据转换
- springmvc 内置了很多类型转换器,一般情况下不需要我们自己写;
- 自定义类型转换器
- 第一步:实现 Converter<S,T>接口,重写方法实现想要的类型转换;
- 第二步:在 spring 的 ioc 容器中配置convertionService;
- 第三步:mvc:annotion-driven注解中配置 convertionService,将这个注册到 springmvc 的上下文中;
(3)关于mvc:annotation-driven
- 这个标签会自动注册RequestMappingHandlerMapping 、RequestMappingHandlerAdapter、ExceptionHandlerExceptionResolver 三个bean;
- 此外还支持配置convertionService,还支持格式化注解(@NumberFormat annotation、@DateTimeFormat)验证注解(@Valid)请求响应体注解(@RequestBody 和 @ResponseBody)
(4)@InitBinder 注解
- @InitBinder 标识的方法,可以对 WebDataBinder 对 象进行初始化;
- WebDataBinder 是 DataBinder 的子类,用 于完成由表单字段到 JavaBean 属性的绑定 ;
- @InitBinder方法不能有返回值,它必须声明为void;
- @InitBinder方法的参数通常是WebDataBinder;
3、数据格式化
(1)前提
- 数据格式化相关的bean:FormattingConversionServiceFactroyBean;
- <mvc:annotation-driven/> 默认创建的ConversionService 实例即为FormattingConversionServiceFactroyBean;
(2)日期格式化和数值格式化示例
4、数据校验
(1)校验框架
- JSR 303 是 Java 为 Bean 数据合法性校验提供的标准框架, 已包含在 JavaEE 6.0 中;
- Hibernate Validator 是 Bean Validation 的参考实现 .;
- Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint
(2)可以实现的校验
(3)校验的流程
- LocalValidatorFactoryBean是实现校验的bean;
- annotion-driven会默认装配好一个 LocalValidatorFactoryBean;
- 在处理方法的入参上标注@valid 注解,入参还可以加一个 bindingResult的参数;
- 需校验的 Bean 对象和其绑定结果对象bindingResult或错误对象时成对出现的,之间不允许声明其他的入参;
- 在对应 pojo 的属性字段上加上校验注解;
- 在方法里获取校验的结果(getFieldError、getFieldErrors、getFieldValue、getErrorCount);
- 在页面上显示错误( 错误信息会随一个隐含模型传到jsp,页面直接用<form:errors path=“userName”>就可以获取);
(4)错误提示消息的国际化
- 建一个国际化properties文件,里面错误的键名类似Pattern.user.password,值是要显示的消息;
- 在 spring 的ioc 容器里配置一个 messageSource 注册国际化资源文件;
5、JSON处理
(1)步骤
- 加入三个 jackson 的jar;
- 写目标方法返回值为 json 对应的对象和集合;
- 在方法加上responseBody 的注解;
(2)原理
- 底层是通过 HttpMessageConverter<T> 来实现的,具体的原理如下:
- spring提供两种使用途径: