org.springframework.web.servlet.DispatcherServlet
contextConfigLocation classpath:spring/springmvc-servlet.xml 1 springmvc /简单来说:
客户端发送请求-> 前端控制器 DispatcherServlet
接受客户端请求 -> 找到处理器映射HandlerMapping
解析请求对应的 Handler-> HandlerAdapter
会根据 Handler
来调用真正的处理器开处理请求,并处理相应的业务逻辑 -> 处理器返回一个模型视图 ModelAndView
-> 视图解析器进行解析-> 返回一个视图对象->前端控制器 DispatcherServlet
渲染数据(Moder)->将得到视图对象返回给用户
如下图所示:
流程说明(重要):
作用:Spring MVC 的入口函数。接收请求,响应结果,相当于转发器,中央处理器。有了DispatcherServlet
减少了其它组件之间的耦合度。用户请求到达前端控制器,它就相当于mvc模式中的c,DispatcherServlet
是整个流程控制的中心,由它调用其它组件处理用户的请求,DispatcherServlet
的存在降低了组件之间的耦合性。
作用:根据请求的url查找Handler。HandlerMapping
负责根据用户请求找到Handler即处理器(Controller),SpringMVC提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler通过HandlerAdapter
对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
注意:编写Handler时按照HandlerAdapter
的要求去做,这样适配器才可以去正确执行Handler
Handler 是继DispatcherServlet
前端控制器的后端控制器,在DispatcherServlet
的控制下Handler对具体的用户请求进行处理。
由于Handler涉及到具体的用户业务请求,所以一般情况需要工程师根据业务需求开发Handler。
View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf…)
注意:处理器Handler(也就是我们平常说的Controller控制器)以及视图层view都是需要我们自己手动开发的。其他的一些组件比如:前端控制器DispatcherServlet
、处理器映射器HandlerMapping
、处理器适配器HandlerAdapter
等等都是框架提供给我们的,不需要自己手动开发。
首先看下源码:
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 handlerMappings;
/** List of HandlerAdapters used by this servlet */
private List handlerAdapters;
/** List of HandlerExceptionResolvers used by this servlet */
private List handlerExceptionResolvers;
/** RequestToViewNameTranslator used by this servlet */
private RequestToViewNameTranslator viewNameTranslator;
private FlashMapManager flashMapManager;
/** List of ViewResolvers used by this servlet */
private List 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);
ontext);
initHandlerExceptionResolvers(context);
initRequestToViewNameTranslator(context);
initViewResolvers(context);
initFlashMapManager(context);
因篇幅问题不能全部显示,请点此查看更多更全内容