服务器启动时,tomcat创建并自动装配所有生成对象:spring容器放在服务器应用全局中,springmvc容器被放在dispacherServlet容器中。注解解析器在dispacherServlet创建时赋予它识别相关注解并作出相应操作的能力。
浏览器发送请求req,首先经过 过滤器,过滤器通常用来实现请求和响应的编码格式,或者拦截业务;
请求req到达dispacherServelet,内部拦截器preHandle()方法调用,返回值为true时放行;
请求req由到达Controller层相应url的单元方法中,执行相关业务逻辑;到达和执行两步由自动生成的
RequestMappingHandlerMapping和RequestMappingHandlerAdapter
两个对象分别处理。其中的Mapping负责查找对应方法。Adapter负责调用方法体,首先通过反射得到的方法类对象来映射参数。如果添加了@ResponsBody会在方法调用完成时设置相应的响应格式Json/Xml。如果是请求转发或重定向则会创建并设置ModelAndView对象,最后返回给dispacherServelet
这时dispacherServelet调用拦截器postHandle(),执行方法体。
postHandle()执行完成后dispacherServelet拿出ModelAndView对象,调用视图解析器渲染出对应路径页面。
这时dispacherServelet调用拦截器afterCompletion(),执行方法体。
最后以http响应的格式发送给浏览器。
注解解析器
<mvc:annotation-driven/>
使用springmvc框架时,激活dispacherServelet能识别controller层添加的各种注解的能力,并且做出相应的方法调用或者处理。
要实现处理调用的能力,依赖于三个类对象:
RequestMappingHandlerMapping
处理@RequestMapping的请求映射
RequestMappingHandlerAdapter
调用@RequestMapping相应方法,结果返回给dispacherServelet
ExceptionHandlerExceptionResolver
对控制器层异常的处理
在启用注解解析器时,这三个类对象被自动创建。
在spring-mvc.xsd文件的说明中
过滤器
拦截器:
多个拦截器拦截同一目标的执行顺序:
preHandle()从配置文件自上而下执行。
postHandle()自下而上执行。
视图解析器:
页面技术除了基于java的jsp,还有很多种。可以通过不同视图解析器渲染不同类型页面。
异常处理:
通过注解 @ExceptionHandler():
Controller本类 局部:
Controller全体类 全局
springmvc局部配置:
项目全局配置: