MVC原理图
M-Model 模型层(完成业务逻辑:有javaBean构成,service+dao+entity)
V-View 视图层(做界面的展示 jsp,html……)
C-Controller 控制器层(接收请求—>调用模型—>根据结果派发页面)
springMVC重要组件
springMVC是spring的一个子模块。
DispatcherServlet:前端控制器。用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性,系统扩展性提高。包含以下重要部分:
MultipartResolver multipartResolver:解析多部分请求,以支持从HTML表单上传文件。
LocaleResolver localeResolver:解决客户正在使用的区域设置以及可能的时区,以便能够提供国际化视野。
ThemeResolver themeResolver:解决Web应用程序可以使用的主题,例如提供个性化布局。
List<HandlerMapping> handlerMappings:用于handlers映射请求和一系列的对于拦截器的前处理和后处理,大部分用@Controller注解。
List<HandlerAdapter> handlerAdapters:帮助DispatcherServlet处理映射请求处理程序的适配器,而不用考虑实际调用的是 哪个处理程序
List<HandlerExceptionResolver> handlerExceptionResolvers:处理映射异常。
RequestToViewNameTranslator viewNameTranslator
FlashMapManager flashMapManager:存储并检索可用于将一个请求属性传递到另一个请求的input和output的FlashMap,通常用于重定向。
List<ViewResolver> viewResolvers:根据实际配置解析实际的View类型。
HandlerMapping:处理器映射器。HandlerMapping负责根据用户请求的url找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,根据一定的规则去查找,例如:xml配置方式,实现接口方式,注解方式等。
包含以下重要部分:
Map<String, Object> handlerMap:url-Handler的映射。
List<HandlerInterceptor> adaptedInterceptors:Handler的所有拦截器
HandlerExecutionChain:处理器调用链,包含Handler、List<HandlerInterceptor>。
Handler(Controller):处理器。Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行业务处理。
HandlAdapter:处理器适配器。通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
ModelAndView:springmvc的封装对象,将model和view封装在一起。
model:Map<String,Object>类型的业务数据。
view:一般为String类型的逻辑视图名称。
ViewResolver:视图解析器。ViewResolver负责将处理结果生成View视图,ViewResolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后由DispatcherServlet对View进行渲染将处理结果通过页面展示给用户。
View:是springmvc的封装对象,是一个接口, springmvc框架提供了很多的View视图类型,包括:jspview,pdfview,jstlView、freemarkerView、pdfView等。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。
请求处理流程
1,用户发送请求:DispatcherServlet前端控制器拦截到请求。进入doService方法,进行请求处理前的准备设置,进入doDispatch方法处理。
2, 获取Handler:从HandlerMapping中获得HandlerExecutionChain。
2.1 通过遍历handlerMappings,并根据url在handlerMap中匹配对应的Handler。
2.2 根据Handler创建HandlerExecutionChain,同时遍历adaptedInterceptors,根据url匹配对应的HandlerInterceptor,并添加到HandlerExecutionChain的interceptorList(List<HandlerInterceptor>)中。
3 获取HandlerAdapter:通过遍历handlerAdapters,并根据Handler找到对应的HandlerAdapter。
4 获得ModelAndView:用找到的HandlerAdapter通过Handler(适配器模式)最终调用真正的处理器处理业务,完成返回ModelAndView。
5 解析视图:通过viewResolvers,根据返回的ModelAndView中view(逻辑视图名),解析真正视图。
6 渲染:调用render,将ModelAndView中model传入view中进行渲染。
7 输出结果:渲染结果直接出浏览器out.write(...)。