SpringBoot入门到精通-SpringBoot集成WEB开发(四)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
RDS MySQL DuckDB 分析主实例,集群系列 8核16GB
简介: SpringBoot入门到精通-SpringBoot集成WEB开发

前言

上一篇文章我们讲的是SpringBoot的基本用法,本篇文章我们来学习一下SpringBoot如何整合web,以及Mybatis以及事务。

五.SpringBoot集成SSM

1.WEB集成

1.1.集成Thymeleaf

现在的项目基本上都采用前后端分离架构,也就是项目后台不需要处理页面,但是在一些小型的项目中还是把页面耦合在后台项目中,这就需要集成视图技术(模板技术)。常见的模板技术有 thymeleaf ;freemaker ;Velotity ; jsp 。

jsp相信大家都使用过,因为性能问题现在基本被淘汰,SpringBoot官方推荐使用thymeleaf 。

第一步:集成thymeleaf 需要导入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

第二步:创建thymeleaf模板文件 , 在resources/templates中创建 index.html 文件,内容如下

<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>成功!</h1>

    <!--使用语法th:text 将div里面的文本内容设置为 -->
    <div th:text="${msg}">这是显示欢迎信息</div>
</body>
</html>

文件中需要一个 msg 内容来填充, 注意:它不是一个静态资源html,而是thymeleaf的模板文件

第三步:编写实controller

@Controller
public class HelloController {
   
   

    @RequestMapping("/index")
    public String index(Model model){
   
   
        model.addAttribute("msg","惊不惊喜,刺不刺激");
        //返回视图名
        return "index";
    }
}

第四步:访问http://localhost:9999/index,效果如下

如果你需要对thymeleaf有些个性化 配置,可以在application.yml中配置如下

spring:
  thymeleaf:
    encoding: utf-8
    prefix: classpath:/templates/  #默认去哪个路径找页面
    cache: true #是否开启缓存
    enabled: true #是否使用 thymeleaf 的开关
    suffix: .html #页面的后缀,可以修改

到这里thymeleaf就集成成功了,剩下的就是thymeleaf的语法了,如果您公司有用到thymeleaf那你可以专门早点资料去学习一下,这里不是重点,不做过多描述。

1.2.webjars

WebJars能使Maven的依赖管理支持OSS的JavaScript库/CSS库,比如jQuery、Bootstrap等;WebJars是将Web前端Javascript和CSS等资源打包成Java的Jar包,这样在Java Web开发中我们可以借助Maven这些依赖库的管理,保证这些Web资源版本唯一性。可以在( http://www.webjars.org/)网站查找你需要的依赖。

在这里插入图片描述

这里以jQuery为例,第一步:导入jquery的jar

<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>jquery</artifactId>
    <version>3.4.1</version>
</dependency>

第二步:在页面导入jquery的js即可使用

<script src="/webjars/jquery/3.4.1/jquery.js"></script>

1.3.注册拦截器

我们可以回顾一下在SpringMVC XML中是如何注册拦截器的,首先需要定义拦截器类,实现HandlerInterceptor或者继承HandlerInterceptorAdapter也行。然后需要在xml中注册拦截器

<!-- 配置拦截器:-->
<mvc:interceptors>
    <mvc:interceptor>
        <!-- 拦截所有请求,排除拦截 /login 请求 -->
        <mvc:mapping path="/**"/>
        <mvc:exclude-mapping path="/login"/>
        <bean class="cn.xx.MyInterceptor"></bean>
    </mvc:interceptor>
</mvc:interceptors>

那么在SpringBoot中是如何注册拦截器的呢?第一个动作是一样的,都需要定义一个拦截器类,第二步注册拦截器在SpringBoot中提供了一个 WebMvcConfigurer 接口,专门用来对SpirngMVC做配置。步骤如下

第一步:创建拦截器类 和以前的创建方式一样

@Component
public class MyHandlerInterceptor extends HandlerInterceptorAdapter {
   
   

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
   
   
        System.out.println("preHandle................:"+request.getRequestURI());
        return super.preHandle(request, response, handler);
    }
}

第二步:注册拦截器, 在配置类上实现WebMvcConfigurer,复写addInterceptors,该方法提供了一个InterceptorRegistry专门用来注册拦截器,如下:

@SpringBootApplication
public class ApplicationConfig implements WebMvcConfigurer {
   
   

    @Autowired
    private MyHandlerInterceptor myHandlerInterceptor;

    /**
     * 注册拦截器
     * @param registry :拦截器的注册器
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
   
   
        //指定要拦截器的请求/** 代表所有, excludePathPatterns代表要排除的请求
        registry.addInterceptor(myHandlerInterceptor).addPathPatterns("/**").excludePathPatterns("/login");
    }

1.4.添加视图控制器

ViewControllers被叫做视图控制器,当项目中涉及大量的页面跳转,我们可以使用addViewControllers方法实现无业务逻辑跳转,从而减少控制器代码的编写。WebMvcConfigurer的addViewControllers方法可以实现将一个请求直接映射为视图,不需要编写控制器来实现,从而简化了页面跳转。

 @Override
    public void addViewControllers(ViewControllerRegistry registry) {
   
   
        //当访问 /xx 路径 ,自动跳转到 templates/xx.html 页面
        registry.addViewController("/xx").setViewName("xx.html");
    }

当访问/xx 定位到 templates/xx.html

2.Mybatis集成

SpringBoot集成Mybatis之前我们也回顾一下传统的Spring和Mybatis整合的步骤,重要是在Spring的xml配置中

<!--1 引入属性文件,在配置中占位使用 -->
<context:property-placeholder location="classpath*:db.properties" />

<!--2 配置数据源 -->
<bean id="datasource" class="org.apache.ibatis.datasource.pooled.PooledDataSource">
    <!--驱动类名 -->
    <property name="driver" value="${mysql.driver}" />
    <!-- url -->
    <property name="url" value="${mysql.url}" />
    <!-- 用户名 -->
    <property name="username" value="${mysql.username}" />
    <!-- 密码 -->
    <property name="password" value="${mysql.password}" />
</bean>

<!--3 会话工厂bean sqlSessionFactoryBean -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <!-- 数据源 -->
    <property name="dataSource" ref="datasource"></property>
    <!-- 别名 -->
    <property name="typeAliasesPackage" value="cn.whale.domian"></property>
    <!-- sql映射文件路径 -->
    <property name="mapperLocations" value="classpath*:mapper/*Mapper.xml"></property>
    <!--        <property name="configLocation" value="classpath*:mybatis-config.xml"></property>-->
    <!--        <property name="plugins"></property>-->
</bean>

<!--4 自动扫描对象关系映射 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <!-- 指定要自动扫描接口的基础包,实现接口 -->
    <property name="basePackage" value="cn.whale.mapper"></property>
</bean>

其实是非常麻烦的,那么在SpringBoot中又是如何配置的呢?

2.1.集成DataSource

集成Mybatis肯定是需要先集成DataSource,SpringBoot已经提供了自动装配DataSource功能。我们只需要在ymal中做简单配置即可。

第一步:导入依赖 , 我这里把连接池,驱动,mybatis全导入进来

<!-- 阿里巴巴的连接池-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.20</version>
</dependency>

<!-- mysql 数据库驱动. -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- mybatis的依赖 -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.1.1</version>
</dependency>

第二步:配置DataSource

spring:
  datasource:
    username: root
    password: admin
    url: jdbc:mysql:///test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    driver-class-name: com.mysql.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource #指定使用druid的连接池

这里我指定了type指向了DruidDataSource连接池,如果不指定,默认会使用HikariDataSource作为连接池

2.2.集成MyBatis

集成mybatis就需要创建domain , mapper等组件了,还要准备数据库.

第一步:User实体类如下

//lombok,自动生成get,set
@Data
public class User {
   
   
    private Long id;
    private String username;
}

第二步:mapper/UserMapper接口如下

public interface UserMapper {
   
   
    User selectAll();
}

第三步:resources/mapper/UserMapper.xml如下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.whale.mapper.UserMapper">

    <select id="selectAll" resultType="cn.whale.domain.User">
        SELECT  id,username FROM t_user
    </select>
</mapper>

第四步:数据库如下

在这里插入图片描述

第五步:配置mybatis , application.yml如下

mybatis:
  type-aliases-package: "cn.whale.domain" #别名
  mapper-locations: classpath:mapper/UserMapper.xml #扫描SQL映射文件
  #config-location: mybatis-config.xml #mybatis配置文件

第六步:配置Mapper接口扫描

@SpringBootApplication
//mapper映射器自动扫描
@MapperScan("cn.whale.mapper")
public class ApplicationConfig {
   
   
   ...
}

@MapperScan的作用等同于传统Spring配置Mybatis时配置的 MapperScannerConfigurer ,可以实现mapper映射器的自动扫描。

2.3.集成Service

第七步:编写service

public interface IUserService {
   
   
    List<User> selectAll();
}

@Service
public class UserServiceImpl implements IUserService {
   
   

    @Autowired
    private UserMapper userMapper ;

    @Override
    public List<User> selectAll() {
   
   
        return userMapper.selectAll();
    }
}

2.4.集成WEB

第八步:编写Controller

@RestController
public class UserController {
   
   

    @Autowired
    private IUserService userService;

    @RequestMapping("/users")
    public List<User> userList(){
   
   
        return userService.selectAll();
    }
}

最后结构如下
在这里插入图片描述
第九步:启动测试,效果如下
在这里插入图片描述

3.集成事务

在Spring中我们有两种配置事务的方式,一是在XML中使用<aop>的方式统一配置,这种方式比较麻烦新项目一般不用,二是使用注解@Transcationl注解的方式,这种方式需要开启<tx:annotation-driven 注解支持,当然两种方式都需要配置DataSourceTransactionManager 的支持,而在SpringBoot中使用简单的两个注解就可以完成啦。

3.1.注解方式事务支持

第一步:开启事务,在配置类贴上@EnableTransactionManagement ,该注解功能和<tx:annotation-driven一样是开启事务支持,只要导入了Mybatis的依赖默认情况下SpringBoot会帮我们自动创建DataSourceTransactionManager。

@SpringBootApplication
@MapperScan("cn.whale.mapper")
//开启事务支持
@EnableTransactionManagement
public class ApplicationConfig{
   
   
...}

PS:其实在SpringBoot环境中,不贴该注解也是可以的,默认就开启了的

第二步:给service添加事务,只需要在需要有事务的类上,或者方法上标记@Transactional即可

@Transactional
@Service
public class UserServiceImpl{
   
    ... }

3.2.使用xml方式配置(了解)

第一步:这种方式不推荐使用,做一个了解就可以了,首选需要导入一个依赖

 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-aop</artifactId>
 </dependency>

第二步:使用一个xml配置事务:applicationContext.xml

<!-- 配置事物管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
<!-- 扫描哪些类需要事务支持 -->
    <aop:config>
        <aop:pointcut expression="execution(* cn.itsource.web.controller.service..*.*(..))" id="coreServicePointcut"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="coreServicePointcut"/>
    </aop:config>

    <!-- aop应用事务管理 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="select*" read-only="true"/>
            <tx:method name="*" propagation="REQUIRED" />
        </tx:attributes>
    </tx:advice>

第三步:在配置类导入xml配置文件,让其生效

@SpringBootApplication
@MapperScan("cn.whale.mapper")
@ImportResource("classpath:applicationContext.xml")
public class ApplicationConfig{
   
   
    ...
}

4.PageHelper的集成

PageHelper是一个mybatis的分页插件,可以帮我们自动生成查询count的sql和分页limit。可以简化我们的代码,官网文档

4.1.集成pagehelper

导入pagehelper基础依赖

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.2.3</version>
</dependency>

4.2.分页查询

<select id="selectPage" resultType="cn.whale.User">
    select id,username from t_user
</select>

注意:用了pagehelper之后 ,查询总条数的sql不用写 , limit 不用写

分页查询,把查询的结果强转成Page对象,它是PageHelper提供的一个分页对象,其中包含总条数,列表,其本身继承了ArrayList.

@Override
 public Page<User> selectAll() {
   
   
     //设置分页条件,1是查询第几页,5是查询条数,通常通过参数对象传入这个2个值
     PageHelper.startPage(1,5 );
     return (Page<User>) userMapper.selectAll();
 }
  • PageHelper.startPage(1,5 ):设置当前页和每页条数

  • Page :是pagehelper自己封装的页面对象,如同我们以前的PageList ,里面有总条数,列表,总页数等等

4.3.处理分页结果

把Page对象转成我们自己的结果对象 , 编写PageResult

@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageResult {
   
   
    private Long total;
    private List<?> list;
}

编写controller逻辑

@RestController
public class UserController {
   
   

    @Autowired
    private IUserService userService;

    @RequestMapping("/users")
    public PageResult userList(){
   
   
        Page<User> page = userService.selectAll();
        return new PageResult(page.getTotal(),page.getResult());
    }
}

测试效果
在这里插入图片描述

4.4.PageHelper的配置

上面的步骤已经就可以完成PageHelper的使用了,当然也可以对PageHelper做一些个性化配置,具体 见文档 ,比如:

pagehelper:
  helperDialect: mysql
  reasonable: true
  supportMethodsArguments: true
  params: count=countSql
  • helperDialect:分页插件会自动检测当前的数据库链接,自动选择合适的分页方式
  • reasonable:分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。
  • supportMethodsArguments :支持通过 Mapper 接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。
  • params :为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值, 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero

5.使用外置Tomcat运行

在企业中,有些开发者认为SpringBoot内置的Tomcat并不是最优的选择,需要有一些自定义的配置,这个时候就需要把SpringBoot打成war包然后部署到外置的Tomcat中。

产生一个可部署war包的第一步是提供一个 SpringBootServletInitializer 子 类,并覆盖它的 configure 方法,这充分利用了Spring框架对Servlet 3.0的支 持,并允许你在应用通过servlet容器启动时配置它。

5.1.编写SpringBootServletInitializer实现

第一步:启动类实现SpringBootServletInitializer接口

//SpringBootServletInitializer 实现了 WebApplicationInitializer,用来使用传统的 WAR 部署运行SpringApplication 。
// 它将Servlet 、 Filter和ServletContextInitializer bean 从应用程序上下文绑定到服务器

@SpringBootApplication
@MapperScan("cn.whale.mapper")
public class ApplicationConfig extends SpringBootServletInitializer{
   
   

    public static void main(String[] args) {
   
   
        SpringApplication.run(ApplicationConfig.class,args);
    }
    //把当前配置类和
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
   
   
        return application.sources(ApplicationConfig.class);
    }
}

5.2.修改依赖

第三步:修改依赖,排除掉SpringBoot内置的tomcat,额外提供一个tomcat,只不过scope需要指定为 provided ,因为我们有外置的Tomcat。

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>

5.3.部署Tomcat

第四步:IDEA增加Tomcat, 点击 Edit Configurations
在这里插入图片描述
增加一个Tomcat Server
在这里插入图片描述
发布项目
在这里插入图片描述
配置Tomcat
在这里插入图片描述
注意:SpringBoot 2x以上请使用Tomcat 8 以上,否则回出错

5.4.启动Tomcat

点击启动按钮启动项目
在这里插入图片描述
浏览器访问:http://localhost:8080/users ,效果如下
在这里插入图片描述

文章就到这把,喜欢请给个好评,喜欢请给个好评,喜欢请给个好评

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
3月前
|
XML 测试技术 API
利用C#开发ONVIF客户端和集成RTSP播放功能
利用C#开发ONVIF客户端和集成RTSP播放功能
1462 123
|
5月前
|
缓存 监控 安全
电商API集成入门:从零开始搭建高效接口
在数字化电商时代,API集成成为企业提升效率、实现系统互联的关键。本文从零开始,逐步讲解如何搭建高效、可靠的电商API接口,适合初学者学习。内容涵盖API基础、认证安全、请求处理、性能优化等核心步骤,并提供Python代码示例与数学公式辅助理解。通过实践,读者可掌握构建优质电商API的技巧,提升用户体验与系统性能。
254 0
|
5月前
|
数据采集 运维 DataWorks
DataWorks 千万级任务调度与全链路集成开发治理赋能智能驾驶技术突破
智能驾驶数据预处理面临数据孤岛、任务爆炸与开发运维一体化三大挑战。DataWorks提供一站式的解决方案,支持千万级任务调度、多源数据集成及全链路数据开发,助力智能驾驶模型数据处理与模型训练高效落地。
|
2月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
398 3
|
8月前
|
监控 Java API
1K star!这个开源项目让短信集成简单到离谱,开发效率直接翻倍!
SMS4J 是一款由国内技术团队打造的短信聚合框架,专为解决多短信服务商接入难题而生。它就像短信界的"瑞士军刀",目前已整合21家主流短信服务商,从阿里云、腾讯云到中国移动云MAS,开发者只需通过简单配置即可实现多平台无缝切换。
491 4
|
10月前
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
647 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
6月前
|
监控 安全 Java
Java 开发中基于 Spring Boot 3.2 框架集成 MQTT 5.0 协议实现消息推送与订阅功能的技术方案解析
本文介绍基于Spring Boot 3.2集成MQTT 5.0的消息推送与订阅技术方案,涵盖核心技术栈选型(Spring Boot、Eclipse Paho、HiveMQ)、项目搭建与配置、消息发布与订阅服务实现,以及在智能家居控制系统中的应用实例。同时,详细探讨了安全增强(TLS/SSL)、性能优化(异步处理与背压控制)、测试监控及生产环境部署方案,为构建高可用、高性能的消息通信系统提供全面指导。附资源下载链接:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)。
1052 0
|
8月前
|
人工智能 程序员 测试技术
通义灵码与魔搭 Notebook 深度集成:在线编码开箱即用,开发效率倍增
通义灵码 2.0 AI 程序员 2025 年 1 月正式上线,目前已经服务百万开发者,成为国内开发者最受欢迎的智能编码助手。
|
8月前
|
人工智能 IDE 测试技术
通义灵码与魔搭Notebook深度集成:在线编码开箱即用,开发效率倍增
通义灵码2.0 AI程序员于2025年1月上线,目前已支持超过百万开发者。该工具的智能编程能力现已与阿里云AI模型开发平台魔搭ModelScope实现技术集成
332 0
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
743 7
Spring Boot 入门:简化 Java Web 开发的强大工具

热门文章

最新文章