【SSM学习】03-SSM整合

发布于:2022-12-26 ⋅ 阅读:(310) ⋅ 点赞:(0)

SSM(B站黑马)学习笔记

01-1-Spring概述
01-2-Spring IOC
01-3-Spring AOP
01-4-Spring 事务
02-SpringMVC
03-SSM整合
04-Maven高级
05-SpringBoot
06-MyBatisPlus



前言

SSM(B站黑马)学习笔记 03-SSM整合


03-SSM整合





SSM整合(配置整合)

1.创建工程

使用骨架(模板)的方式创建Maven Web项目

2.pom.xml导入所需依赖

<dependencies>
  <!--SpringMVC-->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.10.RELEASE</version>
  </dependency>

  <!--servlet-->
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
  </dependency>

  <!--SpringMvc json解析库-->
  <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.0</version>
  </dependency>

  <!--mybatis依赖-->
  <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.5</version>
  </dependency>

  <!--mysql 驱动-->
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.24</version>
  </dependency>

  <!--数据库连接池-->
  <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.16</version>
  </dependency>

  <!--Spring操作数据库-->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.2.10.RELEASE</version>
  </dependency>

  <!--Spring整合Mybatis-->
  <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.0</version>
  </dependency>

  <!--JUnit-->
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
    <scope>test</scope>
  </dependency>

  <!--Spring整合JUnit-->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>5.2.12.RELEASE</version>
  </dependency>
</dependencies>

<build>
  <plugins>
    <plugin>
      <!--tomcat 插件-->
      <groupId>org.apache.tomcat.maven</groupId>
      <artifactId>tomcat7-maven-plugin</artifactId>
      <version>2.2</version>
    </plugin>
  </plugins>
</build>

3.创建包层次结构

4.Spring核心配置

5.Spring整合Mybatis

6.SpringMVC配置

SSM整合(功能模块开发)

导入sql文件
链接:https://pan.baidu.com/s/16nmiqsj4DhHzM–N_nkplQ?pwd=wzvu
提取码:wzvu

功能模块开发



Spring事务开启


SSM整合(接口测试)

在企业开发时,有两个环节要进行测试,一个是业务层(service)要使用JUnit对接口进行测试,另一个是表现层(controller)要使用PostMan对接口进行测试

Spring整合JUnit

这里只测了两个

PostMan测试

表现层与前端数据传输协议(Result结果集)

定义

要将后端的数据与前端连接,结果在连的时候前端人员给我们反馈一些问题,当你现在进行增删改操作时返回的是true。但是进行查询操作的时候查了单条数据,前端发现取出来以后这不是直接数据,是json格式还要进去解析才能得到,当进行查询全部的时候,发现拿到以后直接进行解析json格式发现得不到数据他是个json数组,要遍历以后才能解析。

每次操作后得到的格式各种各样,这样的话后端和前端要沟通好,把格式给做一个整合,变成统一的格式交给前端。于是我们就想了一个方案,我们创建一个模型类一般就叫结果(Result),在里面声明一个data属性,以后我们操作的结果数据都扔到data这样就不乱了,就知道哪里面放的是数据了。前端就知道数据都在data里,在data里取数据就行。

还有一个问题,增删改返回的都是true,前端不知道这是哪个操作的true。既然现在没办法从数据上区分操作,我们必须得再加一个识别的符号,比如说1代表新增、2代表修改、3个了删除。那前后端约定好,把上面的格式又改了,我们在封装的结果集再加一个code属性,比如说第一组数据"code":20031就代表这是个删除操作,以后看到20031的结果就是删除操作的结果,是true就代表删除成功了是false就代表删除失败。20041呢代表查询,不管是查单条还是查全部都代表查询。

增删改的问题解决了查询又出问题了,为什么,假如查了一个不存在的数据,那这个时候data一定返回是个null。那"code":20041代表查询,没说查询成功还是失败,这时前后端又约定,结尾0就查询失败,1就成功。这么做程序员是知道了,前端页面显示给用户什么呢,不能什么都不说吧。于是又在封装的结果集中增加一个message(msg)属性,对操作的消息进行显示。

这套模型就是前端人员写页面和后端人员写服务器之间通信的协议,也就是大家都按照约定来。在企业开发中教程在一块跑协议、联调协议说的就是这个东西。目前我们使用的协议就定义成这样(如下图),我们定义一个类Result,里面封装三个属性 数据 data、编码 code、消息 msg。有了这三个东西前后端人员就能合作工作了。注意这个类定义的时候不是固定的死格式,这个类名也不一定非得Result,想叫什么叫什么,想加几个字段都行,只要够用就好,同时不同的项目组这个东西的格式也完全不一样,所以要根据项目组的约定来进行。

实现

实现初始化(同上方SSM整合到接口测试一模一样)

Result是属于表现层用的,数据展示相关的,所以放在controller包里(放其它地方也行)
如果使用new对象 用set方法传递数据就太麻烦了,所以这里使用构造方法传递。可以使用带消息或者不带消息的,视情况而定

code值是前后端约定好的,每次直接写的话容易出问题,直接定出来,创建一个新的类叫Code专门用来定义code值。(枚举或许更好)
暂时这么多,少了再加

使用



异常处理

异常处理器

各个层级均有可能出现异常,异常处理代码写在哪一层——所有的异常均抛出到表现层进行处理

表现层处理异常,每个方法中单独书写try{}catch{}代码书写量巨大且意义不强,如何解决——AOP思想

SpringMVC提供快捷的处理方案——异常处理器(相当于SpringMVC提供的AOP)



使用案例

案例初始化(跟Result结果集完成后一样)

因为是将异常都抛到表现层进行处理,所以将其放到controller包里最合理

注意:注解@RestControllerAdvice要被扫描到才能用,因为放在controller包下所以不用更改,换地方要加上

手动制造异常并测试

未开启异常处理器的情况下

开启异常处理器
出现异常会被异常处理器拦截,通过异常处理器返回给前端提示信息

项目异常处理(如何向上层抛异常并分类处理)

项目异常分类



发现出异常了并且是属于业务级的,外边用户折腾的,看来你没有预计到用户能这么折腾,把它纳入到业务异常。如果不是业务异常,不去没办法完全避免,然后随时还可能的放到系统异常里。

案例:制造业务异常和系统异常并分类处理

这里一般用aop处理(在业务完成,把能想到的异常都加上)


第一步,自定义异常类——业务异常、系统异常

自定义异常类要继承RuntimeException,是因为这种运行时异常可以出现后不处理,它自动向上抛。要是不继承RuntimeException以后每个方法后都要写throw SystemException(直接继承Exception也可以)

在类里面覆盖所有的构造方法(用哪个留哪个),就是要创建的异常。因为自定义异常没办法区分是哪一种,所以定义code属性——异常编号,帮助识别(不定义也行,定义规范)。

SystemException类和BusinessException类一模一样

补充Result时写的Code值(根据项目所需补充)

第二步,模拟可能发生异常的地方,对其进行处理

这里一般用aop处理(在业务完成,把能想到的异常都加上)

第三步,使用异常处理器对拦截的异常进行反馈

ex.getCode()和ex.getMessage()是拦截到了自定义SystemException的异常,通过构造方法从被拦截处传入的(上图BookServiceImpl类的36、42行)

PostMan测试

记得把前面controller处的int i=1/0去掉,不然一直是Exception系统繁忙在处理

总结

自定义异常类->拦截异常(构造方法传入异常信息)->使用异常处理器反馈异常信息

SSM整合前后台协议联调

案例初始化——从整合开始到异常处理的全部内容

导入前端页面,并设置配置类放行静态页面,访问静态资源不经过SpringMVC

记得进行扫描

查询全部
注意分清res.data和res.data.data 前者是Result结果集后者是结果集内data既要显示的数据


保存图书(新增)
完善后端代码,原先写死了,不管成功还是失败都返回的true。修改为通过数据库影响行数判断是否成功



修改功能
scope.row获取当前行数据
点击获取当前行数据,根据id查询,设置并显示formData表单数据

原先测试异常处理,在BookServiceImpl设置了必出异常,注释掉系统异常模拟,保留业务异常模拟用户非法输入


修改数据(和新增操作基本一样)

输入修改信息

成功修改

出现异常情况

删除


注:

该内容是根据B站黑马程序员学习时所记,相关资料可在B站查询:黑马程序员2022最新SSM框架教程_Spring+SpringMVC+Maven高级+SpringBoot+MyBatisPlus企业实用开发技术


网站公告

今日签到

点亮在社区的每一天
去签到