SpringMVC(二):框架流程及源码浅析

SpringMVC框架结构如图所示:
在这里插入图片描述

1、用户发送请求至前端控制器DispatcherServlet。
2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、DispatcherServlet通过HandlerAdapter处理器适配器调用处理器。
5、执行处理器(Controller,也叫后端控制器)。
6、Controller执行完成返回ModelAndView。
7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9、ViewReslover解析后返回具体View。
10、DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
DispatcherServlet响应用户。

1、用户发送请求至前端控制器DispatcherServlet。

    <!-- Spring MVC servlet -->  
    <servlet>  
        <servlet-name>SpringMVC</servlet-name>  
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
        <init-param>  
            <param-name>contextConfigLocation</param-name>  
            <param-value>classpath:spring-mvc.xml</param-value>  
        </init-param>  
        <load-on-startup>1</load-on-startup>  
        <async-supported>true</async-supported>  
    </servlet>  
    <servlet-mapping>  
        <servlet-name>SpringMVC</servlet-name>  
        <!-- 此处可以可以配置成*.do或*.action,对应struts的后缀习惯 -->  
        <url-pattern>*.action</url-pattern>  
    </servlet-mapping>

配置在web.xml中的servlet。
2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
在DispatcherServlet中,doDispatch()方法为处理发送到处理程序的实际调度。故直接看此方法。在这里插入图片描述
getHandler()具体方法如下:

	/**
	 * Look up a handler for the given request, falling back to the default
	 * handler if no specific one is found.
	 * @param request current HTTP request
	 * @return the corresponding handler instance, or the default handler
	 * @see #getHandlerInternal
	 */
	@Override
	public final HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
		Object handler = getHandlerInternal(request);  //从request匹配对应的handler
		if (handler == null) {
			handler = getDefaultHandler();
		}
		if (handler == null) {
			return null;
		}
		// Bean name or resolved handler?
		if (handler instanceof String) {
			String handlerName = (String) handler;
			handler = getApplicationContext().getBean(handlerName);
		}
		return getHandlerExecutionChain(handler, request);
	}

4、DispatcherServlet通过HandlerAdapter处理器适配器调用处理器。
在这里插入图片描述
5、执行处理器(Controller,也叫后端控制器)。
6、Controller执行完成返回ModelAndView。
7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
此时调用自己写的Controller

	/**
	 * 由欢迎页跳转首页
	 * @return
	 */
	@RequestMapping(value="/toIndex",method=RequestMethod.GET)
	public ModelAndView toIndex(){
		List<Article> articleList = articleService.getAll();
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.addObject("articleList", articleList);
		modelAndView.setViewName("index");
		return modelAndView;
	}
	

8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9、ViewReslover解析后返回具体View。
10、DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。

在这里插入图片描述在这里插入图片描述在这里插入图片描述

以上为DispatcherServlet层源码浅析,实际开发中,仅需开发Controller及jsp即可,其余均为框架功能。

猜你喜欢

转载自blog.csdn.net/weixin_43299617/article/details/82994005