SpringMVC
tomcat启动流程
- 初始化默认的JspServlet和DefaultServlet
- 初始化我们配置的前端控制器DispatcherServlet
- 因为我们在DispatcherServlet中配置了mvc.xml,因此也会启动Spring容器。SPring容器会帮我们创建相应的bean并管理
- 创建的对象包括Controller层,Service层,Mapper层,Datasource对象,SqlSession对象等
什么是前端控制器
前端控制器本质是一个servlet,是SPringMVC提供的所有请求的的统一入口,因为不同请求可能有共同的操作,这时候就需要前端控制器做统一的处理,比如日志记录,权限检查等,然后再将请求分发给各个处理器去处理
SpringMVC流程分析
- DispatcherServlet是核心,负责调度其他组件
- 请求进来,前控首先调用处理器映射器(HandleMpper)查找该请求url对应的处理器,返回一个处理器链(包含多个拦截器和最后的那个处理器)
- 然后前控通过处理器适配器(HandleAdapter),执行对应处理器中的相应方法,返回ModelAndView对象
- 然后前端控制器通过视图解析器(ViewResolver)进行视图解析,就是把逻辑视图(字符串)转换为物理视图view,将view返回前控
- 前控通过相应的渲染模板,比如jsp和freemarker将数据渲染到模板,将渲染后的视图返回给浏览器
补充idea断点调试
- f5:进入方法内部
- f6:一步一步执行
- f7: 通过f5进入了某方法,这是不想看了,想跳出该方法使用此键
- f8:跳到下一个断点,中间过程直接略过
@ControllerAdvice详解
此注解也是Spring AOP中的一个增强,只不过这个增强的切面是面向于controller层的,那么可以得出一个推论,一次请求的所有流程都会被这种增强覆盖,因为controller层是最外层的。一般结合三种方法型注解:
- @ExceptionHandler:用于捕捉controller层中抛出的指定异常
- @InitBinder:对controller方法中的参数进行绑定注册,比如日期类型
- @ModelAttribute:表示其标注的方法将会在目标Controller方法执行之前执行