写在前面:当初整理SSM原理时,参考了网上一些前辈的文章,时间久远已经忘记来源,所以文中原理部分如有侵权请联系我删除。
基于SSM框架的仿天猫商城网站+电商后台管理系统
本文视频讲解
base基类
controller、service、serviceImpl、dao都要继承此基类
po/entity实体类
实体类,定义对象的属性和get、set等方法。一般,一个实体类对应数据库里的一张表。
service业务层
Service层的业务实现,具体要调用到已定义的DAO层的接口。为controller层提供服务,接受控制层的参数,完成相应的功能,并返回给controller。
mapper/dao持久层
主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,Mapper.java:定义要对数据库进行的操作,比如 insert、delete、update、listAll等方法。
Mapper.xml:将Mapper.java中的方法按照id映射成sql。
controller控制器
连接页面请求和服务器,获取页面请求的参数,通过自动装配,映射不同的URL到相应的处理函数,并获取参数,对参数进行处理,之后传给服务层。
resource存放静态资源文件,如一些前端文件,css、js、图片等。
WEB-INF/jsp是前端页面,对应MVC中的V,视图。
web.xml是JavaWeb项目的入口文件。
Maven通过pom.xml配置,引入项目所需要的jar包。
SSM框架是Spring MVC + Spring + MyBatis框架的整合。
使用Spring MVC负责请求的转发和视图管理;Spring实现业务对象管理;MyBatis作为数据对象的持久化引擎。
DAO层(mapper):主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此
1、DAO层的设计首先是设计DAO的接口,
2、然后在Spring的配置文件中定义此接口的实现类,
3、然后就可在模块中调用此接口来进行数据业务的处理,而不用关心此接口的具体实现类是哪个类,显得结构非常清晰,
4、DAO层的数据源配置,以及有关数据库连接的参数都在Spring的配置文件中进行配置。
Service层:主要负责业务模块的逻辑应用设计。
1、首先设计接口,再设计其实现的类
2、接着再在Spring的配置文件中配置其实现的关联。这样我们就可以在应用中调用Service接口来进行业务处理。
3、Service层的业务实现,具体要调用到已定义的DAO层的接口,
4、封装Service层的业务逻辑有利于通用的业务逻辑的独立性和重复利用性,程序显得非常简洁。
Controller层:负责具体的业务模块流程的控制
1、在此层里面要调用Service层的接口来控制业务流程,
2、控制的配置也同样是在Spring的配置文件里面进行,针对具体的业务流程,会有不同的控制器,我们具体的设计过程中可以将流程进行抽象归纳,设计出可以重复利用的子单元流程模块,这样不仅使程序结构变得清晰,也大大减少了代码量。
View层:此层与控制层结合比较紧密,需要二者结合起来协同工发。View层主要负责前台jsp页面的表示。
各层联系:
1、DAO层,Service层这两个层次都可以单独开发,互相的耦合度很低,完全可以独立进行,这样的一种模式在开发大项目的过程中尤其有优势
2、Controller,View层因为耦合度比较高,因而要结合在一起开发,但是也可以看作一个整体独立于前两个层进行开发。这样,在层与层之前我们只需要知道接口的定义,调用接口即可完成所需要的逻辑单元应用,一切显得非常清晰简单。
3、Service逻辑层设计
Service层是建立在DAO层之上的,建立了DAO层后才可以建立Service层,而Service层又是在Controller层之下的,因而Service层应该既调用DAO层的接口,又要提供接口给Controller层的类来进行调用,它刚好处于一个中间层的位置。每个模型都有一个Service接口,每个接口分别封装各自的业务处理方法。
spring是一个容器框架,它可以接管web层,业务层,dao层,持久层的各个组件,并且可以配置各种bean, 并可以维护bean与bean的关系,当我们需要使用某个bean的时候,我们可以直接getBean(id),使用即可。
Spring目的是让对象与对象(模块与模块)之间的关系没有通过代码来关联,都是通过配置类说明管理的(Spring根据这些配置 内部通过反射去动态的组装对象) ,Spring是一个容器,凡是在容器里的对象才会有Spring所提供的这些服务和功能。
MyBatis是对jdbc的封装,让数据库底层操作变的透明。MyBatis的操作都是围绕一个sqlSessionFactory实例展开的。MyBatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过sqlSessionFactory拿到一个sqlSession,再执行sql命令。
@Controller使用注解,这样spring mvc可以扫描并识别到它,这个配置可以在com.jingmall/spring/springmvc.xml里找到
@RequestMapping(“/login”)解析前端的url,找到相应的控制器
@RequestMapping(“login”)解析前端的url,找到相应的管理员登录入口方法
login()方法返回一个路径字符串"/login/mLogin",这个路径指向项目里的某个jsp页面,jsp文件根目录/WEB-INF/jsp/,以及文件后缀.jsp,在指定时都可以省略都省略
mLogin.jsp
引入了很多css样式,这些是美工做好的,不是后端开发者的任务,我们需要重点关注表单form里的内容,用户名的输入是文本类型,给这个文本里的数据起个名字name,这个相当于前后端数据交互的依据,是必填的。密码的输入是密码类型的。登录按钮是提交类型,点击登录会提交表单,发送一次请求。
简单来说,管理员登录入口方法只做了一件事,就是把jsp页面渲染出来
看回LoginController.java,继续看下一个方法,管理员登录验证checkLogin()
传进来的参数是一个Manager类型的对象,所以需要先写Manager实体类
Manager.java (/com.jingmall/po)
Manager实体类对应数据库里的Manager表
调用ManagerService里的getByEntity(manager)方法,参数和返回类型是一个Manager实体类对象。
宏观上说,这个方法要做的事情是通过对象查询manager表并返回这个实体对象。比如我们在登录页面输入用户名和密码,前端页面提交数据到后端,后端实例化一个manager实体类对象,把用户名和密码赋值给这个对象,因为只提交了用户名和密码的数据,所以这个manager对象的realName属性值为null,通过调用一系列的接口最终到达数据库进行查询,如果查得到,就将整条记录赋给这个对象,这时管理员对象的真实姓名这个属性就变得有值了。
详细理解下这中间一系列调用接口的过程,controller通过调用service层的接口,找到dao层对应的接口,在dao层完成跟数据库的交互,实现数据落地。
service里的getByEntity()接口,这个接口的实现类在serviceImpl.java里
这个方法做的事情是返回BaseDao里的getByEntity()接口,虽然方法的名字都是getByEntity(),但它们所在层次不一样,每个层次负责的事情是不一样的,当然这些方法名可以不一样,用到的时候指明就行。再看dao层的getByEntity()接口
/BaseDao.java/