1.处理流程: (简写+详解)
/**简写*/
1. 浏览器发送指定的请求都会交给DispatcherServlet(前端控制器),
2. DispatcherServlet调用HandlerMapping(处理器映射器)查找并返回与请求路径对应的Handler(处理器)。
3. DispatcherServlet调用HandlerAdapter(处理器适配器), HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
4. 目标Handler(Controller)处理完业务后, 会返回一个ModelAndView(模型及视图), 再由DispatcherServlet调用ViewResolver(视图解析器)确定具体的视图组件并进行视图渲染
5. 最后返回到客户端
/**详写*/
<复杂版>
1、 用户发送请求至前端控制器DispatcherServlet。
2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、 DispatcherServlet调用HandlerAdapter处理器适配器。
5、 HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6、 Controller执行完成返回ModelAndView。
7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9、 ViewReslover解析后返回具体View。
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、 DispatcherServlet响应用户。
/**2.1核心组件*/
DispatcherServlet:前置控制器,负责调度其他组件的执行,可以降低不同组件之间的耦合性,是整个Spring MVC的核心模块
Handler:处理器,完成具体的业务逻辑,相当于Servlet
HandlerMapping:DispatcherServlet是通过 HandlerMapping把请求映射到不同的Handler
HandlerAdapter(适配器的作用大致就是,将请求消息(如Json,xml等数据)转换成一个对象,将对象转换为指定的响应信息) (二阶段手写的框架,解析请求信息,将其拆分处理,该转换的转换该提取的提取该验证的验证,最后把能用的有效数据传到目标Controller中,让其进行业务处理)
ModelAndView:封装了模型数据和视图信息,作为Handler的处理结果,返回给DispatcherServlet
ViewResolver:视图解析器,DispatcherServlet通过它把逻辑视图解析为物理视图,最终把渲染的结果响应给客户端
[图解(简化版本)]
[图解(详细版本)]
2.Spring MVC常用注解
1、@RequestMapping (配置请求路径注解)(是配置请求路径与处理请求的方法的映射关系)
@PostMapping (增删改数据居多)
@GetMapping (查询数据居多)
/*例子:添加在方法上,可以什么也不写*/
@GetMapping("")
public JsonResult list() {}
2.@Controller(组件扫描注解)
@RestController(组件扫描+响应注解) = @Controller + @ResponseBody
@ResponseBody:一旦配置了@ResponseBody,此类处理请求的方法的返回值就会直接响应到客户端去
/*例子:在类上加注解*/
@RestController
@RequestMapping("/brands")
public class BrandController {}
3.@RequestBody和@ResponsBody 传输json 格式数据
/*例子:在参数上加注解*/
@PostMapping("/add-new")
public JsonResult addNew(@RequestBody BrandAddNewDTO brandAddNewDTO) {}
4、@PathVariable 当路径URL需要正则表达式判断时添加 (可替代@RequestBody)
/*例子:在参数上加注解*/
@PostMapping("/{id:[0-9]+}/delete")
public JsonResult delete(@PathVariable Long id) {}
5.自动装配
@Autowired @Resource
3.总体例子(代码)
/**总体例子:*/
/**
* 相册控制器
*
* @author [email protected]
* @version 0.0.1
*/
@Slf4j //日志
@Api(tags = "3. 相册管理模块") //knife4j测试器(测试用的,可以不加)
@RestController
@RequestMapping("/albums")
public class AlbumController { //Controller控制层代码 (添加,删除,查询业务)
@Autowired //自动装配
private IAlbumService albumService;
public AlbumController() {
log.debug("创建控制器对象:AlbumController");
}
// http://localhost:9080/albums/add-new
@ApiOperation("添加相册") //knife4j测试器
@ApiOperationSupport(order = 100) //knife4j测试器
@PostMapping("/add-new")
public JsonResult addNew(@RequestBody AlbumAddNewDTO albumAddNewDTO) {
log.debug("接收到的请求参数:{}", albumAddNewDTO);
albumService.addNew(albumAddNewDTO);
return JsonResult.ok();
}
// http://localhost:9080/albums/1/delete
@ApiOperation("删除相册") //knife4j测试器
@ApiOperationSupport(order = 200) //knife4j测试器
@PostMapping("/{id:[0-9]+}/delete")
public JsonResult deleteById(@PathVariable Long id) {
log.debug("接收到的请求参数:{}", id);
albumService.deleteById(id);
return JsonResult.ok();
}
// http://localhost:9080/albums
@ApiOperation("查询相册列表") //knife4j测试器
@ApiOperationSupport(order = 400) //knife4j测试器
@GetMapping("")
public JsonResult list() {
log.debug("接收到查询相册列表的请求");
List<AlbumListItemVO> albums = albumService.list();
return JsonResult.ok(albums);
}
}