springMVC执行流程详解

这篇具有很好参考价值的文章主要介绍了springMVC执行流程详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

springMVC执行流程

一,springMVC执行流程

1,MVC架构的由来

主要由model层,view层和controller层组成。

1.1,jsp模型

主要是结构简单,开发这个小型项目的效率高,主要是由这个jsp和javaBean组成。但是jsp同时负责了controller层和view层,因此所有的代码都写在这个jsp里面,导致这个代码的重用性很低,维护不方便,因此这种架构被淘汰。

1.2,servlet模型

对上一个模型进行了一次改良,将这个controller层和view层进行了这个分离,让每个部分各司其职。请求由controller控制器完成,jsp就是专门用来展示数据,提高了代码可重用性和易维护性。

springmvc执行流程,servlet,java,mvc,运维,mysql

2,springMVC执行流程

springmvc执行流程,servlet,java,mvc,运维,mysql

1,客户端发送请求到这个DispatcherServlet前端控制器

2,前端控制器会通过这个HandlerMapping处理器映射器,找到合适的处理器,就是通过这个输入的url,找到对应的handler

3,返回处理器的执行链,里面会包含多个拦截器的信息,以及需要查找的处理器handler的信息

4,找处理器适配器HandlerAdapter,这一步开始就会去调用handler里面的方法

5,通过执行这个handler里面的方法,会去找具体的controller方法

6,找到具体的controller之后,会返回一个modelAndView给这个HanderAdapter给处理器适配器

7,处理器适配器获取到ModelAndView之后,会将这个结果返回给DispatcherServlet前端控制器

8,通过这个ViewResolver视图解析器进行解析这个ModelAndView

9,解析完成之后,会将这个view返回给前端DispatcherServlet前端控制器

10,将model中的数据填充到这个view视图里面,最后去渲染视图

二,源码分析

1,首先打开这个DispatcherServlet类,可以发现这个类是继承了FrameworkServlet

public class  DispatcherServlet  extends  FrameworkServlet{ ...}

2,这个类里面有一个doService方法,里面有一个比较重要的方法,叫doDispatch方法

doDispatch(request, response);

3,进入这个**doDispatch()**方法里面,可以看到以下几行代码,主要是来返回这个处理器执行链,处理器适配器等操作。

//处理器执行链
HandlerExecutionChain mappedHandler = null;
//检测当前请求是否需要做文件上传
processedRequest = checkMultipart(request);
//获取需要的映射器以及拦截器等
mappedHandler = getHandler(processedRequest);
if (mappedHandler == null) { 
	noHandlerFound(processedRequest, response);
	return;
}
//找这个处理器适配器
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
//调用拦截器 
mappedHandler.applyPreHandle(processedRequest, response);
//适配器开始调用这个handler
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
//处理这个结果集
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);

4,接下来所有的分析都基于这个**doDispatch()**方法,来对里面的方法做一个具体的描述。

接下来看看这个getHandler方法,主要是通过这个request请求,来获取对应handler。

protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception { 
	if (this.handlerMappings != null) { 
        //遍历全部获取到的处理器映射器
		for (HandlerMapping hm : this.handlerMappings) { 
            //通过这个请求进行匹配,找到这个handler
			HandlerExecutionChain handler = hm.getHandler(request);
            //找到则返回
			if (handler != null) { 
				return handler;
			}
        }
	}
	return null;
}

5,接下来看看这个获取处理器适配器getHandlerAdapter的方法,适配器也有多种,会根据不同的handler适配不同的适配器。

protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException { 
	if (this.handlerAdapters != null) { 
		for (HandlerAdapter ha : this.handlerAdapters) { 
			if (ha.supports(handler)) { 
				return ha;
			}
		}
	}
	throw new ServletException();
}

6,再看这个doDispatch方法中的handle方法,可以点进去发现具体的实现如下。最终会以一个controller的对象返回

public  ModelAndView  handle(HttpServletRequest request,  HttpServletResponse response,  Object handler)  throws  Exception  { 
	//以一个controller的方式返回 
	return ((Controller) handler).handleRequest(request, response);
}

7,可以自定义重写这个handleRequest方法,最后以一个ModelAndView的格式返回给这个处理适配器,处理器适配器将这个ModelAndView返回给前端控制器。

@Override
public  ModelAndView  handleRequest(HttpServletRequest request,  HttpServletResponse response)  throws  Exception  { 
	ModelAndView mv = new ModelAndView();
	mv.setViewName("success");
	mv.addObject("hello","zhs");
	return mv;
}

8,接下来看看这个前端控制器处理这个ModelAndView的视图解析,主要是通过这个processDispatchResult方法来实现。

if (mv != null && !mv.wasCleared()) { 
    //如果这个modelAndView不为空,就会开始进入正式的解析
	render(mv, request, response);
	if (errorView) { 
		WebUtils.clearErrorRequestAttributes(request);
	}
}

再进入这个render方法里面,可以发现这个视图解析器会对这个视图进行一个具体的解析,并且会将解析的view返回给这个DispatcherServlet里面,最终会将这个数据进行一个转发或者重定向,对这个view进行一个渲染,最终响应到这个客户端。文章来源地址https://www.toymoban.com/news/detail-562648.html

//会进行一个具体的解析
view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
//解析
view.render(mv.getModelInternal(), request, response);
//输出
renderMergedOutputModel(mergedModel, getRequestToExpose(request), response);
//对这个获取的数据进行转发或者重定向
RequestDispatcher rd = getRequestDispatcher(request, dispatcherPath);

到了这里,关于springMVC执行流程详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringMVC_执行流程

    DispatcherServlet :前端控制器,用于对请求和响应进行统一处理 HandlerMapping :处理器映射器,根据 url/method可以去找到具体的 Handler(Controller) Handler :具体处理器(程序员,以后开发这一部分需要) HandlerAdapter :处理器适配器,进行处理器方法的执行 ViewResolver :处理视图相关的

    2024年02月09日
    浏览(26)
  • SpringMVC 执行流程

    SpringMVC 框架 ​ SpringMVC 是一个基于 Java 的实现了 MVC 设计模式的请求驱动类型的轻量级 Web 框架,通过把 Model,View,Controller 分离,将 Web 层进行职责解耦,把复杂的 Web 应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。 简而言之,SpringMVC 就

    2024年03月25日
    浏览(100)
  • 第12章:SpringMVC执行流程

    1.SpringMVC 常用组件 ①、DispatcherServlet: 前端控制器 ,框架提供。 作用:统一处理请求和响应,整个流程的控制中心,由它调用其他组件处理用户的请求 ②、HandlerMapping: 处理器映射器 ,框架提供 作用:根据请求的url、method等信息查找Handler即控制器方法 ③、Handler: 处理器,

    2024年02月08日
    浏览(32)
  • SpringMVC的执行流程与源码分析

    通过深入分析Spring MVC的源码,我们可以更好地理解其工作原理和内部机制。这有助于我们更好地使用该框架进行Web应用程序的开发,并解决实际开发中遇到的问题。同时,对于学习和研究Spring MVC框架的人来说,阅读源码并进行分析也是一种重要的学习和提升手段。 Spring MV

    2024年01月21日
    浏览(30)
  • 15、SpringMVC之常用组件及执行流程

    DispatcherServlet 是前端控制器,由框架提供,不需要工程师开发; 作用:统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理用户的请求。 HandlerMapping 是处理器映射器,由框架提供,不需要工程师开发; 作用:根据请求的 url、method 等信息去查找 Handler(即控制

    2024年02月05日
    浏览(42)
  • 【精选】SpringMVC简介及其执行流程,参数获取方式

    MVC模型 MVC全称Model View Controller,是一种设计创建Web应用程序的模式。这三个单词分别代表Web应用程序的三个部分: Model(模型):指数据模型。用于存储数据以及处理用户请求的业务逻辑。在Web应用中,JavaBean对象,业务模型等都属于Model。 View(视图):用于展示模型中的数

    2024年02月05日
    浏览(23)
  • 73.是否可以把我们所需的Bean都放入Spring­mvc子容器里面来管理(springmvc的spring-servlet.xml中配置全局扫描)?

    可以 , 因为父容器的体现无非是为了获取子容器不包含的bean, 如果全部包含在子容器完全用不到父容器了, 所以是可以全部放在springmvc子容器来管理的。 虽然可以这么做不过一般应该是不推荐这么去做的,一般人也不会这么干的。如果你的项目里有用到事物、或者aop记得也

    2024年02月21日
    浏览(30)
  • SpringMVC-2-Spring MVC拦截器详解:从入门到精通

    能够编写拦截器并配置拦截器 1.1 拦截器概念和作用 拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行 作用: 在指定的方法调用前后执行预先设定的代码 阻止原始方法的执行 总结:增强 核心原理:AOP思想 1.2 拦截器和过滤器的区别

    2024年02月12日
    浏览(32)
  • 浅聊一下SpringMVC的核心组件以及通过源码了解其执行流程

    MVC作为WEB项目开发的核心环节,正如三个单词的分解那样,Controller(控制器)将View(视图、用户客户端)与Model(javaBean:封装数据)分开构成了MVC,今天我们浅聊一下SpringMVC的相关组件以及通过源码了解器执行流程 我们需要先在web.xml里面配置DispatcherServlet,现在我给出两种

    2024年02月09日
    浏览(27)
  • SpringMvc拦截器和手写模拟SpringMvc工作流程源码详解

    目录 1. SpringMvc简介 1.1 什么是MVC 1.2 什么是SpringMvc 1.3 SpringMvc 能干什么 1.4 SpringMvc 工作流程 2. SpringMvc拦截器和过滤器 2.1 拦截器 2.1.1 拦截器作用 2.1.2 拦截器和过滤器的区别 2.1.3 拦截器方法说明 2.1.4 多个拦截器执行顺序 2.1.5 自定义拦截器 2.2 过滤器(附加) 3. 手写模拟Spri

    2024年02月09日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包