注解
- @Controller
- @RequestMapping
- @ResponseBody
-
@ComponentScan
-
@RequestParam
-
@EnableWebMvc
注意:SpringMVC的配置类把@EnableWebMvc当做标配配置上去,不要省略 -
@RequestBody
@RequestBody与@RequestParam区别
区别: -
@RequestParam用于接收url地址传参,表单传参【application/x-www-formurlencoded】
-
@RequestBody用于接收json数据【application/json】
-
@DateTimeFormat
-
@PathVariable
关于接收参数,我们学过三个注解@RequestBody、@RequestParam、@PathVariable,这三个注解之间的区别和应用分别是什么?
区别: -
@RequestParam用于接收url地址传参或表单传参
-
@RequestBody用于接收json数据
-
@PathVariable用于接收路径参数,使用{参数名称}描述路径参数
应用: -
后期开发中,发送请求参数超过1个时,以json格式为主,@RequestBody应用较广
-
如果发送非json格式数据,选用@RequestParam接收请求参数
-
采用RESTful进行开发,当参数数量较少时,例如1个,可以采用@PathVariable接收请求路径变量,通常用于传递id值
-
@RestController
-
@GetMapping @PostMapping @PutMapping @DeleteMapping
-
@RestControllerAdvice
此注解自带@ResponseBody注解与@Component注解,具备对应的功能
-
@ExceptionHandler
此类方法可以根据处理的异常不同,制作多个方法分别处理对应的异常
SpringMVC
springmvc运行机制
-
客户端发送请求到达中央控制器DispatcherServlet
-
由中央控制器负责解析整个SpringMVC的运行流程
-
当中央控制器接收到请求之后,会将请求先交给HandlerMapping进行处理
-
HandlerMapping负责解析整个SpringMVC的业务流程,将请求分发给合适的处理器
-
处理完成之后将处理的结果返回给中央控制器
-
中央控制器将处理结果交给HandlerAdapter
-
由HandlerAdapter负责适配不同类型的处理器,找到对应的Handler进行处理
-
Handler负责处理核心业务逻辑并返回响应的视图与模型 将响应结果封装成一个对象,ModelAndView
-
ModelAndView负责处理模型与视图 最终会将ModelAndView交给中央控制器 中央控制器将结果交给ViewResolver
-
ViewResolver负责解析响应结果,将其解析为具体的视图技术 根据解析结果找到View,由View使用具体的视图技术来进行具体的实现
-
最终将处理完成的结果返回给中央控制器 由中央控制器将结果返回给客户端 最终在客户端生成对应的效果
- 一次性工作
1、创建工程,设置服务器,加载工程
2、导入坐标
3、创建web容器启动类,加载SpringMVC配置,并设置SpringMVC请求拦截路径
4、SpringMVC核心配置类(设置配置类,扫描controller包,加载Controller控制器bean) - 多次工作
1、定义处理请求的控制器类
2、定义处理请求的控制器方法,并配置映射路径(@RequestMapping)与返回json数据(@ResponseBody)
将SpringMVC的使用过程总共分两个阶段来分析,分别是启动服务器初始化过程和单次请求过程
启动服务器初始化过程
单次请求过程
spring和springMVC分别管理的bean
- SpringMVC加载其相关bean(表现层bean),也就是controller包下的类
- Spring控制的bean
业务bean(Service)
功能bean(DataSource,SqlSessionFactoryBean,MapperScannerConfigurer等)
因为功能不同,如何避免Spring错误加载到SpringMVC的bean?
-
加载Spring控制的bean的时候排除掉SpringMVC控制的bean
-
方式一:Spring加载的bean设定扫描范围为精准范围,例如service包、dao包等
-
方式二:Spring加载的bean设定扫描范围为com.itheima,排除掉controller包中的bean
-
方式三:不区分Spring与SpringMVC的环境,加载到同一个环境中[了解即可]
有了Spring的配置类,要想在tomcat服务器启动将其加载,我们需要修改 ServletContainersInitConfig
对于上述的配置方式,Spring还提供了一种更简单的配置方式,可以不用再去创建
AnnotationConfigWebApplicationContext对象,不用手动register对应的配置类,如何实现?
形参与地址参数名不一致该如何解决
- 解决方案:使用**@RequestParam**注解
POJO参数:请求参数名与形参对象属性名相同,定义POJO类型形参即可接收参数
嵌套POJO参数:请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数
数组参数:请求参数名与形参对象属性名相同且请求参数为多个,定义数组类型即可接收参数发送请求和参数:
集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据
对于JSON数据类型,我们常见的有三种:
- json普通数组([“value1”,“value2”,“value3”,…])
- json对象({key1:value1,key2:value2,…})
- json对象数组([{key1:value1,…},{key2:value2,…}])
JSON对象数据
JSON对象数组
SpringMVC接收JSON数据的实现步骤为:
- (1)导入jackson包
- (2)使用PostMan发送JSON数据
- (3)开启SpringMVC注解驱动,在配置类上添加@EnableWebMvc注解
- (4)Controller方法的参数前添加@RequestBody注解
日期类型参数传递
- 需要使用@DateTimeFormat
携带时间的日期
对于响应,主要就包含两部分内容:
- 响应页面
- 响应数据
文本数据
json数据
响应页面
返回文本数据
响应POJO对象
返回值为实体类对象,设置返回值为实体类类型,即可实现返回对应对象的json数据,需要依赖@ResponseBody注解和@EnableWebMvc注解
响应POJO集合对象
SpringMVC为什么会拦截静态资源呢?
SpringMVC需要将静态资源进行放行。
该配置类是在config目录下,SpringMVC扫描的是controller包,所以该配置类还未生效,要想生效需要将SpringMvcConfig配置类进行修改
拦截器
拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行
作用:
- 在指定的方法调用前后执行预先设定的代码
- 阻止原始方法的执行
- 总结:拦截器就是用来做增强
拦截流程
当有拦截器后,请求会先进入preHandle方法,如果方法返回true,则放行继续执行后面的handle[controller的方法]和后面的方法。如果返回false,则直接跳过后面方法的执行
多个拦截器如何工作
Rest风格
- (Representational State Transfer),表现形式状态转换,它是一种软件架构风格
- 根据REST风格对资源进行访问称为RESTful
- REST的优点有:
1、隐藏资源的访问行为,无法通过地址得知对资源是何种操作
2、书写简化
如何携带数据参数 - 修改@RequestMapping的value属性,将其中修改为/users/{id},目的是和路径匹配
- 在方法的形参前添加@PathVariable注解
如果方法形参的名称和路径{}中的值不一致,该怎么办?
如果有多个参数需要传递该如何编写
Rest小结 - (1)设定Http请求动作(动词)
@RequestMapping(value="",method = RequestMethod.POST|GET|PUT|DELETE)
- (2)设定请求参数(路径变量)
@RequestMapping(value="/users/{id}",method = RequestMethod.DELETE)
@ReponseBody
public String delete(@PathVariable Integer id){
}
RESTful快速开发