SSM整合(注解版)

SSM 整合是指将学习的 Spring,SpringMVC,MyBatis 进行整合,来进行项目的开发。

1 项目基本的配置类

1.1 Spring 配置类

这个配置类主要是管理 Service 中的 bean,controller 层的 bean 对象是 SpringMVC 管理的

package cn.edu.njust.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.PropertySource;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;/*** -- coding: UTF-8 -- *** @author wangs* @description: Spring 的配置文件,设置Spring容器的上下文* @date 2023/11/20 11:12*/
@Configuration
@ComponentScan({"cn.edu.njust.service"})
@PropertySource("classpath:jdbc.properties")
@Import({JDBCConfig.class, MyBatisConfig.class})
@EnableTransactionManagement
public class SpringConfig {
}

说明:
(1)@Configuration:声明这是一个配置类;
(2)@ComponentScan:添加包扫描,Spring 的配置类管理 service 层的 bean 对象;
(3)@PropertySource:添加参数配置文件,其中包含数据库连接的信息等等;
(4)@Import:导入其他配置类;
(5)@EnableTransactionManagement:启动 Spring 的事务管理;

1.2 JDBC 配置类

JDBC 配置类的主要作用有两个:
1)配置数据源:即配置数据库的连接信息,配置使用到的数据库连接池,并交给 Spring 管理
2)配置事务管理器:Spring 的事务管理器需要配置,主要是配置使用的是什么事务管理;

package cn.edu.njust.config;import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;import javax.sql.DataSource;/*** -- coding: UTF-8 -- *** @author wangs* @description: JDBC 数据源配置类* @date 2023/11/20 11:13*/
public class JDBCConfig {@Value("${jdbc.driver}")private String driver;@Value("${jdbc.url}")private String url;@Value("${jdbc.username}")private String username;@Value("${jdbc.password}")private String password;@Beanpublic DataSource dataSource() {DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName(driver);dataSource.setUrl(url);dataSource.setUsername(username);dataSource.setPassword(password);return dataSource;}@Beanpublic PlatformTransactionManager transactionManager(DataSource dataSource) {DataSourceTransactionManager ts = new DataSourceTransactionManager();ts.setDataSource(dataSource);return ts;}
}

(1)dataSource():获取一个数据库连接池,这里使用到的是 Druid;
(2)transactionManager():获取 Spring 的事务管理器,这里将数据库连接池给到事务管理器;

1.3 MyBatis 配置类

主要是配置 MyBatis 的相关信息,即使就是使用一个配置类代替之前使用的 xml 文件,直接调用方法设置相关的属性,如AliasesPackage和配置 mapper 的映射文件路径等等。

package cn.edu.njust.config;import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;import javax.sql.DataSource;/*** -- coding: UTF-8 -- *** @author wangs* @description: MyBatis配置文件*                  1) 工厂bean管理*                  2) Mapper映射配置文件* @date 2023/11/20 11:20*/
public class MyBatisConfig {/*** MyBatis 是根据工厂获取数据库的连接对象的,所以应该将工厂的bean将给Spring管理* @param dataSource 在其他地方配置的数据源* @return 返回一个MyBatis的工厂bean*/@Beanpublic SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();// 设置数据源factoryBean.setDataSource(dataSource);// 设置包扫描factoryBean.setTypeAliasesPackage("cn.edu.njust.pojo");return factoryBean;}/*** 设置MyBatis的配置* 这个配置类是MyBatis提供的,专属的* @return 返回一个配置类bean对象*/@Beanpublic MapperScannerConfigurer mapperScannerConfigurer() {MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();// 设置SQL映射文件的位置mapperScannerConfigurer.setBasePackage("cn.edu.njust.dao");return mapperScannerConfigurer;}}

说明:
(1)factoryBean.setTypeAliasesPackage("cn.edu.njust.pojo"):这行代码的作用是,设置类型的别名,具体参数定位到 pojo 类的所在包,这样在 MyBatis 的 xml 文件中就可以直接使用类名来指定 resultType 了,不需要写全类名;
(2)mapperScannerConfigurer.setBasePackage("cn.edu.njust.dao"):这个可以指定 xml 文件的路径,主要关联对象的 xml 文件和 MyBatis 的接口类;

1.4 SpringMVC 的配置

配置 SpringMVC 的 bean 管理,主要是控制层,以及开启一些 SpringMVC 的增强功能

package cn.edu.njust.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;/*** -- coding: UTF-8 -- *** @author wangs* @date 2023/11/20 11:32* @description: SpringMVC的上下文配置文件*      1) @ComponentScan({"cn.edu.njust.config"}): 这个包的主要作用是扫描 SpringMvcSupport 类*/@Configuration
@ComponentScan({"cn.edu.njust.controller", "cn.edu.njust.config"})
@EnableWebMvc
public class SpringMvcConfig {
}

说明:
(1)@Configuration:声明这是配置类;
(2)@ComponentScan:添加包扫描,SpringMVC 的配置类一般管理的是 controller 类的 bean 对象;
(3)@EnableWebMvc:启用 MVC 的增强功能,如将 POJO 类自动转化为 JSON 数据格式;

1.5 Web 项目入口配置

在传统的项目中,只用 Servlet 来处理请求响应,其实 SpringMVC 底层使用的也是 Servlet,但是不需要像 Servlet 那样麻烦,只需要配置相关的路径映射等等,再配合相关的注解,就可以达到效果。

package cn.edu.njust.config;import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;import javax.servlet.Filter;/*** -- coding: UTF-8 -- *** @author wangs* @description: web项目入口配置类*                  1) 配置路径信息规则*                  2) 加载Spring与SpringMVC的配置文件* @date 2023/11/20 11:34*/
public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer {/*** 加载Spring配置的方法* @return Spring配置文件的Class对象*/@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[] {SpringConfig.class};}/*** 加载SpringMVC的配置文件* @return SpringMVC配置文件的Class对象*/@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}/*** 拦截、管理的路径* @return "/" 表示拦截所有路径*/@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}/*** 设置post请求中文乱码过滤器* @return 设置了编码格式的过滤器*/@Overrideprotected Filter[] getServletFilters() {CharacterEncodingFilter filter = new CharacterEncodingFilter();filter.setEncoding("utf-8");return new Filter[]{filter};}
}

说明:
(1)getRootConfigClasses():返回 Spring 配置类的 class 文件;用于获取 Spring 的上下文信息;
(2)getServletConfigClasses:返回 SpringMvc 配置类的 class 文件,用于获取 SpringMvc 的上下文信息;
(3)getServletMappings():返回拦截路径的集合;
(4)getServletFilters():返回拦截器集合;

1.6 静态资源配置释放

配置静态资源的访问路径,直接继承WebMvcConfigurationSupport只是其中一种方法;

package cn.edu.njust.config;import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {@Overrideprotected void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");registry.addResourceHandler("/css/**").addResourceLocations("/css/");registry.addResourceHandler("/js/**").addResourceLocations("/js/");registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");}
}

2 统一响应结果封装

前端会有很多类型的请求,而后端响应这些请求,根据请求去进行业务处理得到的结果很可能是不一样的,但是前端希望得到一个看上去是规范的响应结果,以便根据这种结果来正确的进行响应和封装。

2.1 个人喜欢封装(简单版)

package cn.edu.njust.pojo;/*** -- coding: UTF-8 -- *** @author wangs* @description: 统一响应结果* @date 2023/11/20 15:40*/
public class Result {private Integer code;private String msg;private Object data;public Result() {}public Result(Integer code, String msg, Object data) {this.code = code;this.msg = msg;this.data = data;}public static Result success() {return new Result(1, "success", null);}public static Result success(Object data) {return new Result(1, "success", data);}public static Result error(String msg) {return new Result(0, msg, null);}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}
}

2.2 正式版(黑马资料)

public class Result {//描述统一格式中的数据private Object data;//描述统一格式中的编码,用于区分操作,可以简化配置0或1表示成功失败private Integer code;//描述统一格式中的消息,可选属性private String msg;public Result() {}//构造方法是方便对象的创建public Result(Integer code,Object data) {this.data = data;this.code = code;}//构造方法是方便对象的创建public Result(Integer code, Object data, String msg) {this.data = data;this.code = code;this.msg = msg;}//setter...getter...省略
}
//状态码
public class Code {public static final Integer SAVE_OK = 20011;public static final Integer DELETE_OK = 20021;public static final Integer UPDATE_OK = 20031;public static final Integer GET_OK = 20041;public static final Integer SAVE_ERR = 20010;public static final Integer DELETE_ERR = 20020;public static final Integer UPDATE_ERR = 20030;public static final Integer GET_ERR = 20040;
}

3 统一异常处理

虽然我们封装了统一的响应结果,但是这是程序正常执行的结果,如果程序执行出错,抛出异常,则浏览器页面响应的就是异常,不会给我们这种统一的结果,当然,前端也是期望得到统一的处理信息,便于解析。

package cn.edu.njust.controller;import cn.edu.njust.pojo.Result;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;//@RestControllerAdvice用于标识当前类为REST风格对应的异常处理器
@RestControllerAdvice
public class ProjectExceptionAdvice {//除了自定义的异常处理器,保留对Exception类型的异常处理,用于处理非预期的异常@ExceptionHandler(Exception.class)public Result doException(Exception ex) {System.out.println("嘿嘿,异常你哪里跑!");return Result.error("程序异常");}
}

说明:
(1)@RestControllerAdvice:用于标识当前类为REST风格对应的异常处理器;
(2)@ExceptionHandler(Exception.class):说明捕获那种类型的异常,这里 Exception.class 需要捕获全部异常类型;
(3)return:返回统一数据响应格式,这样就算程序报错,前端也能正常的收到提示信息,而不是得到一个报错的代码页面;

4 静态资源释放

静态资源的的管理有很多中方式,我自己了解到的有三种:重写 WebMvcConfigurer 接口、继承 WebMvcConfigurerAdapter,继承 WebMvcConfigurationSupport;

4.1 重写 WebMvcConfigurer 接口

这是 SpringBoot 中文网中的做法,在 SpringMvc 中有可以这样做
Spring Boot 中的静态资源配置

4.2 继承 WebMvcConfigurerAdapter

这是一个比较老的做法,网上有很多都是继承这个类来重写相关方法实现的,但是,这个类现在已经过时了
image.png

具体的就是继承这个类,然后重写其中的方法,和继承 WebMvcConfigurationSupport 类似,不再演示代码,具体参考 4.3;

4.3 继承 WebMvcConfigurationSupport

4.3.1 配置演示

(1)需要导入依赖

<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.18</version>
</dependency>

(2)配置类
image.png

package cn.edu.njust.config;import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {@Overrideprotected void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");registry.addResourceHandler("/css/**").addResourceLocations("/css/");registry.addResourceHandler("/js/**").addResourceLocations("/js/");registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");}
}

3)将该配置类引入 SpringMVC 的配置类中

@Configuration
@ComponentScan({"cn.edu.njust.controller", "cn.edu.njust.config"})
@EnableWebMvc
public class SpringMvcConfig {
}

这里是使用 @ComponentScan 这个注解来扫描配置类所在的包 cn.edu.njust.config;

4.3.2 一些有趣的知识

WebMvcConfigurationSupport 类其实是一个“高级”的类,因为在使用 WebMvcConfigurerAdapter 的时候其实需要使用到这个类,在使用 WebMvcConfigurerAdapter 类时,我们需要声明@EnableWebMvc,查看这个注解的代码,会有如下发现
1)它使用到了 DelegatingWebMvcConfiguration 类
image.png
2)DelegatingWebMvcConfiguration 其实继承了 WebMvcConfigurationSupport
image.png

3)我们自己写的配置类,Spring 是如何知道获取我们的配置的呢?
在 DelegatingWebMvcConfiguration 有如下代码,Spring 会获取所有的配置类,并添加到配置中;
image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/197262.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

案例研究|作为一家BI厂商,飞致云是如何人人使用DataEase的?

杭州飞致云信息科技有限公司&#xff08;以下简称为飞致云&#xff09;长期秉持“软件用起来才有价值&#xff0c;才有改进的机会”的核心价值观&#xff0c;以“为数字经济时代创造好软件”为使命&#xff0c;致力于成为中国数字化团队首选的通用工具软件提供商。在软件产品不…

编码器-解码器(seq-seq)

1. 背景 encoder-decoder和seq-seq模型可以解决输入与输出都是不定长序列的问题。它们都用到了两个循环NN&#xff0c;分别叫做编码器(用来分析输入序列)与解码器(用来生成输出序列)。 2. 编码器 把一个不定长的输入序列变换成一个定长的背景变量c&#xff0c;并在其中编码输入…

大文件分片上传、分片进度以及整体进度、断点续传【前端原生、后端 Koa、Node 原生】(一)

分片&#xff08;500MB&#xff09;进度效果展示 效果展示&#xff0c;一个分片是 500MB 的 分片&#xff08;10MB&#xff09;进度效果展示 大文件分片上传效果展示 前端 思路 前端的思路&#xff1a;将大文件切分成多个小文件&#xff0c;然后并发给后端。 页面构建 先在页…

数据结构学习笔记——广义表

目录 一、广义表的定义二、广义表的表头和表尾三、广义表的深度和长度四、广义表与二叉树&#xff08;一&#xff09;广义表表示二叉树&#xff08;二&#xff09;广义表表示二叉树的代码实现 一、广义表的定义 广义表是线性表的进一步推广&#xff0c;是由n&#xff08;n≥0&…

C++11(上)

统一的列表初始化 首先要说明&#xff1a; 这个列表初始化和类和对象那里的初始化列表不是一个概念. {} 初始化 在C98中, 标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定. 比如: C语言里面其实就是这样支持的, 所以可以认为C支持这样就是因为要兼容C. 在…

IDEA中也能用postman了?

Postman是大家最常用的API调试工具&#xff0c;那么有没有一种方法可以不用手动写入接口到Postman&#xff0c;即可进行接口调试操作&#xff1f;今天给大家推荐一款IDEA插件&#xff1a;Apipost Helper&#xff0c;写完代码就可以调试接口并一键生成接口文档&#xff01;而且还…

.Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)

机缘 不知不觉,.NET8都已经面世,而我们一直还停留在.netframework4.5开发阶段,最近准备抽空研究一下.Net6,一是为了提高技术积累,一方面想着通过这次的学习,看有没有可能将老的FX版本替换到.Net6开发上,经过查找官方资料,对.Net6支持的系统版本做一个分享,方便大家后期…

数据库事务

Innodb引擎支持以事务的方式执行SQL&#xff0c;事务包含ACID四个特性&#xff0c;分别是原子性、一致性、隔离性和持久化。 原子性 原子性是指开启事务后&#xff0c;使用commit提交事务或rollback回滚事务&#xff0c;使事务内的多条修改语句同时成功或失败。 原子性是通过…

图中点的层次(图的BFS)

给定一个 n 个点 m 条边的有向图&#xff0c;图中可能存在重边和自环。 所有边的长度都是 1&#xff0c;点的编号为 1∼n。 请你求出 1 号点到 n 号点的最短距离&#xff0c;如果从 1 号点无法走到 n 号点&#xff0c;输出 −1。 输入格式 第一行包含两个整数 n 和 m。 接…

SQL Sever 基础知识 - 限制行数

SQL Sever 基础知识 - 三、限制行数 三、限制行数第1节 OFFSET FETCH - 限制查询返回的行数1.1 OFFSET 和 FETCH 子句1.2 SQL Server OFFSET 和 FETCH 示例 第2节 SELECT TOP - 限制查询结果集中返回的行数或行的百分比2.1 SELECT TOP 子句2.2 PERCENT2.3 WITH TIES2.4 SELECT …

React全站框架Next.js使用入门

Next.js是一个基于React的服务器端渲染框架&#xff0c;它可以帮助我们快速构建React应用程序&#xff0c;并具有以下优势&#xff1a; 1. 支持服务器端渲染&#xff0c;提高页面渲染速度和SEO&#xff1b; 2. 自带webpack开发环境&#xff0c;实现即插即用的特性&#xff1b;…

ROS报错:RLException:Invalid roslaunch XML Syntax: mismatched tag:

运行roslaunch文件提示&#xff1a; RLException:Invalid roslaunch XML Syntax: mismatched tag: line 45&#xff0c; column 2 The traceback for the exception was written to the log file. j 解决办法&#xff1a; line45 行多了标签&#xff1a;</node> 另外…

FL Studio 21.2.1.3859中文破解版及FL Studio怎么录制

FL Studio 21.2.1.3859中文破解版是一个数字音频工作站 (DAW)。该软件借助各种编辑工具、插件和效果&#xff0c;让您可以录制、混音和掌握高度复杂的音乐作品。FL Studio 21还允许您注册和编辑 MIDI 文件&#xff0c;您可以在众多可用乐器之一上演奏这些文件。FL Studio 拥有 …

STM32USART+DMA实现不定长数据接收/发送

STM32USARTDMA实现不定长数据接收 CubeMX配置代码分享实践结果 这一期的内容是一篇代码分享&#xff0c;CubeMX配置介绍&#xff0c;关于基础的内容可以往期内容 夜深人静学32系列11——串口通信夜深人静学32系列18——DMAADC单/多通道采集STM32串口重定向/实现不定长数据接收 …

线程池、及Springboot线程池实践

摘要 本文介绍了线程池基本概念、线程及线程池状态、java中线程池提交task后执行流程、Executors线程池工具类、最后介绍在springboot框架下使用线程池和定时线程池&#xff0c;以及task取消 线程池基本 背景 线程池 线程池是一种多线程处理形式&#xff0c;处理过程中将任务…

人工智能学习7(决策树算法)

编译工具&#xff1a;PyCharm 文章目录 编译工具&#xff1a;PyCharm 决策树算法信息熵信息熵例题计算&#xff1a; 信息增益&#xff08;决策树划分依据之一ID3&#xff09;信息增益例题计算&#xff1a; 信息增益率(决策树划分依据之一C4.5)基尼值和基尼指数(决策树划分依据之…

每日3道PWN(第一天)

环境准备 我现在用的是kali 现阶段工具&#xff1a;checkesc、IDA、比较完善的python环境 下载工具的话&#xff0c;我这里不提供了 buuctf——test_your_nc1 参考wp&#xff1a; BUUCTF PWN-----第1题:test_your_nc_buuctf test_your_nc-CSDN博客 查看的资料&#xff1a;…

合并两个有序链表[简单]

优质博文&#xff1a;IT-BLOG-CN 一、题目 将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 输入&#…

软著项目推荐 深度学习的口罩佩戴检测 - opencv 卷积神经网络 机器视觉 深度学习

文章目录 0 简介1 课题背景&#x1f6a9; 2 口罩佩戴算法实现2.1 YOLO 模型概览2.2 YOLOv32.3 YOLO 口罩佩戴检测实现数据集 2.4 实现代码2.5 检测效果 3 口罩佩戴检测算法评价指标3.1 准确率&#xff08;Accuracy&#xff09;3.2 精确率(Precision)和召回率(Recall)3.3 平均精…

使用coco数据集进行语义分割:数据预处理与损失函数

如何coco数据集进行目标检测的介绍已经有很多了&#xff0c;但是关于语义分割几乎没有。本文旨在说明如何处理 stuff_train2017.json stuff_val2017.json panoptic_train2017.json panoptic_val2017.json&#xff0c;将上面那些json中的dict转化为图片的label mask&am…