SSM整合步骤多、配置繁琐
项目进行服务器部署步骤繁琐
习惯优于配置/约定大于配置
的理念快速的搭建项目的开发环境,我们无需或者进行很少的相关spring配置就能够快速的将项目运行起来体验:基于SpringBoot整合SpringMVC
SpringBoot应用需要依赖远程服务器进行创建
远程服务器:
- Spring官方:https://start.spring.io
- ali:https://start.aliyun.com
如果基于IDEA创建无法下载,可以基于网页版进行创建
SpringBoot帮助我们完成通用性配置,但是像数据库连接地址、账号、密码等还是需要手动完成配置
修改mysql驱动的版本(选择性)
在SpringBoot主配置文件application.properties
文件中配置数据源及路径
# 配置数据源 (key必须按照SpringBoot的要求) spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/db_2010_mybatis?characterEncoding=utf-8 spring.datasource.username=root spring.datasource.password=admin123 # 配置映射文件路径及实体类的包名 mybatis.mapper-locations=classpath:mappers/*Mapper.xml mybatis.type-aliases-package=com.qfedu.springboot.demo.entity
在SpringBoot启动类通过@MapperScan
注解指定DAO接口的包名
@SpringBootApplication @MapperScan("com.qfedu.springboot.demo.dao") public class SpringbootDemo1Application { public static void main(String[] args) { SpringApplication.run(SpringbootDemo1Application.class, args); } }
SpringBoot应用自带Servlet容器—Tomcat,因此无需进行额外的服务器配置,运行启动类即可启动一个SpringBoot应用
用户的注册功能
一个starter就是一个开发场景的支持( 依赖 + 配置)
SpringBoot为我们提供了简化企业级开发绝大多数场景的支持(提供了多个starter),我们在进行项目开发的过程中只需引入对应的starter(创建SpringBoot应用时可选择),相关的依赖和配置就会被内置到项目中(消除人工配置)。
一个starter依赖表示的不是一个依赖,而是某种开发环境所需的一组依赖
spring-boot-starter-web
mybatis-spring-boot-starter
一个starter不仅包含所需依赖,还包含了其所需的对应的配置
MyBatis Framework --- mybatis-spring-boot-starter
依赖:
配置:
引入redis开发场景
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
@Service public class UserServiceImpl implements UserService { @Resource private UserDAO userDAO; @Resource private StringRedisTemplate stringRedisTemplate; }
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- SpringBoot应用中的pom 继承了spring-boot-starter-parent.pom --> <!-- spring-boot-starter-parent.pom又继承了spring-boot-dependencies.pom--> <!-- 在spring-boot-dependencies.pom已经对主流的框架的版本进行了声明 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.4</version> <relativePath/> </parent> </project>
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <mainClass>com.qfedu.springboot.demo.SpringbootDemo1Application</mainClass> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build>
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.qfedu</groupId> <artifactId>springboot-demo2</artifactId> <version>1.0.0</version> <name>springboot-demo2</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <!--SpringBoot引用的pom没有继承spring-boot-starter-parent.pom,因此版本需要在当前pom中进行定义 --> <spring-boot.version>2.3.7.RELEASE</spring-boot.version> </properties> <build> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.3.7.RELEASE</version> <configuration> <mainClass>com.qfedu.springboot.demo2.SpringbootDemo2Application</mainClass> </configuration> <executions> <execution> <id>repackage</id> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
如果我们需要在SpringBoot应用中整合一种新的开发场景,只需在pom.xml引入对应的starter即可
一个starter不仅包含依赖,还包含相应的配置,starter中包含的配置都是通过Java类实现的——Java配置方式
随着Spring版本的迭代,配置方式也在发生变化
<!--applicationContext.xml--> <bean id="stu" class="com.qfedu.beans.Student"></bean> <bean id="date" class="java.util.Date"></bean>
@Component public class Student{ }
@Configuration public class SpringConfig{ @Bean public Date getDate(){ return new Date(); } }
SpringBoot针对不同的开发场景提供默认的属性配置,如果默认的配置不能满足开发的需要,我们需要对属性配置进行修改
SpringBoot应用提供了一个全局配置文件application.properties
用于进行自定义配置
全局配置文件支持2中语法配置:
# 配置数据源 (key必须按照SpringBoot的要求) spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/db_2010_mybatis?characterEncoding=utf-8 spring.datasource.username=root spring.datasource.password=admin123 # 配置映射文件路径及实体类的包名 mybatis.mapper-locations=classpath:mappers/*Mapper.xml mybatis.type-aliases-package=com.qfedu.springboot.demo.entity
spring: datasource: url: jdbc:mysql://localhost:3306/db_2010_mybatis?characterEncoding=utf-8 driver-class-name: com.mysql.jdbc.Driver username: root password: admin123 mybatis: mapper-locations: classpath:mappers/*Mapper.xml type-aliases-package: com.qfedu.springboot.demo.entity
server: port: 9999 servlet: context-path: /demo1
在SpringBoot应用启动的时候是有一个默认启动图案的
这个默认图案支持自定义配置
佛祖保佑
//////////////////////////////////////////////////////////////////// // _ooOoo_ // // o8888888o // // 88" . "88 // // (| ^_^ |) // // O\ = /O // // ____/`---'\____ // // .' \\| |// `. // // / \\||| : |||// \ // // / _||||| -:- |||||- \ // // | | \\\ - /// | | // // | \_| ''\---/'' | | // // \ .-\__ `-` ___/-. / // // ___`. .' /--.--\ `. . ___ // // ."" '< `.___\_<|>_/___.' >'"". // // | | : `- \`.;`\ _ /`;.`/ - ` : | | // // \ \ `-. \_ __\ /__ _/ .-` / / // // ========`-.____`-.___\_____/___.-`____.-'======== // // `=---=' // // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // // 佛祖保佑 永不宕机 永无BUG // ////////////////////////////////////////////////////////////////////
SpringBoot应用默认支持的动态网页技术是Thymeleaf,并不支持JSP;因此在SpringBoot应用想要使用JSP需要通过手动整合来实现
<dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <version>9.0.45</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
修改pom文件打包方式为war
在main中创建webapp目录
在webapp创建.jsp页面
将JSP文件存放到WEB-INF目录
在application.yml文件配置SpringMVC视图解析方式:
spring: mvc: view: prefix: /WEB-INF/ suffix: .jsp
创建PageController
@Controller public class PageController { @RequestMapping("/index.html") public String index() { return "index"; } }
创建项目时添加依赖
修改mysql驱动的版本(可选)
<!--pom.xml--> <properties> <java.version>1.8</java.version> <mysql.version>5.1.47</mysql.version> </properties>
将默认创建的application.properties后缀名修改为yml
(根据习惯可选)
完成MyBatis的自定义配置
spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/db_2010_mybatis?characterEncoding=utf-8 username: root password: admin123 mybatis: type-aliases-package: com.qfedu.springboot.ssm.beans mapper-locations: classpath:mappers/*Mapper.xml
@MapperScan
@SpringBootApplication @MapperScan("com.qfedu.springboot.ssm.dao") public class SpringbootSsmApplication { public static void main(String[] args) { SpringApplication.run(SpringbootSsmApplication.class, args); } }
在SpringBoot中整合MyBatis的时候,默认集成了Hikari连接池,Hikari的效率比Druid要高,但是得益于Druid提供了比较便捷的监控系统在企业开发中,druid使用还是最多的。
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency>
spring: datasource: druid: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/db_2010_mybatis?characterEncoding=utf-8 username: root password: admin123 initial-size: 1 min-idle: 1 max-active: 20
Thymeleaf是一种类似于JSP的动态网页技术
SpringBoot应用对Thymeleaf提供了良好的支持
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
Thymeleaf模板就是HTML文件
SpringBoot应用中 resources\templates
目录就是用来存放页面模板的
重要说明:
templates 目录下的文件会被定义为动态网页模板,SpringBoot应用会拦截templates中定义的资源;如果将HTML文件定义在templates目录,则必须通过控制器跳转访问。
在templates创建HTML页面模板
创建PageController,用于转发允许"直接访问"的页面请求
@Controller @RequestMapping("/page") public class PageController { @RequestMapping("/test.html") public String test(){ return "test"; } }
如果要在thymeleaf模板中获取从控制传递的数据,需要使用th标签
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> </body> </html>
在几乎所有的HTML双标签都可以使用 th:text属性,将接收到的数据显示在标签的内容中
<label th:text="${price}"></label> <div th:text="${str}"></div> <p th:text="${book.bookName}"></p>
HTML内联
<p th:inline="text">图书名称:[[${book.bookName}]]</p>
CSS内联
<style type="text/css" th:inline="css"> .style1{ color:[[${color}]] } </style>
JavaScript内联
<script type="css/javascript" th:inline="javascript"> </script>
<div th:object="${book}"> <p th:text="*{bookId}"></p> <p th:text="*{bookName}"></p> <p th:text="*{bookAuthor}"></p> </div>
<table style="width: 600px" border="1" cellspacing="0"> <caption>图书信息列表</caption> <thead> <tr> <th>图书ID</th> <th>图书名称</th> <th>作者</th> </tr> </thead> <tbody> <tr th:each="b:${books}"> <td th:text="${b.bookId}"></td> <td th:text="${b.bookName}"></td> <td th:text="${b.bookAuthor}"></td> </tr> </tbody> </table>
th:if 如果条件不成立,则不显示此标签
<td th:if="${b.bookPrice}>40" style="color:red">太贵!!!</td> <td th:unless="${b.bookPrice}>40" style="color:red">太贵!!!</td> <td th:if="${b.bookPrice}<=40" style="color:green">推荐购买</td>
th:switch 和 th:case
<td th:switch="${b.bookPrice}/10"> <label th:case="3">建议购买</label> <label th:case="4">价格合理</label> <label th:case="*">价格不合理</label> </td>
<td th:switch="${user.gender}"> <label th:case="M">男</label> <label th:case="F">女</label> <label th:case="*">性别不详</label> </td>
碎片,就是HTML片段,我们可以将多个页面中使用的相同的HTML标签部分单独定义,然后通过th:include可以在HTML网页中引入定义的碎片
定义碎片 th:fragment
header.html
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div th:fragment="fragment1" style="width: 100%; height: 80px;background: deepskyblue; color:white; font-size: 25px; font-family:文鼎霹雳体"> 六六六!!! </div> </body> </html>
footer.html
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div th:fragment="fragment2" style="width: 100%; height: 30px;background: lightgray; color:white; font-size: 16px;"> 你好 </div> </body> </html>
引用碎片 th:include 和 th:replace
a.html
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <!-- <div th:include="header::fragment1"></div>--> <div th:replace="header::fragment1"></div> <div style="width: 100%; height: 500px"> 定义内容 </div> <!-- <div th:include="footer::fragment2"></div>--> <div th:replace="footer::fragment2"></div> </body> </html>
项目首次部署、服务启动之后,如果应用发生了变化、而且IDEA感知到了应用的变化,就自动的完成jar的更新,无需手动再次启动服务器,就可以访问应用的更新。
File---settings
Ctrl+Shift+Alt+/ ----- Registry
在需要进行热部署的SpringBoot应用中添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency>
配置SpringBoot的Maven插件
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>true</fork> </configuration> </plugin>
配置SpringBoot应用的变化更新策略