SpringBoot简介
认识spring boot
spring boot 是spring家族的一个全新的框架,它整合了ssm框架,简化了配置,他通过采用大量默认配置的方式,使项目开发变得简单。有内置的Tomcat服务器,简化了部署。
特性
➢ 能够快速创建基于 Spring 的应用程序
➢ 能够直接使用 java main 方法启动内嵌的 Tomcat 服务器运行 Spring Boot 程序,不需要部署 war 包文件
➢ 提供约定的 starter POM 来简化 Maven 配置,让 Maven 的配置变得简单
➢ 自动化配置,根据项目的 Maven 依赖配置,Spring boot 自动配置 Spring、Spring mvc等
➢ 提供了程序的健康检查等功能
➢ 基本可以完全不使用 XML 配置文件,采用注解配置
四大核心
- 自动配置
针对很多 Spring 应用程序和常见的应用功能,Spring Boot 能自动提供相关配置 - 起步依赖
告诉 Spring Boot 需要什么功能,它就能引入需要的依赖库 - Actuator
深入运行中的 Spring Boot 应用程序,一探 Spring Boot 程序的内部信息 - 命令行界面
可选特性,主要针对 Groovy 语言使用
基本springboot项目介绍
构建基本springboot项目步骤
- 在java空项目中新建model,选中spring Initializr 直接next ,之后需要联网加载
- 填写坐标GAV ,注意需要删除Package 下的项目名称简写
- 选中web ,选择spring web,添加spring web 起步依赖,点击next
- 注意模块存放位置时候正确,点击next,finish
pom.xml介绍
- 标签parent 继承spring boot 的父级依赖
- GAV坐标
- properties 标签中方的是版本号,如果父级依赖没有,可以在这里自己定义版本号
- dependencies 标签存放依赖,模块创建完成默认存放spring-boot-starter-web 和spring-boot-strater-test依赖,都继承自父级依赖
- build 标签可以放resources和plugins标签,resources中指定需要扫描到的资源,plugins中放的是使用的插件:项目创建完成默认存放spring-boot-maven-plugin编译插件
src目录结构介绍
java:存放java文件,controller、service、dao、model(domain)都放在这层,但是这些java文件所在的包必须与Application同级
Application:项目的入口,放着Tomcat内置服务器
static:放静态资源,图片、js、css等资源文件
templates:存放模板文件,thymeleaf等模板文件
application.properties:主配置文件,放配置信息,像服务端口号,上下文根路径,数据源信息、切换环境等
Application.java 文件
@SpringBootApplication
注解是 Spring Boot 项目的核心注解,主要作用是开启Spring 自动配置在 ,如果在 Application 类上去掉该注解,那么不会启动 SpringBoot程序- main 方法是一个标准的 Java 程序的 main 方法,主要作用是作为项目启动运行的入口
配置文件介绍
核心配置格式
默认采用.properties文件格式,采用键值对的方式进行配置
也可以使用.yml或者是.yaml文件格式,主要采用一定的空格、换行等格式排版进行配置
多环境配置
多环境,就是项目有多个环境配置文件,如开发环境,测试环境,准上线环境,上线环境等,通过主配置文件进行切换环境进行项目测试
主配置文件名称不变,其他环境配置文件名称规定使用 application-环境标识.properties|yml
,例如:
application-dev.properties 开发环境核心配置文件
application-product.properties 生产环境核心配置文件
application-test.properties 测试环境核心配置文件
springboot自定义配置
除了内置配置项,还可以自定义配置项
- 直接在配置文件中定义
对于在配置文件中自定义的配置(key-value),使用时需要注解@Value :@Value("${key}") ,注解需要使用在String类型变量上面 - 将文件声明成对象,使用其属性作为配置项,需要注解@ConfigurationProperties ,举个例子
@Component
@ConfigurationProperties(prefix = "school")
public class ConfigInfo {
private String name;
private String websit;
//需要生成set/get方法,这里略
}
application.properties 配置文件
#设置内嵌 Tomcat 端口号,不设置默认8080
server.port=9090
#设置上下文根
server.servlet.context-path=/config
school.name=ssm
school.websit=http://www.baidu.com
application.yml 配置文件
server:
port: 9090
servlet:
context-path: /config
school:
name: ABC
websit: http://www.baidu.com
在 SpringBootController 中注入 ConfigInfo 配置类
@Autowired
private ConfigInfo configInfo;
@RequestMapping(value = "/springBoot/config")
public @ResponseBody String say() {
return configInfo.getName() + "=======" +configInfo.getWebsit();
}
运行结果
注意:
在 ConfigInfo 类中使用了 ConfigurationProperties 注解后,IDEA 会出现一个警告,不影响程序的执行。解决方法,添加下面的依赖即可
<!--解决使用@ConfigurationProperties 注解出现警告问题-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
springboot 使用 jsp
- 首先springboot 项目目录中没有webapp文件夹,这就需要我们自己建一个有效的webapp文件夹
- 快捷键ctrl+shift+alt+s 打开项目结构Project Structure ,点击 Modules 找到需要修改的模块,点击web
- 接下来分两步:第一步,Deployment Descriptors 中点击 “+” ,添加web.xml ,路径是项目绝对路径\模块名\src\main\webapp\WEB-INF\web.xml ,点击OK;第二步,在Web Resource Directories 中点击 “+” ,path是项目绝对路径\模块名\src\main\webapp ;relative path 默认是 “\” ,点击OK,创建webapp文件夹,点击最下方Apply将web.xml放进对应位置
- 添加相关依赖,并配置resources信息
<!--引入 Spring Boot 内嵌的 Tomcat 对 JSP 的解析包,不加解析不了 jsp 页面-->
<!--如果只是使用 JSP 页面,可以只添加该依赖-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<!--如果要使用 servlet 必须添加该以下两个依赖-->
<!-- servlet 依赖的 jar 包-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
</dependency>
<!--如果使用 JSTL 必须添加该依赖-->
<!--jstl 标签依赖的 jar 包 start-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<build>
<!--
SpringBoot 要求 jsp 文件必须编译到指定的 META-INF/resources 目录下才能访问,否则访
问不到。
其它官方已经建议使用模版技术(后面会课程会单独讲解模版技术)
-->
<resources>
<resource>
<!--源文件位置-->
<directory>src/main/webapp</directory>
<!--指定编译到 META-INF/resources,该目录不能随便写-->
<targetPath>META-INF/resources</targetPath>
<!--指定要把哪些文件编译进去,**表示 webapp 目录及子目录,*.*表示所有文件-->
<includes>
<include>**/*.*</include>
</includes>
</resource>
</resources>
</build>
- 在 application.properties 文件配置 Spring MVC 的视图展示为jsp ,这里相当于 Spring MVC 的配置
#SpringBoot 核心配置文件
#不写port和上下文根contextpath,所以默认是 8080 和 /
#配置 SpringMVC 视图解析器
#其中:/ 表示目录为 src/main/webapp
spring.mvc.view.prefix=/
spring.mvc.view.suffix=.jsp
- 建立controller类
@Controller
public class SpringBootController {
@RequestMapping(value = "/springBoot/jsp")
public String jsp(Model model) {
model.addAttribute("data","SpringBoot 前端使用 JSP 页面!");
return "index";
}
}
- index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" >
<html>
<head>jsp测试</head>
<body>{data}</body>
</html>
运行结果
springboot 集成 mybatis
添加依赖pom.xml:mybatis整合springboot起步依赖和驱动依赖
<!--MyBatis 整合 SpringBoot 的起步依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!--MySQL 的驱动依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
springboot核心配置文件配置数据源
#配置内嵌 Tomcat 端口号
server.port=9090
#配置项目上下文根
server.servlet.context-path=/010-springboot-web-mybatis
#配置数据库的连接信息
#注意这里的驱动类有变化
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#注意这里的localhost是本地服务,如果是远程,换上对应的IP;?后面是解决访问远程时,页面显示乱码问题
spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
#用户名、密码根据自己情况设置
spring.datasource.username=root
spring.datasource.password=123456
controller层service层和往常一样处理,这里说明下dao层
service层需要对dao层使用@Autowride自动注入,如往常一样写的话,会爆出错误提示找不到mapper文件,原因是springboot没有扫描到mapper为其生成对应的对象,无法做到自动注入。解决办法有二:
- 在mapper接口文件上面加上注解@Mapper
- 在入口类Application.java 上面加上注解@MapperScan(“mapper文件所在的包路径”)
如果mapper的xml文件放在resources目录中,需要在application.properties文件中指定
# 指定 Mybatis 映射文件的路径
mybatis.mapper-locations=classpath:mapper/*.xml
springboot 事务支持
只需两步
第一步:开启事务,在application.java 文件类的上面添加注解@EnableTransactionManagement 表示开启事务
第二步:在需要进行事务管理的方法上添加注解@Transactional
springboot下的springMVC
@Controller
表示它修饰的Controller类中的方法的返回值可以是json格式的数据,页面
@RestController
表示它修饰的Controller类中的方法的返回值都是json格式的数据,不能返回页面
@RequestMapping (常用)
支持 Get 请求,也支持 Post 请求
@GetMapping
RequestMapping 和 Get 请求方法的组合
只支持 Get 请求
Get 请求主要用于查询操作
@PostMapping
RequestMapping 和 Post 请求方法的组合
只支持 Post 请求
Post 请求主要用户新增数据
@PutMapping
RequestMapping 和 Put 请求方法的组合
只支持 Put 请求
Put 通常用于修改数据
@DeleteMapping
RequestMapping 和 Delete 请求方法的组合
只支持 Delete 请求
通常用于删除数据
举个小例子
//RestController 注解相当于加了给方法加了@ResponseBody 注解,所以是不能跳转页面
的,只能返回字符串或者 json 数据
@RestController
public class MVCController {
@GetMapping(value = "/query")
public String get() {
return "@GetMapping 注解,通常查询时使用";
}
@PostMapping(value = "/add")
public String add() {
return "@PostMapping 注解,通常新增时使用";
}
@PutMapping(value = "/modify")
public String modify() {
return "@PutMapping 注解,通常更新数据时使用";
}
@DeleteMapping(value = "/remove")
public String remove() {
return "@DeleteMapping 注解,通常删除数据时使用";
}
}
因为通过浏览器输入地址,默认发送的只能是 get 请求,通过 Postman 工具,可以模拟发送不同类型的请求,并查询结果,在安装的时候,有些机器可能会需要安装 MicroSort .NETFramework
springboot实现RestFul
什么是 RESTFul 风格?举个例子:
我们要访问一个 http 接口:http://localhost:8080/boot/order?id=1021&status=1
采用 RESTFul 风格则 http 地址为:http://localhost:8080/boot/order/1021/1
显而易见,之前的key=value全部改成 “/” 的形式
RESTFul 主要是几个注解实现
- @PathVariable
获取 url 中的数据
现 该注解是实现 RESTFul 最主要的一个注解 - @PostMapping
接收和处理 Post 方式的请求 - @DeleteMapping
接收 delete 方式的请求,可以使用 GetMapping 代替 - @PutMapping
接收 put 方式的请求,可以用 PostMapping 代替 - @GetMapping
接收 get 方式的请求
RESTful 的优点
➢ 轻量,直接基于 http,不再需要任何别的诸如消息协议get/post/put/delete 为 CRUD 操作
➢ 面向资源,一目了然,具有自解释性。
➢ 数据描述简单,一般以 xml,json 做数据交换。
➢ 无状态,在调用一个接口(访问、操作资源)的时候,可以不用考虑上下文,不用考虑当前状态,极大的降低了复杂度。
➢ 简单、低耦合
请求方式就是上面的例子,这里着重说@PathVariable
请求参数通过{key}来接收,注解@PathVariable 用在方法参数上,表示形参接收那个参数
代码
@RestController
public class RESTfulController {
/**
* 添加学生
* 请求地址: http://localhost:9090/014-springboot-
restful/springBoot/student/wangpeng/23
* 请求方式: POST
* @param name
* @param age
* @return
*/
@PostMapping(value = "/springBoot/student/{name}/{age}")
public Object addStudent(@PathVariable("name") String name,@PathVariable("age") Integer age) {
Map<String,Object> retMap = new HashMap<String, Object>();
retMap.put("name",name);
retMap.put("age",age);
return retMap;
}
/**
* 删除学生
* 请求地址: http://localhost:9090/014-springboot-
restful/springBoot/student/1
* 请求方式: Delete
* @param id
* @return
*/
@DeleteMapping(value = "/springBoot/student/{id}")
public Object removeStudent(@PathVariable("id") Integer id) {
return "删除的学生 id 为:" + id;
}
/**
* 修改学生信息
* 请求地址: http://localhost:9090/014-springboot-
restful/springBoot/student/2
* 请求方式: Put
* @param id
* @return
*/
@PutMapping(value = "/springBoot/student/{id}")
public Object modifyStudent(@PathVariable("id") Integer id) {
return "修改学生的 id 为" + id;
}
@GetMapping(value = "/springBoot/student/{id}")
public Object queryStudent(@PathVariable("id") Integer id) {
return "查询学生的 id 为" + id;
}
}
RestFul风格会出现的请求冲突问题
当同一类型的请求出现这样一种情况:
@PostMapping请求一:/springboot/{id}/order/{age}
@PostMapping请求二:/springboot/{age}/order/{id}
两个请求的参数值都是Integer类型的,这时服务器发出的请求不能分辨应该哪个请求,就会报错:Error Page … Ambiguous handles methods mapped for …
RESTful 原则
- 增 post 请求、删 delete 请求、改 put 请求、查 get 请求
- 请求路径不要出现动词
例如:查询订单接口
/boot/order/1021/1(推荐)
/boot/queryOrder/1021/1(不推荐) - 分页、排序等操作,不需要使用斜杠传参数
例如:订单列表接口
/boot/orders?page=1&sort=desc
一般传的参数不是数据库表的字段,可以不采用斜杠