0%

(十一)SpringMVC学习笔记-SpringMVC运行流程

1. 运行流程图

在这里插入图片描述

2. HelloWorld

我们再次来编写一个HelloWorld项目,具体步骤如下所示:

  1. 加入如下的jar包
    在这里插入图片描述

  2. 在web.xml中配置DispatcherServlet,并拦截所有。

  3. 在MVC配置文件applicationContext-mvc.xml中配置<context:component-scan>和视图解析器InternalResourceViewResolver。

    1
    2
    3
    4
    5
    6
    7
    8
    <!-- 扫描指定包下的注解 -->
    <context:component-scan base-package="com.shoto.springmvc"/>

    <!-- 配置视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/"></property>
    <property name="suffix" value=".jsp"></property>
    </bean>
  4. 在WEB-INF目录创建views目录,并编写success.jsp成功页面。

  5. 在处理器类HelloWorld中定义如下方法。

    1
    2
    3
    4
    5
    @RequestMapping("/helloWorld")
    public String helloWorld() {
    System.out.println("Hello World");
    return "success";
    }

3. 运行流程详解

3.1 子流程一

当我使用http://localhost:8080/SpringMVC_6/helloWorld2进行请求时,因为此时SpringMVC不存在helloWorld2映射,且在未配置<mvc:default-servlet-handler/>的情况下,此时控制台与打印如下信息并且给出404页面(**上述运行流程图黑线部分**):

1
警告: No mapping found for HTTP request with URI [/SpringMVC_6/helloWorld2] in DispatcherServlet with name 'springDispatcherServlet'

3.2 子流程二

现在我们在MVC配置文件中配置<mvc:default-servlet-handler/>和<mvc:annotation-driven/>,并在WebContent目录在创建一个hello.html文件(目标资源),此时使用http://localhost:8080/SpringMVC_6/hello.html是响应成功的(**上述运行流程图绿线部分**)。

3.3 子流程三

当SpringMVC中存在对应的映射时,首先会按如下顺序依次执行。(上述运行流程图红线部分)。

1. 通过HandlerMapping获取HandlerExecutionChain对象
在这里插入图片描述
HandlerExecutionChain由Handler对象和拦截器组成。
在这里插入图片描述
HandlerMapping定义了请求和Handler对象之间的映射。

2. 获取HandlerAdapter适配器
在这里插入图片描述
HandlerAdapter适配器会进行参数的绑定,数据校验和格式化等等操作。

3. 调用拦截器的 preHandle方法
在这里插入图片描述
4. 调用目标Handler的目标方法得到ModelAndView对象
在这里插入图片描述
5. 调用拦截器的postHandle方法
在这里插入图片描述
6. 调用processDispatchResult判断是否存在异常
在这里插入图片描述
7. 在没有异常的情况下,调用render方法中的resolveViewName解析视图。
在这里插入图片描述
8. 由ViewResolver组件根据ModelAndView对象得到实际的View
在这里插入图片描述
9. 调用render方法,最后由InternalResourceView类的renderMergedOutputModel方法渲染视图,并进行跳转操作
在这里插入图片描述
10. 调用triggerAfterCompletion方法,执行拦截器的afterCompletion方法
在这里插入图片描述
在这里插入图片描述

3.4 子流程四

调用processDispatchResult判断存在异常后(上述运行流程图蓝线部分),由HandlerExceptionResolver组件处理异常,得到新的ModelAndView对象。
在这里插入图片描述
processHandlerException方法中会使用异常解析器进行异常的解析。
在这里插入图片描述

------ 本文结束------