Spring Web MVC

目录

[1 什么是Spring Web MVC](#1 什么是Spring Web MVC)

1.1MVC定义

[1.2 什么是Spring MVC?](#1.2 什么是Spring MVC?)

[2 学习Spring MVC](#2 学习Spring MVC)

[2.1 项目准备](#2.1 项目准备)

[2.2 建立连接](#2.2 建立连接)

[2.2.1 @RequestMapping 注解](#2.2.1 @RequestMapping 注解)

[2.2.2 @RequestMapping 使用](#2.2.2 @RequestMapping 使用)

[2.2.3 @RequestMapping是GET还POST请求?](#2.2.3 @RequestMapping是GET还POST请求?)

[2.3 请求](#2.3 请求)

[2.3.1 传递单个参数](#2.3.1 传递单个参数)

[2.3.2 传递多个参数](#2.3.2 传递多个参数)

[2.3.3 传递对象](#2.3.3 传递对象)

[2.3.4 后端参数重命名](#2.3.4 后端参数重命名)

[2.3.5 传递数组](#2.3.5 传递数组)

[2.4.6 传递集合](#2.4.6 传递集合)

[2.4.7 传递JSON数据](#2.4.7 传递JSON数据)

[2.4.8 获取URL中参数@PathVariable](#2.4.8 获取URL中参数@PathVariable)

[2.4.9 上传文件](#2.4.9 上传文件)

[2.4.10 获取Cookie/Session](#2.4.10 获取Cookie/Session)

[2.4.11 获取Header](#2.4.11 获取Header)

前言~~

大家好,有一周时间没有写博客了,最近由于在做实验,每天都很忙,接下来我会抽空来写博客,希望大家给我提出建议,我会认真的接受。

经过一直学习,现在也是学到了Spring,我非常高兴,前面也是认真打好了基础,现在Spring的学习路程也是非常顺利。😊😊😊


1 什么是Spring Web MVC

我们可以简单的理解为,Spring Web MVC就是一个框架,它是基于Servlet API构建的原始web框架,它一开始就包含在Spring框架中,它通常被称为"Spring MVC"。

下面我们简称之为:Spring MVC

在理解什么是Spring MVC之前,我们要清楚什么是MVC?

1.1MVC定义

MVC是Model View Controller的缩写,它是软件工程中的一种软件架构设计模式,它把软件系统分为模型、试图和控制器三个基本部分。

**View(视图)**在应用程序中专门用来与浏览器进行交互,展示数据

**Model(模型)**应用程序的主体部分,用来处理程序中数据逻辑的部分

**Controller(控制器)**用来决定视图发来的请求,需要用一个模型来处理以及处理完后需要跳转到哪一个视图,即用来连接视图和模型

大家是不是觉得很抽象,那换一个解释

视图就是服务员,负责接待顾客,帮助顾客点餐,给顾客端饭

控制器 就是前厅,根据用户点餐的情况来选择给哪个后厨下达命令

模型 就是后厨,根据前厅的要求完成客户的用餐情况


HR 就是视图负责接待候选人,并告知候选人的面试结果

不同 的部分就是控制器HR根据候选人来选择对应的部门来进行面试

面试官 就是模型来处理候选人的面试

现在听起来是不是就通常多了**❤️❤️**

1.2 什么是Spring MVC?

MVC是一种架构设计模型,也是一种思想,而Spring MVC是对MVC思想的集体实现,除此之外,Spring MVC还是一个Web框架。

总的来说Spring MVC是一个实现了MVC 模式的Web 框架,因此,Spring MVC主要关注两个点:1)MVC 2)Web框架

其实在我们创建Spring Boot 项目的时候,我们勾选的Spring Web 框架其实就是Spring MVC框架

为什么创建的Spring Boot项目就成了spring MVC项目了?它们之间的关系是什么。其实Spring Boot只是实现Spring MVC的其中一种方式而已,Spring Boot添加Spring Web MVC框架,来实现Web功能。

2 学习Spring MVC

前面啰嗦了很多,现在终于到了Spring MVC的学习了,废话不多说,直接开始😊😊😊

学习Spring MVC重点学习如何通过浏览器和用户程序进行交互。

主要分以下三个方面:

1 建立连接:将浏览器和Java程序连接起来,访问一个地址能够调用到我们的Spring程序。

2 请求:用户请求的时候会带一些参数,在程序中需要获取到参数。

3 响应:执行到了业务逻辑之后,要把程序执行的结果返回给用户,也就是响应。

通俗一点:

建立连接:去柜台 请求:带着银行卡,身份证去存款 响应:银行返回一张存折

对于Spring MVC来说,掌握以上3个功能就相当于掌握了Spring MVC

2.1 项目准备

创建Spring Boot项目,勾选Spring Web就相当于创建了Spring MVC项目

2.2 建立连接

在Spring MVC中使用@RequestMapping来实现URL路由映射,也就是浏览器连接程序的作用

java 复制代码
@RestController
public class SpringBoot {
    @RequestMapping("/learn")
    public String learn() {
        return "learn,SpringBoot";
    }
}

我们使用127.0.0.1:8080/learn这个路径名来访问

2.2.1 @RequestMapping 注解

@RequestMapping是Spring Web MVC应用程序中最常被用到的注解之一,它是用来注册接口的路由映射,当我们通过路径**/learn**访问时,就会调用learn这个方法的代码。

2.2.2 @RequestMapping 使用

@RequestMapping既可以修饰类,也可以修饰方法,当修饰类和方法时,访问的地址时类路径+方法路径

java 复制代码
@RequestMapping("/use")
@RestController
public class SpringBoot {
    @RequestMapping("/learn")
    public String learn() {
        return "learn,SpringBoot";
    }
}

@RequestMapping的URL路径也可以是多层路径,最终访问时,依然是类路径+方法路径

2.2.3 @RequestMapping是GET还POST请求?

我们通过postman来发送请求看一下

从结果上看 @RequestMapping既支持GET请求,也支持POST请求,同时,也支持其他请求方式

2.3 请求

在访问不同的路径时,就是发送不同的请求,在发送请求时,可能会带一些参数,所以学习Spring的请求,主要时学习如何传递参数到后端以及后端如何让接收参数。

传递参数,主要使用浏览器和postman来模拟

2.3.1 传递单个参数

接收单个参数,在Spring MVC中直接用方法的参数就可以了

java 复制代码
@RequestMapping("/use")
@RestController
public class SpringBoot {
    @RequestMapping("/m1")
    public String m1(String name) {
        return "接收到的参数:" + name;
    }
}

如果参数不一致,是获取不到参数的

在使用基本类型接收参数时,参数必须传(除了boolean类型),因此建议使用包装类型

java 复制代码
@RequestMapping("/use")
@RestController
public class SpringBoot {
    @RequestMapping("/m2")
    public String m2(int age) {
        return "接收到的参数:" + age;
    }
}

当出现了500代表服务器出现了问题,我们观察一下控制台有没有错误日志

因此在接收参数的时候建议使用包装类型

当我们传入参数的类型不匹配时也会出现错误

总结:对于包装类型,如果不传对应的参数,Spring接收到的数据为null,所以对于参数为空的情况,建议使用包装类型

2.3.2 传递多个参数

和接收参数一样,直接使用方法的参数接收即可

java 复制代码
@RequestMapping("/use")
@RestController
public class SpringBoot {
    @RequestMapping("/m3")
    public String m3(String name,Integer age) {
        return "接收到的参数:" + name + "+" +age;
    }
}

只有参数匹配,顺序时没有影响的

2.3.3 传递对象

如果参数比较多时,该方法生命就需要很多形参,因此我们对这些参数进行封装,直接传入一个对象

java 复制代码
@RequestMapping("/use")
@RestController
public class SpringBoot {
    @RequestMapping("/m4")
    public String m4(Person person) {
        return "接收到的参数:" + person.toString();
    }
}

2.3.4 后端参数重命名

在某些情况下,前端传递的参数key和我们后端接收到的key不一致,例如前端传了一个name给后端,而后端使用username字段来接收,如果出现这种情况,就需要使用@RequestParam来重命名前后端的数据值

java 复制代码
@RequestMapping("/use")
@RestController
public class SpringBoot {
    @RequestMapping("/m5")
    public String m5(@RequestParam("name") String username) {
        return "接收到的参数:" + username;
    }
}

可以看到Spring可以正确的把浏览器传递的参数name绑定到后端参数username上了

因此得出结论:

使用@RequestParam进行参数重命名时,请求参数只能和@RequestParam声明一致才能进行绑定参数和赋值

使用@RequestParam进行参数重命名时,参数就变成了必传参数

非必传参数

如果前端的参数是一个非必传参数,就需要设置@RequestParam中的required=false来避免不传递时报错。

java 复制代码
@RequestMapping("/use")
@RestController
public class SpringBoot {
    @RequestMapping("/m5")
    public String m5(@RequestParam(value = "name",required = false) String username) {
        return "接收到的参数:" + username;
    }
}

2.3.5 传递数组

当我们请求中,同一个参数有多个时,浏览器就会帮我们给封装成一个数组

java 复制代码
@RequestMapping("/use")
@RestController
public class SpringBoot {
    @RequestMapping("/m6")
    public String m6(String[] arr) {
        return "接收到的参数:" + Arrays.toString(arr);
    }
}

2.4.6 传递集合

集合参数:和数组类似,同一个请求参数名有多个,且需要使用@RequestParam绑定参数关系

java 复制代码
@RequestMapping("/use")
@RestController
public class SpringBoot {
    @RequestMapping("/m7")
    public String m7(@RequestParam List<String> list) {
        return "list:" + list + ",长度:" + list.size();
    }
}

2.4.7 传递JSON数据

在接收json对象时,需要使用@RequestBody注解

RequestBody:请求正文,这个注解的作用在请求正文的数据绑定,请求参数必须写在正文中

java 复制代码
@RequestMapping("/use")
@RestController
public class SpringBoot {
    @RequestMapping("/m8")
    public String m8(@RequestBody Person person) {
        return person.toString();
    }
}

通过抓包我们看一下请求的类型

如果去掉@RequestBody,此时传过来的值为空,表示后端未能给person对象赋值

2.4.8 获取URL中参数@PathVariable

path variable:路径变量

java 复制代码
@RequestMapping("/use")
@RestController
public class SpringBoot {
    @RequestMapping("/m9/{id}/{name}")
    public String m9(@PathVariable Integer id,@PathVariable("name") String username) {
        return "userId:" + id + ",username:" + username;
    }
}

如果方法法参数名称和需要绑定的URL中的变量名称⼀致时,不用给@PathVariable的属性赋
值,如上述例子中的id变量

如果方法法参数名称和需要绑定的URL中的变量名称不⼀致时,需要@PathVariable的属性value赋值,如上述例子中的userName变量

2.4.9 上传文件

java 复制代码
@RequestMapping("/use")
@RestController
public class SpringBoot {
    @RequestMapping("/m10")
    public String m10(@RequestPart MultipartFile file) throws IOException {
        System.out.println(file.getOriginalFilename());
        file.transferTo(new File("E:/photo/" + file.getOriginalFilename()));
        return "success";
    }
}

2.4.10 获取Cookie/Session

传统的获取Cookie

java 复制代码
@RequestMapping("/use")
@RestController
public class SpringBoot {
    @RequestMapping("/m11")
    public String m11(HttpServletRequest request, HttpServletResponse response) {
        //获取所有的cookie
        Cookie[] cookies = request.getCookies();
        StringBuilder stringBuilder = new StringBuilder();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                stringBuilder.append(cookie.getName() + ":" + cookie.getValue());
            }
        }
        return "cookie信息:" + stringBuilder;
    }
}

因此此时没有设置cookie的值,所以为空,现在我们设置一下cookie的值

简洁的获取Cookie

java 复制代码
@RestController
public class SpringBoot {
    @RequestMapping("/getCookie")
    public String getCookie(@CookieValue String zhangsan){
        return "cookie信息:" + zhangsan;
    }
}

获取Session

Session需要先存储,才能获取

Session存储

javascript 复制代码
@RequestMapping("/use")
@RestController
public class SpringBoot {
    @RequestMapping("/setSession")
    public String setSession(HttpServletRequest request){
        HttpSession session = request.getSession();
        session.setAttribute("username","Spring");
        return "session存储成功";
    }
}

可以看到在HTTP响应中,通过Set-Cookie告知客户端,把Session存储在Cookie中

Session获取

java 复制代码
    @RequestMapping("/getSession")
    public String getSession(HttpServletRequest request) {
        HttpSession session = request.getSession(false);
        if (session != null) {
            String username = (String) session.getAttribute("username");
            return "登录用户:" + username;
        }
        return "session为空";
    }

在HTTP请求中,把SessionId通过Cookie传递给了服务器

简洁的获取Session

java 复制代码
    @RequestMapping("/getSession")
    public String getSession(@SessionAttribute String username) {
        return "username:" + username;
    }
java 复制代码
    @RequestMapping("/getSession")
    public String getSession(@SessionAttribute(value = "username",required = false) String username) {
        return "username:" + username;
    }

Cookie和Session的区别

1.Cookie是客户端保存用户信息的一种机制,Session是服务器保存用户信息的一种机制

2.Cookie和Session之间是通过SessionId关联起来的

3.Cookie和Session经常会在一起配合使用,但是不是必须配合

2.4.11 获取Header

传统的获取header

java 复制代码
@RequestMapping("/use")
@RestController
public class SpringBoot {
    @RequestMapping("/m12")
    public String m12(HttpServletRequest request) {
        String userAgent = request.getHeader("user-Agent");
        return "userAgent:" + userAgent;
    }
}

简洁的获取header

java 复制代码
@RequestMapping("/use")
@RestController
public class SpringBoot {
    @RequestMapping("/m12")
    public String m12(@RequestHeader("User-Agent") String userAgent) {
        return "userAgent:" + userAgent;
    }
}

总结:以上就是所有请求的内容了,下篇博客就是响应的内容了

相关推荐
曾令胜5 小时前
excel导出使用arthas动态追踪方法调用耗时后性能优化的过程
spring·性能优化·excel
.格子衫.5 小时前
Spring Boot 原理篇
java·spring boot·后端
多云几多5 小时前
Yudao单体项目 springboot Admin安全验证开启
java·spring boot·spring·springbootadmin
摇滚侠7 小时前
Spring Boot 3零基础教程,Spring Intializer,笔记05
spring boot·笔记·spring
Jabes.yang8 小时前
Java求职面试实战:从Spring Boot到微服务架构的技术探讨
java·数据库·spring boot·微服务·面试·消息队列·互联网大厂
聪明的笨猪猪8 小时前
Java Redis “高可用 — 主从复制”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
兮动人8 小时前
Spring Bean耗时分析工具
java·后端·spring·bean耗时分析工具
MESSIR228 小时前
Spring IOC(控制反转)中常用注解
java·spring
摇滚侠8 小时前
Spring Boot 3零基础教程,Demo小结,笔记04
java·spring boot·笔记
华洛8 小时前
公开一个AI产品的商业逻辑与设计方案——AI带来的涂色卡自由
前端·后端·产品