1. 运行流程图
2. HelloWorld
我们再次来编写一个HelloWorld项目,具体步骤如下所示:
加入如下的jar包
在web.xml中配置DispatcherServlet,并拦截所有。
在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>在WEB-INF目录创建views目录,并编写success.jsp成功页面。
在处理器类HelloWorld中定义如下方法。
1
2
3
4
5"/helloWorld") (
public String helloWorld() {
System.out.println("Hello World");
return "success";
}
3. 运行流程详解
3.1 子流程一
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方法中会使用异常解析器进行异常的解析。