目录
②springboot项目会默认生成一个文件夹application.properties
一、简介
springboot是什么
Spring Boot它本身并不提供Spring框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于Spring框架的应用程序。
也就是说,它并不是用来替代Spring的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具同时它集成了大量常用的第三方库配置(例如Jackson, JDBC, Mongo, Redis, Mail等等),
Spring Boot应用中这些第三方库几乎可以零配置的开箱即用(out-of-the-box),大部分的Spring Boot应用都
只需要非常少量的配置代码,开发者能够更加专注于业务逻辑
注1:敏捷式开发
注2:spring boot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,spring boot整合了所有的框架
注3:基于Spring框架的一站式解决方案
二、入门
1.特点
敏捷式开发、开箱即用、基于Spring的一站式解决方案
创建项目
#可以换源
http://start.aliyun.com#默认勾选web、lombok、Mybatis组件
国内和国外的网站是有区别的,最新版本不同,国外就是英文字母,国内就是汉子。有了解的的可以去看看,这里我就用的是国内网站,国外网站也是可以用的只有你能创建项目成功就好了。
这里你有些东西乱勾上,项目不一定会运行成功的。
在点一下导入改变。
我们测试一下看看整合好的SpringMVC能不能用。
IndexController.java
package com.jwj.springboot01.dmeo;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author 敢敢
* @site www.javajwj.com
* @company xxx公司
* @create 2022-10-31 18:39
*/
//等价于 @responseBody + @controller
@RestController
public class IndexController {
@RequestMapping("/")
public String index(){
System.out.println("come in");
return "index";
}
}
运行的话怎么运行,如图所示:
说明可以用的
解决方案:为了避免不要乱勾,或者多勾出现的错误
我们新建一个项目叫springboot011
这里我们还是跟前面一样,只不过多勾了一个数据库连接,如图所示:
然后我们在把上面的测试代码也复制到这个项目里面来,进行运行就会发现出错了,如图所示:
所以说,所有的组件,不是你勾了就一定能用,可能还要添加必要的配置。
因为我们导入了这个配置
它之所以报了这个错第一种原因是:我们没有配 ,第二个原因是:springboot它会自动去加载mybatis的组件,我们有没有,它又去加载,所以就会报错。
解决问题有两种方案:添加数据库配置,第二个可以不去加载。
配置默认不加载数据源
package com.jwj.springboot01;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
// 排除数据源自动配置这个类
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class Springboot01Application {
public static void main(String[] args) {
SpringApplication.run(Springboot01Application.class, args);
}
}
这样就可以运行了如果所示:这就是关于数据源加载
2.SpringBoot的目录结构
①springboot默认是不支持jsp的
②springboot项目会默认生成一个文件夹application.properties
SpringBoot中的唯二的配置文件,不能变,不管以后要在这个项目中使用mybatis、springmvc、等等其他的配置 ,都是往这里放,有且只有一个。这里面有很多配置都是 可以加的。如果有很多配置,就会容易分不清除所以我们要下载一个插件
# 应用名称
spring.application.name=testspringboot02
# 应用服务 WEB 访问端口
server.port=8081
#下面这些内容是为了让MyBatis映射
#指定Mybatis的Mapper文件
mybatis.mapper-locations=classpath:mappers/*xml
#指定Mybatis的实体目录
mybatis.type-aliases-package=com.zking.testspringboot02.mybatis.entity
③下载properties与yml的文件转换插件
application.properties
# 应用名称 spring.application.name=springboot01 # 应用服务 WEB 访问端口 server.port=8080 # 应用访问地址 server.servlet.context-path=/sm
安装 Convert YAML and Properties File 的插件
安装好插件重新启动,要不然不会生效的。
选中application.properties右键点击 Convert YAML and Properties File
application.yml
它就转为树形结构了,因为我们后面加的配置越来越多,就不知道哪个配置属于那个配置的了
三、统一响应类及错误编码类
1.Eolink的使用
之前我们写增删改查的方法都是这样的写的,这里我没有用到数据库了。
package com.jwj.springboot01.dmeo;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author 敢敢
* @site www.javajwj.com
* @company xxx公司
* @create 2022-11-01 13:30
*/
@RestController
@RequestMapping("/book")
public class BookController {
@RequestMapping("/list")
public Map list(){
// 查询数据库
List<Book> books = Arrays.asList(new Book(1, "西游记"),
new Book(2, "红楼梦"),
new Book(3, "水浒传"),
new Book(4, "三国演义"));
Map map = new HashMap();
map.put("data",books);
map.put("total",122);
map.put("msg","查询成功");
map.put("code",200);
return map;
}
@RequestMapping("/add")
public Map add(){
Map map = new HashMap();
map.put("msg","新增成功");
map.put("code",200);
return map;
}
@RequestMapping("/update")
public Map update(){
Map map = new HashMap();
map.put("msg","修改成功");
map.put("code",200);
return map;
}
@RequestMapping("/del")
public Map del(){
Map map = new HashMap();
map.put("msg","删除成功");
map.put("code",200);
return map;
}
@RequestMapping("/load")
public Map load(){
Map map = new HashMap();
map.put("data",new Book(1,"西游记"));
map.put("msg","删除成功");
map.put("code",200);
return map;
}
}
@AllArgsConstructor
//lombok组件代表的是set、get、ToString方法都不用写了,这是它的作用
@Data
class Book{
private int id;
private String name;
}
运行结果如图所示:
但是在若依项目中,增删改查的方法不是这样写的。是这样的写的
package com.jwj.springboot01.dmeo;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author 敢敢
* @site www.javajwj.com
* @company xxx公司
* @create 2022-11-01 13:30
*/
@RestController
@RequestMapping("/book")
public class BookController {
@GetMapping("/list")
public Map list(){
// 查询数据库
List<Book> books = Arrays.asList(new Book(1, "西游记"),
new Book(2, "红楼梦"),
new Book(3, "水浒传"),
new Book(4, "三国演义"));
Map map = new HashMap();
map.put("data",books);
map.put("total",122);
map.put("msg","查询成功");
map.put("code",200);
return map;
}
@PutMapping("/add")
public Map add(){
Map map = new HashMap();
map.put("msg","新增成功");
map.put("code",200);
return map;
}
@PostMapping("/update")
public Map update(){
Map map = new HashMap();
map.put("msg","修改成功");
map.put("code",200);
return map;
}
@DeleteMapping("/del")
public Map del(){
Map map = new HashMap();
map.put("msg","删除成功");
map.put("code",200);
return map;
}
@RequestMapping("/load")
public Map load(){
Map map = new HashMap();
map.put("data",new Book(1,"西游记"));
map.put("msg","删除成功");
map.put("code",200);
return map;
}
}
@AllArgsConstructor
//lombok组件代表的是set、get、ToString方法都不用写了,这是它的作用
@Data
class Book{
private int id;
private String name;
}
当我们运行的时候,会发现不能测试了。
注:我们就改了这个注解之后它就运行不成功了,在公司里面或者若依的项目等其他优秀的项目都不会使用RequestMapping,之所以会去创建这些注解的原因就是希望这个方法大概是干嘛的
专门弄业务的,专门弄数据库的,专门做这个业务跳转的,发现上面的测试不了了。
所以我们要借助一个工具,测的工具有很多,学测试的人用的测试工具就是Postman,我这里就只有两个。我用的就是Eolink。用的方式都是差不多的。安装步骤很简单。安装好了之后会让你注册一个账号,注册一个就好了
安装好了就是这样的,如图所示:
注册一个账号,就好了,进来之后就是这样的,如图所示:
怎么测试?在测试的过程中,你的项目要运行起来。
如果我要传递怎么传?传参我就传add和del的方法
怎么拿到我们的对象?
很多企业都是用postman的使用,因为我觉得Eolink这个界面好看一点,看你们各人喜欢那个吧。
Eolink的使用:更细粒度的调测后台数据接口
2.响应封装类配置
Result.java 结果类,这个结果类体现的形式都不一样,我这里只写一个版本
这里面就封装了我们常用的方法
package com.jwj.springboot01.result;
public class Result<T> {
private int code;
private String msg;
//因为返回的数据不知道是什么类型,所以定义一个泛型
private T data;
private long total;
public long getTotal() {
return total;
}
public void setTotal(long total) {
this.total = total;
}
/**
* 成功的时候调用
*/
public static <T> Result<T> ok(T data) {
return new Result<T>(data);
}
public static <T> Result<T> ok(int code,String msg) {
return new Result<>(code,msg);
}
public static <T> Result<T> ok(int code,String msg,T data) {
Result<T> success = ok(data);
success.setCode(code);
success.setMsg(msg);
return success;
}
public static <T> Result<T> ok(int code,String msg,T data,long total) {
Result<T> success = ok(code,msg,data);
success.setTotal(total);
return success;
}
/**
* 失败的时候调用
*/
public static <T> Result<T> error(CodeMsg codeMsg) {
return new Result<T>(codeMsg);
}
private Result(T data) {
this.data = data;
}
private Result(int code, String msg) {
this.code = code;
this.msg = msg;
}
private Result(CodeMsg codeMsg) {
if (codeMsg != null) {
this.code = codeMsg.getCode();
this.msg = codeMsg.getMsg();
}
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
CodeMsg.java
package com.jwj.springboot01.result;
public class CodeMsg {
private int code;
private String msg;
//通用的错误码
public static CodeMsg SUCCESS = new CodeMsg(200, "success");
public static CodeMsg SERVER_ERROR = new CodeMsg(500, "服务端异常");
public static CodeMsg BIND_ERROR = new CodeMsg(500101, "参数校验异常:%s");
public static CodeMsg REQUEST_ILLEGAL = new CodeMsg(500102, "请求非法");
public static CodeMsg ACCESS_LIMIT_REACHED = new CodeMsg(500104, "访问太频繁!");
//登录模块5002XX
public static CodeMsg SESSION_ERROR = new CodeMsg(500210, "Session不存在或者已经失效");
public static CodeMsg PASSWORD_EMPTY = new CodeMsg(500211, "登录密码不能为空");
public static CodeMsg MOBILE_EMPTY = new CodeMsg(500212, "手机号不能为空");
public static CodeMsg MOBILE_ERROR = new CodeMsg(500213, "手机号格式错误");
public static CodeMsg MOBILE_NOT_EXIST = new CodeMsg(500214, "手机号不存在");
public static CodeMsg PASSWORD_ERROR = new CodeMsg(500215, "密码错误");
//商品模块5003XX
//订单模块5004XX
public static CodeMsg ORDER_NOT_EXIST = new CodeMsg(500400, "订单不存在");
//秒杀模块5005XX
public static CodeMsg MIAO_SHA_OVER = new CodeMsg(500500, "商品已经秒杀完毕");
public static CodeMsg REPEATE_MIAOSHA = new CodeMsg(500501, "不能重复秒杀");
public static CodeMsg MIAOSHA_FAIL = new CodeMsg(500502, "秒杀失败");
private CodeMsg() {
}
private CodeMsg(int code, String msg) {
this.code = code;
this.msg = msg;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public CodeMsg fillArgs(Object... args) {
int code = this.code;
String message = String.format(this.msg, args);
return new CodeMsg(code, message);
}
@Override
public String toString() {
return "CodeMsg [code=" + code + ", msg=" + msg + "]";
}
}
BookController2.java
package com.jwj.springboot01.dmeo;
import com.jwj.springboot01.result.CodeMsg;
import com.jwj.springboot01.result.Result;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author 敢敢
* @site www.javajwj.com
* @company xxx公司
* @create 2022-11-01 13:30
*/
@RestController
@RequestMapping("/book2")
public class BookController2 {
@GetMapping("/list")
public Result list(){
// 查询数据库
List<Book> books = Arrays.asList(new Book(1, "西游记"),
new Book(2, "红楼梦"),
new Book(3, "水浒传"),
new Book(4, "三国演义"));
return Result.ok(200,"查询成功",books,222);
}
@PutMapping("/add")
public Result add(Book book){
System.out.println(book);
int id = book.getId();
if(id == 0){
return Result.error(CodeMsg.BIND_ERROR.fillArgs("id未传递..."));
}
return Result.ok(200,"新增成功");
}
@PostMapping("/update")
public Result update(){
return Result.ok(200,"修改成功");
}
@DeleteMapping("/del")
public Result del(int bid){
System.out.println(bid);
return Result.ok(200,"删除成功");
}
@RequestMapping("/load")
public Result load(){
return Result.ok(200,"加载成功",new Book(5,"洞庭湖"));
}
}
测试,这样是没有问题的,新增成功了
如果这样我传递一个0,就失败了,如图所示:
通过CodeMsg这个类,统一了错误,一目了然,很明确出现的错误是什么。它就想当于说明书,出现了那些异常它都会告诉你那里出错了,就好比:家里的洗衣机一样。
统一的响应封装类以及错误编码类,这个是一种良好的习惯。
四、总结
特点:不是框架,是一站式解决方案:敏捷式开发,开箱即用。
创建SpringBoot项目:
①是依靠start.spring.io的网站进行项目的构建
②构建SpringBoot项目尽可能依靠阿里的镜像网站进行构建,能够在一定程度上加快构建速度
SpringBoot项目的结构,可以参考上面的图。
SpringBoot集成Spring mvc
①只需要勾选web组件 spring-boot-starter-web
②在Controller上标记@restController,方法返回值为index,结果是响应一个字符串
Eolink
①requestMapping、GetMapping、PutMapping、PostMapping、DeleteMapping的区别
②使用Eolink的工具