• 1. Spring MVCXue Feng
  • 2. Spring MVC 架构 Spring MVC是结构最清晰的MVC Model 2实现。它的Action也不叫Action,而是称做Controller;Controller接收request, response参数,然后返回ModelAndView(其中的Model不是Object类型,而是Map类型)。但在其它的Web Framework中,Action返回值一般都只是一个View Name;Model则需要通过其它的途径(如request.attribute,session.attribute参数,或Action本身的属性数据)传递上去。
  • 3. Spring MVC相关配置Web.xml — 配置Spring MVC的FrontController(DispatcherServlet) — 配置Spring 配置文件的位置 — 其他配置(Servlet、Filter等) Spring配置文件 — 配置HandlerMapping(可基于注解) — 配置ViewResolver
  • 4. Web.xml配置前端控制器 DispatcherServlet
  • 5. Spring配置文件HandlerMapping(寻找Controller)ResovlerMapping(解析视图)
  • 6. Spring MVC处理流程
  • 7. Spring MVC处理流程
  • 8. DispatcherServlet
  • 9. Spring MVC处理流程 —— DispatchServlet 1. DispatchServlet在Web容器初始化的时候完成初始化——initStrategy() ; 2.初始化主要完成: multipartResolver、handlerMappings、handlerAdapters、viewResolvers变量的赋值; 3.初始化有三种情况:基于注解、基于配置文件、默认初始化; 4. DispatchServlet 的doDispatch()方法负责转发请求,具体:执行拦截器、调用Controller的业务执行方法、调用View解析器得到View、调用View对象的render()方法;
  • 10. Spring MVC处理流程 —— Controller 1. Controller负责接收从DispatchServlet转发的URL请求(中间会插入interceptor的调用); 2. Spring MVC的Controller可以细化到method级别,并支持URL的串接; 3. Spring MVC2.5中Controller需要实现Controller接口,只有单一的请求处理方法; 4. Spring MVC3.0中的基于注解的Controller处理方法形式多样,处理方法非常灵活(过于灵活,在学习阶段造成一定的难度); 5. AnnotationMethodHandlerAdapter 的getModelAndView ()方法负责将各种不同参数形式的处理函数返回的不同类型的返回值WRAP成ModelAndView;
  • 11. Spring MVC处理流程 —— Controller注册 将Controller注册到context中的两种方法: 1.xxx-mvc.xml中配置; 2.采用@Controller注解( DefaultAnnotationHandlerMapping ) 1)DispatchServlet在初始化时自动扫描 base –package下的所有class; 2)依据class中的@Controller注解, DispatchServlet动态生成 URL-- class-method的映射,放入handlingMap成员变量中; 3)见DefaultAnnotationHandlerMapping中的detectHandler(), detectHandlerMethod()方法中自动扫描注解;
  • 12. Spring MVC处理流程
  • 13. ViewResolver从一个String逻辑视图名映射到一个视图对象 可以排序, 所以能链在一起 对JSP用户, 通常实现 InternalResourceViewResolver:
  • 14. Spring MVC处理流程 —— ViewResolver
  • 15. 常用的ViewResolverInternalResourceViewResolver (1) 典型的JSP视图,有“addBook”—— /WEB-INF/jsp/addBook.jsp (2) 自动位于视图解析链中的最后一个,如果InternalResourceViewResolver找不到视图,则会报404异常
  • 16. 常用的ViewResolver1. ContentNegotiateViewResolver (1)非常重要的ViewResolver,它不是一个实际的Resolver,而是根据内容(ContentType/MediaType)来匹配(协商)视图的一种解析器; (2)学习、研究ContentNegotiateViewResolver的源码,有益于更好地掌握其配置; (3) ContentNegotiateViewResolver的成员变量viewResolvers,用来保存整个配置文件中除了“自身”以外的其他ViewResolver,如InternalResourceViewResolver; (4) ContentNegotiateViewResolver解析视图的过程如图; 解析URL后缀名,映射为requestMediaType 生成candidateViews 比较requestMediaType和candidateViews中每个View的MediaType,返回第一个匹配的View 如果没有匹配的View,一般采用InternalResourceViewResolver返回一个JSP 如果这个JSP文件不存在,报404
  • 17. ContentNegotiateViewResolver 解析视图过程
  • 18. 视图 View支持的几种典型视图技术: InternalResourceView (JSP) JstlView (JSP + JSTL) VelocityView (Velocity) AbstactExcelView(Excel) AbstarctPdfView(Pdf) MappingJacksonJsonView(Json)