Spring,springMVC,springBoot 之间的关系:
Spring 是一个“容器”;
Spring MVC 是基于 Spring 的一个 MVC 框架;
Spring Boot 是基于 Spring4/5 的条件注册的一套快速开发整合包。致力于微服务领域。
环境要求:
基于springBoot2.x,环境以下:jdk1.8 or later ,Gradle 4+ or Maven 3.2+
自动创建SpringBoot应用:
官网地址:http://start.spring.io/
配置好之后直接generate project,会得到一个压缩包,解压用idea导入即可。
idea导入:
Controller写法一致:
手动新建:
new–file–Spring Initializr
spring-web
SpringBoot 是如何做到导入一个启动依赖就可以自动导入依赖的 jar 包?
注意:对于自动创建的 boot 项目我们主要需要看看 pom.xml 中的规范!还有需要特别注意 一个 boot 项目中只能有一个启动器。
@RestController = @Controlle + @ResponseBody
@SpringBootApplication = @Configuration+@EnableAutoConfiguration+@ComponentScan
@GetMapping = @RequestMapping(method = RequestMethod.GET)
@PostMapping = @RequestMapping(method = RequestMethod.POST)
@PutMapping = @RequestMapping(method = RequestMethod.PUT)
@DeleteMapping = @RequestMapping(method = RequestMethod.DELETE)
接口GET请求实战
json框架以及结果处理
常用框架:
阿里的 fastjson,谷歌的 gson 等,JavaBean 序列化为 Json,性能:
Jackson > FastJson > Gson > Json-lib 同个结构。Jackson、FastJson、Gson 类库各有优点,各有自己的专长
空间换时间,时间换空间
常用的结果处理方式:
@JsonIgnore
指定敏感字段不暴露给调用方
@JsonProperty
给敏感字段指定一个别名,目的是为了防止恶意探测攻击(不让调用方知道具体字段的含义)
@JsonFormat
转换日期
@JsonInclude
主要用于排除非空字段
加依赖
org.springframework.boot
spring-boot-starter-validation
2.2.2.RELEASE
pojo加验证规则
controller加注解@Validated
src/main/java:存放代码
src/main/resources
static: 存放静态文件,比如 css、js、image, (访问方式 http://localhost:8080/js/main.js)
templates:存放静态页面 jsp,html,tpl
config:存放配置文件,application.properties
resources:额外的一些资源
public:公共的一些文件
官方推荐Thymeleaf模板引擎
org.springframework.boot
spring-boot-starter-thymeleaf
2.2.2.RELEASE
# 开发环境设置为false
spring.thymeleaf.cache=false
spring.thymeleaf.mode=HTML5
# 静态资源路径配置
spring.resources.static-location=classpath"/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,classpath:/upload/
# 配置文件上传
spring.servlet.multipart.max-file-size=2MB
同一个静态资源文件加载顺序:
Spring Boot 默认会挨个从META/resources > resources > static > public 里面找是否存在相应的资源,如果有则直接返回。不会再去其他文件夹找相应资源了。
比如:http://localhost:8080/test.js 去访问一个 test.js,那么就会 springboot 就会依次去
resources>static>public 下面找,如果找不到则直接报错。(侧面可以看出springboot默认是不会去config.templates下面找资源的)
@RestController
public class UploadController {
@PostMapping("/upload/header")
public JsonResult upload(MultipartFile header) {
if(header.isEmpty()) {
return new JsonResult(4002,"文件为空");
}
try {
// 获取文件名
String fileName = header.getOriginalFilename();
// 处理后缀
// 处理文件保存的路径
// 文件名
// 文件保存路径
String path = "E:\\IDEAspring\\myfirst\\src\\main\\resources\\upload";
// 抽象出文件对象
File uploadPath = new File(path);
File uploadFile = new File(uploadPath, fileName);
// 上传
header.transferTo(uploadFile);
return new JsonResult(200,"上传成功");
} catch (IOException e) {
e.printStackTrace();
return new JsonResult(4004,e.getMessage());
}
}
}
打jar包:maven—Lifecyle—双击install
打开Terminal,在终端运行:
dir:打开目录
cd target:进入文件夹
java -jar myfirst-0.0.1-SNAPSHOT.jar:运行jar文件
从Tomcat中解脱了!!!
文件上传之后,怎么访问图片呢???
发现文件上传成功,但是没法访问,仔细分析了一下原来是:
我们现在是以 jar 包的形式运行的,文件怎么可能会上传到 jar 包里面去呢,所以需要单
独配置一个文件的静态资源路径。
解决:在 application.properties 中增加下面配置
最后,重新打包运行
项目大了之后应该选择单独的文件服务器,文件服务器:fastdfs,阿里云 oss,nginx 搭建一个简单的文件服务器。
https://blog.csdn.net/weixin_45044097/article/details/104458591
https://blog.csdn.net/weixin_45044097/article/details/104458936
导入依赖(自动创建项目时自动加入)
@RunWith(SpringRunner.class)和 spring 的底层一致
@SpringBootTest(classes=SpringBootAutoApplication.class)指启动相关应用
版本不同,会有变化
定义一个异常测试控制器
@RestController
public class ExceptionController {
@GetMapping("/exception/msg")
public String getMsg() {
int i = 1/0;
return "Message";
}
}
出现错误页面,非常不友好
@RestControllerAdvice
public class MyExceptionHandler{
// 可以捕获到所有Exception以及子类的异常
@ExceptionHandler(Exception.class)
JsonResult exceptionHandler(Exception e){
return new JsonResult(1001,e.getMessage());
}
// 捕获自定义异常
@ExceptionHandler(MyException.class)
JsonResult myexceptionHandler(MyException e) {
return new JsonResult(e.getCode(),e.getMsg());
}
}
@RestControllerAdvice:定义一个全局的异常处理通知,返回 json
@ControllerAdvice:定义一个全局的异常处理通知,你不返回 json
@ExceptionHandler:定义异常处理助手,捕获指定异常
public class MyException extends RuntimeException {
private Integer code;
private String msg;
public MyException(Integer code, String msg) {
super(msg);
this.code = code;
this.msg = msg;
}
// getter,setter
}
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("------拦截前-------");
return true;
}
}
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
// 要拦截的路径
.addPathPatterns("/**")
.excludePathPatterns("/exception/*");
// 再加拦截器
}
}
Filter 是基于函数回调 doFilter(),而 Interceptor 则是基于 AOP 思想。
Filter 在只在 Servlet 前后起作用,而 Interceptor 够深入到方法前后、异常抛出前后等依赖于 Servlet 容器即 web 应用中,而 Interceptor 不依赖于 Servlet 容器所以可以运行在多种环境。
在接口调用的生命周期里,Interceptor 可以被多次调用,而 Filter 只能在容器初始化时调用一次。
filter过滤请求,拦截器拦截方法
过滤前 --> 拦截前 --> action 执行 --> 拦截后 --> 过滤后