这是我参与「第四届青训营 」笔记创作活动的第 9 天。
今天在复习后端框架知识时,突然对SpringMVC有些知识点遗忘,趁着复习,也整理一下自己的笔记。下面开始正文内容
SpringMVC全貌
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。SpringMVC是一种web层mvc框架,用于替代servlet(处理|响应请求,获取表单参数,表单校验等。
SpringMVC是一个MVC的开源框架,SpringMVC=struts2+spring
五大核心组件
-
DispatcherServlet
- 作用:负责分发所有的请求
- 定位:请求入口
-
HandlerMapper 请求派发,负责请求和控制器建立一一对应的关系
-
Controller 处理器,处理DispatcherServlet分发的请求
-
ModelAndView 封装模型信息和视图信息,可以存储模型数据,也可以储存模板路径
-
ViewResolver 视图处理器,定位页面
MVC三层架构介绍
-
VIEW视图层
-
接口
-
VIEW是视图的顶层接口
-
-
-
Controller控制层
-
拦截器
-
功能:DispatcherServlet派发请求到具体Controller之前首先要执行拦截器中一些相关方法,进行相应预处理(例如权限检测,参数验证),决定放行还是拦截
-
实现方法:
- 实现HandlerInterceptor接口
- 或者继承HandlerInterceptorAdaptor
-
具有的三个方法
-
preHandle()
-
注意点:
-
是在请求到达Controller之前执行的,其实就是拦截器用于拦截请求的,三个参数,分别是request,response,handelr就是这个请求要去找的后端处理器Controller.
-
方法的返回值是bloolean类型
- 如果返回为false,就说明请求在此终结,不能执行后面的代码了.
- 如果返回值为true,那么这个拦截器就要放行,将请求交给后端处理器Controller.
-
-
-
postHandle()
-
注意点
- 这个方法,是在后端控制器controller处理完请求之后,就执行
- 方法有一个参数,ModelAndView,后端控制器controller处理请求可能需要返回页面和数据,所以会多一个ModelAndView,
- 但是这个方法,是在渲染页面之前执行的,渲染热面是交个前端控制器来完成的.
-
-
afterCompletion() 拦截器最后执行的方法
-
-
-
注意点
- 可以直接使用Request、Response对象处理请求与响应
-
-
Model模型
- 注意点
- 自动实例化:可以被自动实例化,而ModelAndView需要主动实例化
数据模型
以下三个都可以作为数据模型对象,Spring MVC会自动实例化这些类型。
-
Model
-
注意点
- 可以自动实例化
-
-
ModelMap
-
ModelAndView
-
注意点
- 手动实例化:需要主动实例化
- 储存对象:可以存储模型数据和模板路径
-
注意点
- ModelAttribute是注解,用于定义控制器方法执行之前,对数据模型的操作。
获取参数的方式
主要分为 get方法 和 post方法 。
get请求方式参数是在url后
post请求方式的参数是在request body中。
因此两者获取参数的方式也大不一样。
GET方法
-
直接在方法体中指定参数
@GetMapping("/get") public User getUserById(Integer id) { if (id.intValue() == 0) { return null; } return list.get(id); } 访问 :http://ip:port/xx/get?id=1 -
使用requestParam
@GetMapping("/get") public User getUserById(@RequestParam(name = "id", required = true) Integer id) { if (id.intValue() == 0) { return null; } return list.get(id); } 访问 :http://ip:port/xx/get?id=1其中RequestParam中name表示url中请求的字段名,当required为true时,表示该参数必填;defaultValue表示当该参数没有传递数据时给出的默认值,如defaultvalue=”0”
-
使用PathVariable
@GetMapping("/get/{id}") public User getUserByPathValue(@PathVariable(name = "id", required = true) Integer id) { return list.get(id); } http:///ip:port/xx/get/1 -
使用HttpServletRequest
@GetMapping("/get") public User getUserById(HttpServletRequest request) { Integer id = Integer.parseInt(request.getParameter("id")); if (id.intValue() == 0) { return null; } return list.get(id); } 访问 http://ip:port/xx/get?id=1
POST方法
一般而言,post形式的参数被放在请求体中以application/json的形式被后端获取
注解
-
@Controller
- 作用:把这个类作为一个控制器加载到Spring的Bean工厂,如果不加,就是一个普通的类
-
@RequestMapping(RequestMapper标签,处理请求的处理器)
-
作用:
- 声明类或方法的访问路径,还可以声明请求的方式
- 是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
-
属性
-
value,method
-
value: 指定请求的实际地址,指定的地址可以是URI Template 模式;
-
method: 指定请求的method类型, GET、POST、PUT、DELETE等;
-
注意点:
-
method值
- 如果没有设置method值,则get和post方法默认都可以访问。
- 如果设置了method值,则只能是响应的方式可以请求
-
-
-
consunmes,produces
- consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
- produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
-
params,headers
- params: 指定request中必须包含某些参数值是,才让该方法处理。
- headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。
-
-
其他
-
Spring 4.3版本新增了几个注解,这些注解可以看成是@RequestMapping注解的快捷方式,相当于固定了method配置项的值
- @GetMapper
- @PostMapper
- @PatchMapper
- @PutMapper
- @DeleteMapper
-
-
-
@RequestParam
-
作用:
- 将请求路径中的参数,绑定到控制器的方法的参数进行映射。
-
参数:
@RequestParam(value=“参数名”,required=”true/false”,defaultValue=””) 1.value:参数名 2.required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报错。 3.defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值
-
-
@PathVariable
-
作用:
- 将请求对象中的参数,绑定到控制器的方法的参数,用于从URL中提取参数
-
注意点:
-
提取参数时与@RequestParam
-
请求URL是localhost:8080/test/?id = 6,使用@RequestParam
@PostMapping("/test") public CommonResult publishCourse(@RequestParam String id) { } -
请求URL是localhost:8080/test/6,使用@PathVariable
@PostMapping("/test/{id}") public CommonResult publishCourse(@PathVariable String id) { }
-
-
-
-
@ResponseBody
-
作用:
- 向浏览器响应字符串,一般用于异步请求方式
- 将java对象转为json格式的数据。(方法返回的东西会通过IO流的方式写入到浏览器。)
- controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。
-
-
@Transectional
-
作用:
-
声明式事务管理
-
实质是使用了 JDBC 的事务来进行事务控制的
-
基于 Spring 的动态代理的机制
-
事务的隔离级别
- 是指若干个并发的事务之间的隔离程度
-
事物的传播行为
- 如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为
-
-
添加位置
- 类和接口实现方法:接口实现类或接口实现方法上,而不是在接口类上
- 访问权限:public的方法才起作用(由于Spring的AOP本质决定)
-
-
@ComponentScan
-
作用:用于定义Bean的扫描策略和范围
-
注意点:
- 默认值:对当前包和其子包的Bean进行扫描
- 载入规则:,在此范围内带有特定注解的Bean才会被载入容器。
-
\