MVC 的事理图如下:
SpringMVC 大略先容SpringMVC 框架因此要求为驱动,环绕 Servlet 设计,将要求发给掌握器,然后通过模型工具,分派器来展示要求结果视图。个中核心类是 DispatcherServlet,它是一个 Servlet,顶层是实现的Servlet接口。
SpringMVC 利用
须要在 web.xml 中配置 DispatcherServlet 。并且须要配置 Spring 监听器ContextLoaderListener
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<!-- 如果不设置init-param标签,则必须在/WEB-INF/下创建xxx-servlet.xml文件,个中xxx是servlet-name中配置的名称。 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
SpringMVC 事情事理(主要)大略来说:
客户端发送要求-> 前端掌握器 DispatcherServlet 接管客户端要求 -> 找到处理器映射 HandlerMapping 解析要求对应的 Handler-> HandlerAdapter 会根据 Handler 来调用真正的处理器开处理要求,并处理相应的业务逻辑 -> 处理器返回一个模型视图 ModelAndView -> 视图解析器进行解析 -> 返回一个视图工具->前端掌握器 DispatcherServlet 渲染数据(Moder)->将得到视图工具返回给用户
如下图所示:
上图的一个笔误的小问题:Spring MVC 的入口函数也便是前端掌握器 DispatcherServlet 的浸染是吸收要求,相应结果。
流程解释(主要):
(1)客户端(浏览器)发送要求,直接要求到 DispatcherServlet。
(2)DispatcherServlet 根据要求信息调用 HandlerMapping,解析要求对应的 Handler。
(3)解析到对应的 Handler(也便是我们平常说的 Controller 掌握器)后,开始由 HandlerAdapter 适配器处理。
(4)HandlerAdapter 会根据 Handler 来调用真正的处理器开处理要求,并处理相应的业务逻辑。
(5)处理器处理完业务后,会返回一个 ModelAndView 工具,Model 是返回的数据工具,View 是个逻辑上的 View。
(6)ViewResolver 会根据逻辑 View 查找实际的 View。
(7)DispaterServlet 把返回的 Model 传给 View(视图渲染)。
(8)把 View 返回给要求者(浏览器)
SpringMVC 主要组件解释1、前端掌握器DispatcherServlet(不须要工程师开拓),由框架供应(主要)
浸染:Spring MVC 的入口函数。吸收要求,相应结果,相称于转发器,中心处理器。有了 DispatcherServlet 减少了其它组件之间的耦合度。用户要求到达前端掌握器,它就相称于mvc模式中的c,DispatcherServlet是全体流程掌握的中央,由它调用其它组件处理用户的要求,DispatcherServlet的存在降落了组件之间的耦合性。
2、处理器映射器HandlerMapping(不须要工程师开拓),由框架供应
浸染:根据要求的url查找Handler。HandlerMapping卖力根据用户要求找到Handler即处理器(Controller),SpringMVC供应了不同的映射器实现不同的映射办法,例如:配置文件办法,实现接口办法,表明办法等。
3、处理器适配器HandlerAdapter
浸染:按照特定规则(HandlerAdapter哀求的规则)去实行Handler
通过HandlerAdapter对处理器进行实行,这是适配器模式的运用,通过扩展适配器可以对更多类型的处理器进行实行。
4、处理器Handler(须要工程师开拓)
把稳:编写Handler时按照HandlerAdapter的哀求去做,这样适配器才可以去精确实行Handler
Handler 是继DispatcherServlet前端掌握器的后端掌握器,在DispatcherServlet的掌握下Handler对详细的用户要求进行处理。
由于Handler涉及到详细的用户业务要求,以是一样平常情形须要工程师根据业务需求开拓Handler。
5、视图解析器View resolver(不须要工程师开拓),由框架供应
浸染:进行视图解析,根据逻辑视图名解析成真正的视图(view)
View Resolver卖力将处理结果天生View视图,View Resolver首先根据逻辑视图名解析成物理视图名即详细的页面地址,再天生View视图工具,末了对View进行渲染将处理结果通过页面展示给用户。 springmvc框架供应了很多的View视图类型,包括:jstlView、freemarkerView、pdfView等。
一样平常情形下须要通过页面标签或页面模版技能将模型数据通过页面展示给用户,须要由工程师根据业务需求开拓详细的页面。
6、视图View(须要工程师开拓)
View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf…)
把稳:处理器Handler(也便是我们平常说的Controller掌握器)以及视图层view都是须要我们自己手动开拓的。其他的一些组件比如:前端掌握器DispatcherServlet、处理器映射器HandlerMapping、处理器适配器HandlerAdapter等等都是框架供应给我们的,不须要自己手动开拓。
DispatcherServlet详细解析首先看下源码:
package org.springframework.web.servlet;
@SuppressWarnings(\"大众serial\"大众)
public class DispatcherServlet extends FrameworkServlet {
public static final String MULTIPART_RESOLVER_BEAN_NAME = \公众multipartResolver\"大众;
public static final String LOCALE_RESOLVER_BEAN_NAME = \"大众localeResolver\公众;
public static final String THEME_RESOLVER_BEAN_NAME = \公众themeResolver\"大众;
public static final String HANDLER_MAPPING_BEAN_NAME = \公众handlerMapping\"大众;
public static final String HANDLER_ADAPTER_BEAN_NAME = \"大众handlerAdapter\公众;
public static final String HANDLER_EXCEPTION_RESOLVER_BEAN_NAME = \"大众handlerExceptionResolver\"大众;
public static final String REQUEST_TO_VIEW_NAME_TRANSLATOR_BEAN_NAME = \公众viewNameTranslator\"大众;
public static final String VIEW_RESOLVER_BEAN_NAME = \"大众viewResolver\"大众;
public static final String FLASH_MAP_MANAGER_BEAN_NAME = \"大众flashMapManager\公众;
public static final String WEB_APPLICATION_CONTEXT_ATTRIBUTE = DispatcherServlet.class.getName() + \"大众.CONTEXT\公众;
public static final String LOCALE_RESOLVER_ATTRIBUTE = DispatcherServlet.class.getName() + \"大众.LOCALE_RESOLVER\公众;
public static final String THEME_RESOLVER_ATTRIBUTE = DispatcherServlet.class.getName() + \"大众.THEME_RESOLVER\"大众;
public static final String THEME_SOURCE_ATTRIBUTE = DispatcherServlet.class.getName() + \"大众.THEME_SOURCE\"大众;
public static final String INPUT_FLASH_MAP_ATTRIBUTE = DispatcherServlet.class.getName() + \"大众.INPUT_FLASH_MAP\"大众;
public static final String OUTPUT_FLASH_MAP_ATTRIBUTE = DispatcherServlet.class.getName() + \公众.OUTPUT_FLASH_MAP\"大众;
public static final String FLASH_MAP_MANAGER_ATTRIBUTE = DispatcherServlet.class.getName() + \公众.FLASH_MAP_MANAGER\"大众;
public static final String EXCEPTION_ATTRIBUTE = DispatcherServlet.class.getName() + \公众.EXCEPTION\"大众;
public static final String PAGE_NOT_FOUND_LOG_CATEGORY = \公众org.springframework.web.servlet.PageNotFound\"大众;
private static final String DEFAULT_STRATEGIES_PATH = \"大众DispatcherServlet.properties\"大众;
protected static final Log pageNotFoundLogger = LogFactory.getLog(PAGE_NOT_FOUND_LOG_CATEGORY);
private static final Properties defaultStrategies;
static {
try {
ClassPathResource resource = new ClassPathResource(DEFAULT_STRATEGIES_PATH, DispatcherServlet.class);
defaultStrategies = PropertiesLoaderUtils.loadProperties(resource);
}
catch (IOException ex) {
throw new IllegalStateException(\"大众Could not load 'DispatcherServlet.properties': \公众 + ex.getMessage());
}
}
/ Detect all HandlerMappings or just expect \"大众handlerMapping\"大众 bean? /
private boolean detectAllHandlerMappings = true;
/ Detect all HandlerAdapters or just expect \"大众handlerAdapter\公众 bean? /
private boolean detectAllHandlerAdapters = true;
/ Detect all HandlerExceptionResolvers or just expect \公众handlerExceptionResolver\"大众 bean? /
private boolean detectAllHandlerExceptionResolvers = true;
/ Detect all ViewResolvers or just expect \"大众viewResolver\公众 bean? /
private boolean detectAllViewResolvers = true;
/ Throw a NoHandlerFoundException if no Handler was found to process this request? /
private boolean throwExceptionIfNoHandlerFound = false;
/ Perform cleanup of request attributes after include request? /
private boolean cleanupAfterInclude = true;
/ MultipartResolver used by this servlet /
private MultipartResolver multipartResolver;
/ LocaleResolver used by this servlet /
private LocaleResolver localeResolver;
/ ThemeResolver used by this servlet /
private ThemeResolver themeResolver;
/ List of HandlerMappings used by this servlet /
private List<HandlerMapping> handlerMappings;
/ List of HandlerAdapters used by this servlet /
private List<HandlerAdapter> handlerAdapters;
/ List of HandlerExceptionResolvers used by this servlet /
private List<HandlerExceptionResolver> handlerExceptionResolvers;
/ RequestToViewNameTranslator used by this servlet /
private RequestToViewNameTranslator viewNameTranslator;
private FlashMapManager flashMapManager;
/ List of ViewResolvers used by this servlet /
private List<ViewResolver> viewResolvers;
public DispatcherServlet() {
super();
}
public DispatcherServlet(WebApplicationContext webApplicationContext) {
super(webApplicationContext);
}
@Override
protected void onRefresh(ApplicationContext context) {
initStrategies(context);
}
protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context);
initLocaleResolver(context);
initThemeResolver(context);
initHandlerMappings(context);
initHandlerAdapters(context);
initHandlerExceptionResolvers(context);
initRequestToViewNameTranslator(context);
initViewResolvers(context);
initFlashMapManager(context);
}
}
DispatcherServlet类中的属性beans:
HandlerMapping:用于handlers映射要乞降一系列的对付拦截器的前处理和后处理,大部分用@Controller表明。
HandlerAdapter:帮助DispatcherServlet处理映射要求处理程序的适配器,而不用考虑实际调用的是 哪个处理程序。- - -ViewResolver:根据实际配置解析实际的View类型。ThemeResolver:办理Web运用程序可以利用的主题,例如供应个性化布局。MultipartResolver:解析多部分要求,以支持从HTML表单上传文件。-FlashMapManager:存储并检索可用于将一个要求属性通报到另一个要求的input和output的FlashMap,常日用于重定向。在Web MVC框架中,每个DispatcherServlet都拥自己WebApplicationContext,它继续了ApplicationContext。WebApplicationContext包含了其高下文和Servlet实例之间共享的所有的根本框架beans。HandlerMapping
HandlerMapping
HandlerMapping接口处理要求的映射HandlerMapping接口的实现类:
SimpleUrlHandlerMapping类通过配置文件把URL映射到Controller类。DefaultAnnotationHandlerMapping类通过表明把URL映射到Controller类。HandlerAdapter
HandlerAdapter
HandlerAdapter接口-处理要求映射
AnnotationMethodHandlerAdapter:通过表明,把要求URL映射到Controller类的方法上。
HandlerExceptionResolver
HandlerExceptionResolver
HandlerExceptionResolver接口-非常处理接口
SimpleMappingExceptionResolver通过配置文件进行非常处理。AnnotationMethodHandlerExceptionResolver:通过表明进行非常处理。ViewResolver
ViewResolver
ViewResolver接口解析View视图。
UrlBasedViewResolver类 通过配置文件,把一个视图名交给到一个View来处理。