专栏链接:https://chenhx.blog.csdn.net/category_10263372.html
作者:谙忆
Spring MVC是属于表现层的框架,是属于Spring框架Web Flow模块的一部分。
Spring MVC是一个模型-视图-控制(MVC)框架,实现了Model-View-Controller模式,将数据、业务和展示之间进行了分离,这种分离使我们的开发更容易定制。
Spring MVC中模型-视图-控制说明:
模型:模型一般封装数据,通常由基本的Java对象(POJO)组成
视图:主要用来呈现数据模型,通常是生成浏览器可以解析的HTML输出,用户可以浏览查看
控制:也就是控制器,用来处理用户的请求,通过请求构建合适的模型将其传递到视图进行呈现给用户浏览
Spring MVC相关流程说明:
DispatcherServlet接口,Spring提供的前端控制器,所有的请求都需要它来进行分发给对应的Handler(根据不同请求信息,比如说Url来进行分发)。在前端控制器将请求分发给Controller之前,需要先通过HandlerMapping(处理器映射器)解析请求链接,然后根据请求链接找到执行这个请求的类,也就是Handler。然后定位到具体页面控制器(Controller)
页面控制器(Controller)进行功能处理,将收集的参数绑定到一个对象,该对象在Spring MVC中称为命令对象,再将命令对象委托给业务对象进行业务处理,处理后将返回ModelAndView(模型数据和逻辑视图)
前端控制器根据返回的逻辑视图名,选择对应的视图进行渲染,并把模型数据传入以便进行视图渲染。最后将视图返回给用户。
整个运行原理可以整理如下几个步骤:
1、用户提交请求到DispatcherServlet
2、由DispatcherServlet前端控制器根据请求链接查询一个或者多个HandlerMapping,找到处理请求的Controller
3、前端控制器将请求委托到Controller
4、Controller调用业务对象,处理完逻辑以后,返回ModelAndView
5、前端控制器根据Controller返回的ModelAndView,找到ModelAndView指定的视图
6、最后将视图结果显示到客户端,展示给用户看
Spring MVC的运行流程基本是上面所述了,了解流程是开始学习Spring MVC的第一步。
关于Spring MVC的更多知识,将在第二篇Spring MVC框架进行大篇幅详解。
Redis是一个开源的Key-Value数据库,底层是使用ANSI C编写的。是目前最流行的键值对存储数据库之一。由于Redis读写的高性能,所以在Java项目中,开发者一般使用它来作为第三方缓存。
Redis属于人们常说的NoSQL数据库或者说是非关系型数据库。Redis除了能存储普通的字符串之外,还可以存储list、set、zset、hash等数据结构的存储。一般来说,只有在对性能要求非常高或者是其他必要的情况下,才会使用Redis,因为Redis是内存数据库,存储费用相比关系型数据库来说是要高一些的。在平时的使用中,应该根据需要来进行选择是否使用Redis,并且考虑是将Redis作为数据库还是仅仅只是缓存,以及应该如何通过复制、持久化和事务等手段保证数据的可靠性和完整性。
Redis虽然是单线程模型,但是由于Redis的性能非常优异,所以在绝大多数的场景下,Redis的性能都不会是瓶颈。
Redis 的优势:
Redis的性能非常高,Redis读的速度大约11万次/秒,写的速度大约是8.1万次/秒
Redis具有丰富的数据类型存储,支持string、list、hash、set、zset等数据类型的存储
Redis的所有操作都是原子性的,所以对于Redis来说,操作要么是成功执行,要么就是失败(完全不执行)。对于多个操作,Redis支持事务,可以通过MULTI和EXEX指令进行包装,然后进行原子性执行。
Redis具有丰富的特性,支持publish/subscribe(消息的发布和订阅),通知,设置key过期时间等特性
Redis可以用来作为存储的数据库,队列,以及缓存系统。
Redis作为缓存系统的时候,可以对每个键值对设置过期时间(强烈建议对于每个键值对都设置过期时间,即时过期时间很长都没事,但不要不设置过期时间)。
Redis作为队列,LPUSH类型建可以用来实现队列,支持阻塞时读取,非常容易实现一个高性能的优先级队列。
Redis也是可以用来作为数据库直接存储数据,但是这个场景并不实用,基本上都是将Redis作为高速缓存和session状态的存储层,搭配其他的关系型数据库使用。
Redis不适合作为数据库存储数据的部分原因如下:
Redis的数据全部是内存占用,在数据量非常大的情况下,每次重启,进行备份,需要将数据全部加载进内存,显然是不合理的,内存的成本比磁盘大很多
Redis半持久化模式下,并不是实时的,一旦断电,即会丢失一些数据
Redis的查询主要是对于Key的查询,进行复杂的数据查询非常麻烦
Redis的事务支持过于简单
不排除在某些特定场景下使用Redis作为数据更为实用的情况(比如说对性能要求非常高,内存足够大,允许一定程度的数据丢失的情况),但是建议还是使用关系型数据库作为存储数据库更好。
经过前面的几个小节,对于Spring,Spring MVC和MyBatis都有了一定的了解。本小节将梳理这三个框架是如何分工合作的。
Java程序主要分为以下几层:
视图层,也就是View层
用户通过视图层来和我们的应用进行交互
进行页面的展示,比如说JSP,html等
该层与controller层结合开发
表现层,也就是controller层(Handler层)
主要是负责控制用户分发访问对应的业务模块
controller层通过调用service层接口来控制具体的业务流程,service层的接口通过Spring配置进行注入。
业务层,service层
负责业务模块的逻辑处理
先设计接口,再实现接口的实现类,通过Spring配置文件中的配置初始化
在service进行一些逻辑处理后再调用DAO层定义的接口实现数据库的操作
持久层,DAO层
负责和数据库进行交互,用来处理数据的增删改查
DAO层的设计只需要设计DAO层的接口,实现则通过MyBatis的配置来进行映射到执行具体的SQL语句
Spring、Spring MVC、MyBatis分别负责的模块流程图如图1-6所示。
图1-6 Spring、SpringMVC、MyBatis流程图
Spring负责的是整个项目中Bean的管理,理解成一个容器框架。
Spring MVC已经可以算是融合在Spring中的产品,主要负责的是Controller层,让开发者更容易定制某些技术,例如,不局限于前端展示只能用JSP技术。将控制器,模型对象以及处理程序的对象进行了分离。
MyBatis负责让开发者使用简单的XML配置或注解实现将接口和POJO映射成数据库中的数据以及操作。