前言
说起来还是比较有意思的,最近一个同学问我SSM(Spring+SpringMVC+Mybatis)整合开发,整体的思路和配置究竟是怎么个思路。这不禁让我想起了我一开始做SSM整合开发的苦逼时间。本以为不就是个框架吗,有啥难的。但后来真的发现自己动手做起来真的很不简单,尤其是对于新手同学来说。
于是我想,百度一下肯定是能够找到整合开发的例子吧。不幸的是,这些教程看起来很高大上,但是实际操作起来,不是缺包就是配置文件本身存在问题,再有就是代码根本就没有贴全。除了这些问题,仅有少数能够配置成功的文章,更是根本连配置信息、代码的解释都没有……
我心想,算了,还是自己手动撸一篇文章吧。于是,就有了接下来的这些内容。
本文,主要是针对已经学过Spring,了解SpringMVC和Mybatis的同学。 如果这些还暂时不了解,没关系,先去找些视频或者书籍看看SSM的相关知识再来(笑)。
我们以一个小型的项目作为依托,先介绍此项目的整体架构和用到的技术,并让你知道每个部分的作用;接着,我将介绍引入的jar文件(Maven),并带你大致了解一下Maven是个啥;接着就是配置文件,我将详细介绍配置文件的作用,以及为啥这样配置;最后,我们将实现一个查询的小功能。
这个文章将分成两篇,因为比较长,希望大家多谢耐心。
废话不多说,开始吧!
回顾内容
这小节,主要带你回顾下整合开发遵循的模式以及SSM三框架在其中的身份。
1)MVC开发模式: 你肯定知道,现在的B/S系统大多都是遵从MVC的开发模式开发的。M就是Model,模型层,负责数据的存储,就是代码中的类,最早的时候必须符合JavaBean的规范;V就是View,视图层,负责信息的展示,就是用户看到的应用页面;C就是Controller,控制器,这一层做的主要是逻辑层的操作,比如用户登录的后台代码,当然现在的逻辑层,在开发的过程中是由dao、service和controller共同组成的。
2)SSM这三者的作用分别是什么呢?
以前我一直天真的认为,SSM这三者的作用大致上应该是对应着MVC的,但是我错了,而且还错的离谱。这么说虽然有一定的依据,但是真的不准确。
Spring,实际上是一个Bean(各种类都能称为Bean)的超级大工厂,只要是代码中哪里需要用到某个类,直接和Spring要就可以了。而以前我们只能用到哪个类就new一个,或者通过工厂模式。实际上这个大工厂被我们称作IOC(依赖注入),就是生成类的某种方式,这大大降低了代码的耦合性。这里就能看到,硬说Spring是M层的也没啥毛病,但是Spring不但管理着以前的JavaBean,同样还管理着Dao层的类,这就有一些不一样了。关于这一点,我们后面的文章会说明。
SpringMVC,说SpringMVC是视图层的,这是肯定的。如果你用过Servlet+JSP的开发模式,你一定非常清楚,想要在一个JSP页面中绑定数据(数据显示在页面中),实际上是非常困难的,需要通过request的setAttribute方法,然后JSP页面上再来一个request.id之类的东西,总之非常不方便。还有就是Controller接收参数,如果要接收参数的话,Servlet的开发只能在get或者post方法中写参数的名字。如果参数非常多,可想而知,这得多么复杂。SpringMVC就非常简单了,如果我们想要接收很多参数的话,直接就能把这些参数封装在一个类中,把类放到参数的位置就好了,SpringMVC就会自动帮助我们完成参数接收的过程,非常方便。实际上,在这个过程中,依然有Spring框架中IOC模块的支持。
Mybatis,同样的,mybatis只能算作是Controller层中的一部分,即dao。dao也叫做持久层,作用就是将数据持久化到数据库之类的东西里面,也就是ORM框架。Mybatis非常好用,以前我们做开发的时候,一般都是写JSBC,就算不直接用JDBC,还是会用DBUtils之类的数据库组件,但是这些组件并不灵活,稍微有些问题就无法读取或写入数据到数据库。Mybatis的出现大大解决了这个问题。同样作用的框架还有Hibernate,但是它和Mybatis相比就太臃肿了(Spring同样可以整合Hibernate)。
好了,下面我们就来看看这三大框架究竟是如何无缝的组合在一起的吧。
整合的整体架构
我们先来说一下项目的目录结构。
在这个小的web项目中,大的目录分成了java、resources、webapp三部分。
java中有bean,这个目录是存放和数据库对应的基本类的;controller,这里面是存放控制器类的,这就类似于之前Servlet的作用;dao,这是存放数据库映射文件的,功能和之前的JDBC相同,最后是service,服务层,controller负责处理逻辑操作,service负责的是和dao层交互,实现具体的功能,比如插入一条数据之类的。
resources,资源路径,多数的配置文件和Mybatis的映射文件都放在这里,具体的作用在后面就会见分晓了。
webapp,这里面的内容和之前的开发一样,只是多出来一个SpringMVC的配置文件
知道了上面目录结构的功能,就能看下面这张结构图了:
我们将整体的结构分成了五个部分,分别是前端页面、Spring容器、数据库连接池、数据库(这两部分其实可以合成一部分)、Maven依赖管理。
完成一个web请求的个过程大致如下:
前端页面发起一个http请求:localhost:8080/user
http请求被Tomcat服务器得到,接着到Servlet中寻找映射路径,当然有了SpringMVC就无需去执行复杂的配置了,我们可以像Servlet3.0那样使用注解开发,SpringMVC前端控制器的注解是@RequestMapping("/user"),通过请求的url,寻找映射路径,找到对应Controller类的方法
在Controller中,注入了诸多的Service,Controller可以直接调用这些service进行操作
controller调用Service后,Service就要执行对应的方法,在Service中同样注入了dao层的mapper,即可调用相应的mapper方法执行数据库操作
mybatis中,dao层分成两部分,分别是接口和mapper映射文件,调用mapper接口方法的时候,就会去找到对应方法的映射,这些映射就是执行数据库操作的语句,本质上还是sql语句
项目肯定是有很多的依赖文件的,比如springframwork,现在有了Maven就不需要我们手动导入了,只需要在Maven中配置即可。
完成controller操作以后,再通过SpringMVC前端控制器控制页面跳转或者重定向之类的操作,但是现在一般使用ajax技术,提高前端页面的性能。
整个请求过程经历的各个模块,我想我已经说的很清楚了。其中最为核心的是Spring,Spring管理着这些类,供其他类完成依赖注入。
Maven依赖管理
我们之前开发的时候,是需要手动的将一个个的类导入到我们的工作空间中,然后才能进行正常的代码编写。尽管如此,有时候还是会出现一些诸如ClassNotFountException之类的异常。
Maven的出现改变了这种情况,我们只需要配置文件,就能够很方便的将jar文件导入到我们的工作空间中,同时还能够实现将项目打成war包的操作,更加简便了我们的开发。
其实Maven的配置文件的核心就一个(个人认为),即三坐标。那么,三坐标是什么呢?我们来简单的看一段Maven的配置文件:
<dependencies>
<!-- 数据库连接池、驱动 -->
<!-- https://mvnrepository.com/artifact/c3p0/c3p0 -->
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1</version>
</dependency>
</dependencies>
这里我们引入的jar文件就是C3P0数据库连接池文件,可以看到,所谓的三坐标就是groupId、artifactId、version。如果我们需要引入一个jar文件,只需要去Maven中央仓库搜索,就能够找到对应的三坐标啦。