视频教程:https://www.bilibili.com/video/BV1nV4y1s7ZN?p=3&vd_source=1656d4f8efefd2dc9cca344e8978b19e

1.Web入门

1.1Web入门

  • Spring Boot将传统Web开发的mvc、json、tomcat等框架整合,提供了spring-boot-starter-web组件,简化了Web应用配置。
  • 创建SpringBoot项目勾选Spring Web选项后,会自动将spring-boot-starter-web组件加入到项目中。
  • spring-boot-starter-web启动器主要包括web、webmvc、json、tomcat等基础依赖组件,作用是提供Web开发场景所需的所有底层依赖。
  • webmvc为Web开发的基础框架,json为JSON数据解析组件,tomcat为自带的容器依赖。
1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

1.2控制器@Controller和@RestController

  • Spring Boot提供了**@Controller和@RestController**两种注解来标识此类负责接收和处理HTTP请求。
  • 如果请求的是页面和数据,使用@Controller注解即可;如果只是请求数据,则可以使用@RestController注解。

image-20220824075633917

@Controller和@RestController区别?

1.2.1@Controller用法:

  • 示例中返回了hello页面和name的数据,在前端页面中可以通过**${name}**参数获取后台返回的数据并显示。
  • @Controller通常与Thymeleaf模板引擎结合使用。(这样前后端就不分离了,不提倡)
1
2
3
4
5
6
7
8
9
10
@Controller
public class HelloController {

@RequestMapping("/hello")
public String index(ModelMap.map) {
map.addAtttribute("name","zhangsan");
return Hello;
//这样返回的控制器就必须是一个视图了
}
}

1.2.2RestController的用法:

  • 默认情况下,**@RestController注解会将返回的对象数据转换为JSON格式。**(这样方便前端去做一些处理)
1
2
3
4
5
6
7
8
9
10
11
@RestController
public class HelloController {

@RequestMapping("/user")
public String getUser(){
User user = new User;
user.setUsername("zhangsan");
user.setpassword("123");
return user;
}
}

理解:@Controller会返回页面和数据,但页面往往和Thymeleaf模板引擎结合,导致前后端不分离,这不是我们想看到的。所以为了只返回数据,我们用@RestController会更加方便

2.路由映射

2.1URL映射

  • @RequestMapping注解主要负责URL的路由映射。它可以添加在Controller类或者具体的方法上。
  • 如果添加在Controller类上,则这个Controller中的所有路由映射都将会加上此映射规则,如果添加在方法上,则只对当前方法生效。

理解:添加了@RequestMapping,我们就可以在浏览器上访问我们的页面了。@RequestMapping(“/user”),比如这行代码我们就能在浏览器8080端口的user界面找到

@RequestMapping注解包含很多属性参数来定义HTTP的请求映射规则。常用的属性参数如下:

  • value: 请求URL的路径,支持URL模板、正则表达式
  • method: HTTP请求方法
  • consumes: 请求的媒体类型(Content-Type),如application/json
  • produces: 响应的媒体类型
  • params,headers: 请求的参数及请求头的值

理解:一般我们只需要请求的路径和方法就足够了,后面三个不常用。

此外:value:@RequestMapping(“/user”)=@RequestMapping(value = “/user”),但是value常常会省略不写。

method对应HTTP请求方法,@RequestMapping(value = “/user”,method = RequestMethod.GET),后面这个就是get方法。(简便的方法)

2.2路由映射

image-20220824104639521

理解:一个和两个星号符,对应的分别是任意任意字符和任意路径,这是一个通配符。?也是,常用于传递方式http:localhost:8080/hello?username=zhangsan,传递了一个zhangsan的值给username

(星号符不好打,所以用字说明)

一个星:http://localhost:8080/test/xxx(任意一个单词)

两个星:http://localhost:8080/test/xxx/xxx/xxx(多个路径都可以,但一个星不行)

2.3Method匹配

  • HTTP请求Method有GET、POST、PUT、DELETE等方式。HTTP支持的全部Method
  • @RequestMapping注解提供了method参数指定请求的Method类型,包括RequestMethod.GET、RequestMethod.POST、RequestMethod.DELETE、RequestMethod.PUT等值,分别对应HTTP请求的Method
1
2
3
4
@RequestMapping(value = "/user",method = RequestMethod.GET)
public String getUser(){
return hello;
}
  • Method匹配也可以使用@GetMapping、@PostMapping等注解代替。

理解:这个就是我们常用的http请求的四种方法。GET、POST、PUT、DELETE,同时@RequestMapping(“/user”,method = RequestMethod.GET) = @GetMapping(“/user”),因为后面的method方法就对应Get,如果后面是post那就是@PostMapping,同理还有两种也是。

3.参数传递

  • @RequestParam将请求参数绑定到控制器的方法参数上,接收的参数来自HTTP请求体或请求url的QueryString,当请求的参数名称与Controller的业务方法参数名称一致时,@RequestParam可以省略
  • @PathVaraible:用来处理动态的URL,URL的值可以作为控制器中处理方法的参数
  • @RequestBody接收的参数是来自requestBody中,即请求体。一般用于处理非 Content-Type: application/x-www-form-urlencoded编码格式的数据,比如:application/jsonapplication/xml等类型的数据
1
2
3
4
5
6
7
8
public class HelloController {
// http://localhost:8080/hello?username=fan

@GetMapping("/hello")
public String hello(String username){
return "你好" + username;
}
}

理解:?传递方式,将fan传给了username,参数就是username,所以hello里的String username就是参数。

3.1@RequestParam

1
2
3
4
5
6
7
8
@GetMapping("/test1")
// http://localhost:8080/test1?username=fan
// @RequestParam相当于给name取了一个别名叫username,这样我们也可以使用username来传递值,将URL中参数值传给controller 方法的形参。
// 但是用了@RequestParam,后面这个参数是必须的,不然写它干什么
// required = false,意味着参数传递不传递都可以,但是必须要写。不传递意味着空。
public String test1(@RequestParam(value = "username",required = false) String name){
return "Get请求";
}

理解:@RequestParam相当于给name取了一个别名叫username,这样我们也可以使用username来传递值,将URL中参数值传给controller 方法的形参。但是用了@RequestParam,后面这个参数是必须的,不然写它干什么,required = false,意味者参数传递不传递都可以,但是必须要写。不传递意味着空。

3.2为什么要创建实体类?

1
2
3
4
5
6
@PostMapping("/test2")
// http://localhost:8080/test2
//定义参数姓名和密码
public String test2(String name,String password){
return "Post请求";
}

如果参数特别的多,七八个。比如说一个注册的场景。账号密码手机号等等,全写在括号里显然不方便,java是一个面向对象的语言,那么我们可以把这些参数封装在一个对象里(User)。这些对象在软件工程叫做实体类。但是要保证名称一致。

1
2
3
4
5
6
@PostMapping("/test3")
// http://localhost:8080/test3
//定义一个类
public String test2(User user){
return "Post请求";
}

建立一个实体类entity.User类。

1
2
3
4
5
@Data
public class User {
private String username;
private String password;
}

3.3@PathVaraible

@PathVariable 同 @RequestParam的运行方式不同。你使用 @PathVariable 是为了从 URI 里取到查询参数值。换言之,你使用 @RequestParam 是为了从 URI 模板中获取参数值。@RequestParam 注解配合 @RequestMapping 一起使用,可以将请求的参数同处理方法的参数绑定在一起。就是从URI获取到参数值。

3.4@RequestBody

如果要接受json的数据,就要加这个,才能接收到。

1
2
3
4
5
6
@PostMapping("/test3")
// http://localhost:8080/test3
//定义一个类
public String test2(@RequestBody User user){
return "Post请求";
}

比如这个json数据:json数据是有引号类型的。名称和类型都要对应上

1
2
3
4
{
"username":"zhangsan",
"password":"123"
}

4.静态资源访问

  • 使用IDEA创建Spring Boot项目,会默认创建出classpath:/static/目录,静态资源一般放在这个目录下即可。
  • 如果默认的静态资源过滤策略不能满足开发需求,也可以自定义静态资源过滤策略。
  • 在application.properties中直接定义过滤规则和静态资源位置:
1
2
3
4
5
6
spring:
mvc:
static-path-pattern: /static/**
web:
resources:
static-locations: classpath:/static/
  • 过滤规则为/static/**,静态资源位置为classpath:/static/

理解:一般用不到,springboot已经帮我们做过了,静态资源存放到static里面就可以了。除非我们有特定的需求。

5.文件上传原理

  • 表单的enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。
  • 当表单的enctype=”application/x-www-form-urlencoded”(默认)时,form表单中的数据格式为:key=value&key=value
  • 当表单的**enctype=”multipart/form-data”**时,其传输数据形式如下

image-20220824155902701

理解:浏览器暂时接收不了,但是我们可以用第三方工具,比如enctype=”multipart/form-data”

6.SpirngBoot实现文件上传功能

  • Spring Boot工程嵌入的tomcat限制了请求的文件大小,每个文件的配置最大为1Mb,单次请求的文件的总数不能大于10Mb。
  • 要更改这个默认值需要在配置文件(如application.properties)中加入两个配置

image-20220824163502456

理解:如果文件太大可以加这个配置。不然会有限制。

7.SpirngBoot实现文件上传功能

  • 当表单的enctype=”multipart/form-data”时,可以使用MultipartFile 获取上传的文件数据,再通过transferTo方法将其写入到磁盘中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@PostMapping("/upload")
public String up(String nickname, MultipartFile photo, HttpServletRequest request) throws IOException {
System.out.println(nickname);
//获取图片的原始名称
System.out.println(photo.getOriginalFilename());
//获取文件类型
System.out.println(photo.getContentType());
System.out.println(System.getProperty("user.dir"));
//HttpServletRequest request代表的是网络请求,一个request对象,通过这个可以获取上下文对象和路径。
String path = request.getServletContext().getRealPath("/upload");
System.out.println(path);
saveFile(photo,path);
return "上传成功";

//saveFile
private void saveFile(MultipartFile photo, String path) throws IOException {
//判断存储的目录是否存在,如果不存在则创建
File dir = new File(path);
if (!dir.exists()){
//创建目录
dir.mkdir();
}
//利用transferTo存储到目录中
File file = new File(path + photo.getOriginalFilename());
photo.transferTo(file);
}
}

8.拦截器

  • 拦截器在Web系统中非常常见,对于某些全局统一的操作,我们可以把它提取到拦截器中实现。总结起来,拦截器大致有以下几种使用场景:
  • 权限检查:如登录检测,进入处理程序检测是否登录,如果没有,则直接返回登录页面。
  • 性能监控:有时系统在某段时间莫名其妙很慢,可以通过拦截器在进入处理程序之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间
  • 通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有提取Locale、Theme信息等,只要是多个处理程序都需要的,即可使用拦截器实现。

理解:拦截请求到,比如后台管理要登录才能进,如果直接进入那肯定是有问题的。

  • Spring Boot定义了HandlerInterceptor接口来实现自定义拦截器的功能
  • HandlerInterceptor接口定义了preHandle、postHandle、afterCompletion三种方法,通过重写这三种方法实现请求前、请求后等操作

image-20220824171809835

preHandle一般用的最多,首先我们要定义一个类,但是一般我们都是新建interceptor包,然后新建一个类以Interceptor结尾,例如:LoginInterceptor

1
2
3
4
5
6
7
8
9
10
11
12
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler) throws Exception{
if (条件){
System.out.println("通过");
return true;
}else {
System.out.println("不通过");
return flase;
}
}
}

8.1拦截器注册

拦截器想要使用必须先要注册,这个注册我们在java类里就可以完成了。做一个配置类(config包下)。设置拦截哪些路径。如果不设置路径会拦截所有的请求。

  • addPathPatterns方法定义拦截的地址
  • excludePathPatterns定义排除某些地址不被拦截
  • 添加的一个拦截器没有addPathPattern任何一个url则默认拦截所有请求
  • 如果没有excludePathPatterns任何一个请求,则默认不放过任何一个请求。
1
2
3
4
5
6
7
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(Interceptors registry){
registry.addInterceptors(new LoginInterceptor()).addPathPatterns("/user/**");
}
}