Spring MVC 的执行流程(详解)+常用注解(详解)+知识点

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);
    }

}

猜你喜欢

转载自blog.csdn.net/m0_71202849/article/details/126857321