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)方法:

扫描二维码关注公众号,回复: 9518781 查看本文章
    @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(该方法里将会进行视图渲染,详见下方法图)之前执行

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

 由上方法介绍可知,之后会执行processDispatchResult方法,我们找到该方法

如果有异常,则会构建异常视图如果没有则会构建指定视图,可见render方法,该方法我们在自定义视图的博客中介绍过,是用来进行渲染视图的

执行完上述视图渲染后,进行afterCompletion方法

6、将请求返回客户端

猜你喜欢

转载自www.cnblogs.com/yimengxianzhi/p/12393446.html