(4.1)Spring MVC执行原理和基于Java的配置过程
一、Spring MVC执行原理和基于Java配置的配置过程
(一)Spring MVC执行过程,大致为7步。

- 所有的请求都会经过Spring的一个单例的DispacherServlet。
- DispatcherServlet会查询一个或多个处理器映射,找到请求的URL所对应的控制器。
- 把请求的内容传递给控制器后等待控制器处理这些内容。
- 控制器在逻辑处理后会产生一些数据(例如查询所有的用户信息),这些数据存在在模型(Model)中,同时返回一个视图名用作渲染数据。
- DispacherServlet找到视图解析器,视图解析器通过视图名找到真正的视图实现。
- DispacherServlet找到视图实现后再把模型(Model)的数据渲染到视图中。
- 把最终的视图通过响应对象传递给客户端
(二)搭建Spring MVC
- 配置DispacherServletServlet
DispatcherServlet是SpringMVC的核心,所有请求通过它来接触到框架,它又把请求转发到其他的组件。
按照传统的方式,Servlet需要配置在web.xml的文件中。但是,在Servlet3和Spring3.1之后,又提供了另外一种依据Java类配置的方式。我们先看看这种方式的代码是什么样的。
public class SpittrWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
protected Class<?>[] getRootConfigClasses() {
System.out.println("用来加载spring管理的中间层和数据层组件,下面会给出具体代码");
return new Class[]{RootConfig.class};
}
protected Class<?>[] getServletConfigClasses() {
System.out.println("用来加载web相关的组件,如控制器、视图解析器等,下面会给出具体代码");
return new Class[]{WebConfig.class};
}
protected String[] getServletMappings() {
System.out.println("如果映射是/,代表DispacherServlet是默认的Servlet");
return new String[]{"/"};
}
}
“SpittrWebAppInitializer”是我们自定义的类名,它继承了AbstractAnnotationConfigDispatcherServletInitializer并且实现了三个方法,下图解释了为什么需要继承这个类,以及为什么继承了这个类后,请求就能自动的转到DispacherServlet来处理。

- 启用SpringMVC
当配置完DispacherServlet后,还需要启用SpringMVC组件。
如果使用XML启动,可以使用<mvc:annotation-driven>。
当基于Java配置时,需要在配置类上添加@EnableWebMvc注解:

但是如果只添加一个注解的话,会出现下面的问题:
(1)没有配置视图解析器,Spring会使用BeanNameView-Resolver,这个视图解析器会查找ID与视图名相同的Bean,并且这个Bean需要实现View接口,通过这种方式来解析视图。
(2)没有启动组件扫描。Spring只能使用显式配置的控制器
(3)DispacherServlet会映射为应用默认Servlet,会处理所有请求,包括静态资源,如图片和样式表。
下面是一个更完整的Config,解决了上面的问题。

除了WebConfig还有一个RootConfig,由于现在只关注web,RootConfig很简单:

(4.1)Spring MVC执行原理和基于Java的配置过程的更多相关文章
- Spring MVC执行原理和基于Java的配置过程
一.Spring MVC执行原理和基于Java配置的配置过程 (一)Spring MVC执行过程,大致为7步. 所有的请求都会经过Spring的一个单例的DispacherServlet. Dispa ...
- spring Mvc 执行原理 及 xml注解配置说明 (六)
Spring MVC 执行原理 在 Spring Mvc 访问过程里,每个请求都首先经过 许多的过滤器,经 DispatcherServlet 处理; 一个Spring MVC工程里,可以配置多个的 ...
- Spring MVC执行原理
spring的MVC执行原理 1.spring mvc将所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责对请求 进行真正的处理工作. 2.DispatcherSer ...
- Spring Mvc和Mybatis的多数据库访问配置过程
Spring Mvc 加Mybatis的多数据库访问源配置访问过程如下: 在applicationContext.xml进行配置 <?xml version="1.0" en ...
- spring的MVC执行原理
spring的MVC执行原理 1.spring mvc将所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责对请求 进行真正的处理工作. 2.DispatcherSer ...
- Spring MVC执行的流程
1.Spring MVC应用的开发步骤 a.在web.xml文件中定义前端控制器DispatcherServlet来拦截用户请求.由于Web应用是基于请求/响应架构的应用,所以 不管哪个MVC Web ...
- Spring MVC简单原理
Spring MVC原理 针对有Java Web基础.Spring基础和Spring MVC使用经验者. 前言 目前基于Java的web后端,Spring生态应该是比较常见了.虽然现在流行前后端分离, ...
- Spring MVC工作原理(好用版)
Spring MVC工作原理 参考: SpringMVC工作原理 - 平凡希 - 博客园https://www.cnblogs.com/xiaoxi/p/6164383.html SpringMVC的 ...
- 一文读懂Spring MVC执行流程
说到Spring MVC执行流程,网上有很多这方面的文章介绍,但是都不太详细,作为一个初学者去读会有许多不理解的地方,今天这篇文章记录一下我学习Spring MVC的心得体会 话不多说,先上图: ...
随机推荐
- 201521123063 《Java程序设计》 第14周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图.Onenote或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 1.1 建立数据库test.表students. ...
- 201521123064 《Java程序设计》第11周学习总结
1. 本章学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. ① 定义Thread类的子类,覆盖Thread类的run()方法,然后创建该子类的实例(一般不用该方法,开销大. ...
- JavaSE集合(十)之Map
前面给大家介绍了集合家族中的Collection家族,这一篇给大家分享的是集合中的另一个家族就是Map家族.以前的时候学习Map的时候没有很认真的去学习,我觉得很多东西还是不是很清楚. 这次我将总结的 ...
- Configuration Extensions - 简化配置,让你配置支持变量
在开发"RabbitCloud"项目时,使用配置文件发现会有很多重复值,所以我基于"Microsoft.Extensions.Configuration"写了一 ...
- String,StringBuffer,StringBuilder的区别及其源码分析
String,StringBuffer,StringBuilder的区别这个问题几乎是面试必问的题,这里做了一些总结: 1.先来分析一下这三个类之间的关系 乍一看它们都是用于处理字符串的java类,而 ...
- 网页端HTML使用MQTTJs订阅RabbitMQ数据
最近在做一个公司的日志组件时有一个问题难住了我.今天问题终于解决了.由于在解决问题中,在网上也查了很多资料都没有一个完整的实例可以参考.所以本着无私分享的目的记录一下完整的解决过程和实例. 需求:做一 ...
- Excel开发之旅
开发环境:Microsoft Visual Studio 2015,Office 2013 开发语言:C# 1.创建工程:文件à新建à项目,选择office 外接程序àExcel 2013和2016 ...
- DialogFragment的应用
一.DialogFragment简单介绍: 1.基本概念 DialogFrament 指一个与fragment建立了关联的Dialog, 随fragment生, 随fragment死, 即Dialog ...
- 为什么要用深度学习来做个性化推荐 CTR 预估
欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:苏博览 深度学习应该这一两年计算机圈子里最热的一个词了.基于深度学习,工程师们在图像,语音,NLP等领域都取得了令人振奋的进展.而深 ...
- vue2.0 网页标题更新实现思路
一.注册全局指令 1.注册一个全局指令 Vue.directive('title', { inserted: function (el, binding) { document.title = el. ...