SpringMVC运行原理总结

请求运行图

在这里插入图片描述

图解

在这里插入图片描述

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

在这里插入图片描述

2、DispatcherServlet收到请求调用HandlerMapping处理器映射器

a、进入DispatcherServlet类Service方法(位于DispatcherServlet类继承的——FrameworkServlet类中)捕获该请求:

@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
       throws ServletException, IOException {

   HttpMethod httpMethod = HttpMethod.resolve(request.getMethod());
   if (HttpMethod.PATCH == httpMethod || httpMethod == null) {
       processRequest(request, response);
   }
   else {
       super.service(request, response);
   }
}

b、获取到对应方法之后会调用对应(此处为doGet)方法:

@Override
protected final void doGet(HttpServletRequest request, HttpServletResponse response)
         throws ServletException, IOException {

     processRequest(request, response);
 }

 @Override
 protected final void doPost(HttpServletRequest request, HttpServletResponse response)
         throws ServletException, IOException {

     processRequest(request, response);
 }

//还有方法不列举......

c、进入processRequest方法——执行其doService方法:

在这里插入图片描述

d、而此doService方法也就是DispatcherServlet中的doService方法(该方法将一些值传如request对象中):

在这里插入图片描述

e、然后执行其中的doDispatch方法:

在这里插入图片描述

f、 进入该方法可知该方法处理了适配器以及GET请求:

在这里插入图片描述

g、然后执行Handler方法并构建视图processDispatchResult:

在这里插入图片描述

3、此处如果没有处理请求Handler的方法(请求地址找不到)

进入processDispatchResult方法查看处理

a、配置了静态资源< mvc:default-servlet-handler />,并且此次请求属于静态资源配置范围,则会得到静态资源的视图

b、没有配置静态资源< mvc:default-servlet-handler />,或者请求不属于范围内,则会构建框架自带的一个异常视图(如404页面等)

在这里插入图片描述

4、有处理请求Handler方法(请求地址在配置范围内)

a、HandlerMapping 获取HandlerExecutionChain 对象

在这里插入图片描述

b、获取 HandlerAdapter对象

在这里插入图片描述

5、拦截器三个方法与视图获取的执行先后顺序

a:preHandle方法(在Handler Method方法执行前调用。功能举例:校验、实现权限等)

在这里插入图片描述
通过标蓝代码我们可以看到preHandle在Handler Method之前执行,mappedHandler.applyPreHandle(processedRequest, response)执行的也就是我们创建的拦截器里的preHandler方法,我们可以在该方法里通过返回boolean的值来决定是打回请求(拒绝访问),还是继续执行之后的步骤

b:postHandle方法(在Handler Method方法执行后,渲染视图前调用。功能举例:加签名,印章等)

标蓝部分即postHandlle的执行,可见他在Handler Method之后执行,而在processDispatchResult(该方法里将会进行视图渲染,详见下方法图)之前执行
标蓝部分即postHandlle的执行,可见他在Handler Method之后执行,而在processDispatchResult(该方法里将会进行视图渲染,详见下方法图)之前执行

c、afterCompletion方法(在渲染视图之后被调用。功能举例:释放资源)

在这里插入图片描述
so, 由上方法介绍可知,之后会执行processDispatchResult方法,我们找到该方法如果有异常,则会构建异常视图如果没有则会构建指定视图,可见render方法,该方法我们在自定义视图的博客中介绍过,是用来进行渲染视图的执行完上述视图渲染后,进行afterCompletion方法

6、将请求返回客户端

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值