springMVC-16 springMVC的执行流程-源码剖析

发布于:2025-06-26 ⋅ 阅读:(15) ⋅ 点赞:(0)

流程回顾

DeBug源码

准备工作

1.创建一个com/stein/springMVC/debug/DebugHandler.java

@Controller
public class DebugHandler {

    @RequestMapping("/debug")
    public ModelAndView debugDemo(HttpServletRequest request, HttpServletResponse response) {
        ModelAndView modelAndView = new ModelAndView("ok");
        modelAndView.addObject("username", "Stein");
        return modelAndView;
    }
}

2.创建ok页面,web/WEB-INF/page/ok.jsp

<body>
    <h1>进入到ok页面</h1>

    <%--这是JSP中的脚本表达式(Scriptlet)--%>
    显示用户名:<%=request.getAttribute("username")%><br><br>

    <%--这是EL(Expression Language)表达式。推荐使用这个,更安全--%>
    显示用户名2:${requestScope.username}
</body>

Debug过程

具体流程的步骤,来源于上面的流程图

1.发出请求url

Ctrl+N 找到DispatcherServlet的doService()方法,下断点。当前端发送一个请求,便到达了doService(),开启了页面访问的第一步

2.调用处理映射器

在DispatcherServlet内部先做一些准备工作

         1)创建获取了容器WebApplicationContext

什么是context上下文?今天终于有个直观、准确的理解了

就是一个容器,存放程序需要用到的数据的容器,它构成了应用上下文

        2)执行分发

        3)Step Into,出现了尚未初始化的处理器执行链

        4)mappedHandler就是HandlerExecutionChain类型,此时它已经拿到了DebugHandler.debugDemo()方法,以及拦截器interceptor

3.调用处理器适配器

1)HandlerAdapter

        它主要是包含了目标handler,debugHandler        

2)反射调用Handler

在这里进行反射调用。因为参数里面有方法的原因,需要按2次Step Into才能进去

继续 StepInto

继续 StepInto

这儿终于是在调用目标方法了

即完成了如下这步

3)断点到目标方法。放行,果然到了这里

对modelAndView进行估值,主要包含了model和视图view

继续

完成ModelAndView的返回

最终回到了这儿,得到了mv

4.调用视图解析器

1)处理分发结果,就是处理modelAndView。Step Into

2)先对mv进行解析,然后再render渲染 ,Step Into

3)视图解析,通过参数viewName,model,request,Step Into

4)此时调用的视图解析器是BeanNameViewResolver

第一次视图解析失败,返回的结果是null

第二次视图解析,调用的是InternalResourceViewResolver,继续Step Into

最终在这里创建了视图

逐层返回视图

完成图中9-返回View的工作

5.进行视图渲染

流程图片中的第10步

Step Into

渲染合并输出模型,Step Into

6.返回响应

通过forward将数据进行响应