Spring MVC(上)

博主主页: 码农派大星.

数据结构专栏 :Java数据结构

数据库专栏: MySQL数据库

JavaEE专栏: JavaEE

关注博主带你了解更多 JavaEE知识

目录

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

[1.1 MVC定义](#1.1 MVC定义)

[1.2 Spring MVC](#1.2 Spring MVC)

[2.Spring MVC实现](#2.Spring MVC实现)

2.1建⽴连接

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

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

2.1.3指定GET/POST⽅法类型

[2.2 请求](#2.2 请求)

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

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

[2.2.3 传递一个对象](#2.2.3 传递一个对象)

[2.2.4 参数重命名](#2.2.4 参数重命名)

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

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

​编辑

[2.2.7 传递json数据](#2.2.7 传递json数据)

[2.2.8 获取url中的参数](#2.2.8 获取url中的参数)

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

[2.3 Cookie与Session](#2.3 Cookie与Session)

[2.3.1 Cookie](#2.3.1 Cookie)

[2.3.2 Session](#2.3.2 Session)

[2.3.4 Cookie 和 Session 的区别](#2.3.4 Cookie 和 Session 的区别)

[2.3.5 获取Cookie](#2.3.5 获取Cookie)

[2.3.6 获取Session](#2.3.6 获取Session)

[​编辑 2.3.7 获取Header](#编辑 2.3.7 获取Header)


1.什么是 Spring Web MVC

Spring Web MVC 是基于Servlet API构建的原始Web框架,从⼀开始就包含在Spring框架中。它的 正式名称"Spring Web MVC"来⾃其源模块的名称(Spring-webmvc)但它通常被称为"Spring MVC".

通俗来讲Spring Web MVC 是⼀个 Web 框架,简称Spring MVC.

1.1 MVC定义

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

View(视图) 指在应⽤程序中专⻔⽤来与浏览器进⾏交互,展⽰数据的资源.

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

Controller(控制器)可以理解为⼀个分发器,⽤来决定对于视图发来的请求,需要⽤哪⼀个模型 来处理,以及处理完后需要跳回到哪⼀个视图。即⽤来连接视图和模型
⽐如去饭店吃饭 客⼾进店之后, 服务员来接待客⼾点餐, 客⼾点完餐之后, 把客⼾菜单交给前厅, 前厅根据客⼾菜单 给后厨下达命令. 后厨负责做饭, 做完之后, 再根据菜单告诉服务员, 这是X号餐桌客⼈的饭.

在这个过程中 服务员就是View(视图), 负责接待客⼾, 帮助客⼾点餐, 以及给顾客端饭 前厅就是Controller(控制器), 根据⽤⼾的点餐情况, 来选择给哪个后厨下达命令. 后厨就是Model(模型), 根据前厅的要求来完成客⼾的⽤餐需求

1.2 Spring MVC

Spring MVC 是对 MVC 思想的具体实现.Spring MVC就是⼀个Web框架

SpringBoot是2014年发布的, Spring 是2004年发布的, 在2014年发布之前, 就不能⽤Spring实现MVC 架构吗? 显然不是

我们之前也学过Spring Boot ,Spring Boot就只是实现Spring MVC的其中⼀种⽅式⽽已. Spring Boot 可以添加很多依赖, 借助这些依赖实现不同的功能. Spring Boot 通过添加Spring Web MVC框架, 来实现web功能

2.Spring MVC实现

⽤⼾在浏览器中输⼊了 url 之后,我们的 Spring MVC 项⽬就可以感知到⽤⼾ 的请求, 并给予响应.

Spring MVC也就是学习如何通过浏览器和⽤⼾程序进⾏交互

主要分以下三个⽅⾯:

  1. 建⽴连接:将⽤⼾(浏览器)和 Java 程序连接起来,也就是访问⼀个地址能够调⽤到我们的 Spring 程序。

  2. 请求: ⽤⼾请求的时候会带⼀些参数,在程序中要想办法获取到参数, 所以请求这块主要是 获取参数 的功能.

  3. 响应: 执⾏了业务逻辑之后,要把程序执⾏的结果返回给⽤⼾, 也就是响应

2.1建⽴连接

2.1.1 @RequestMapping 注解

@RequestMapping 是 Spring Web MVC 应⽤程序中最常被⽤到的注解之⼀,它是⽤来注册接⼝的 路由映射的.它既可以修饰类也可以修饰方法,当修饰类和方法的时候访问路径是:类路径+方法路径

@RestController
@RequestMapping("/demo")
public class HelloController {

    @RequestMapping("/sayhi")
    public String hello(){
        return " hello!!";
    }

}

2.1.2 @RequestMapping 是 GET 还是 POST 请求?

GET请求: 浏览器发送的请求类型都是get, 通过以上案例, 可以看出来 @RequestMapping ⽀持get请求

**POST 请求:**我们创建test.html代码:

从运⾏结果可以看出: @RequestMapping 既⽀持Get请求, ⼜⽀持Post请求. 同理, 也⽀持其他的请 求⽅式.

2.1.3指定GET/POST⽅法类型

分别都是有两种方法的请求方式:

指定GET请求方法:

@RequestMapping(value = "v1",method = RequestMethod.GET)
    public String v1(){
        return "hello v1";
    }
    @GetMapping("/v2")
    public String v2(){
        return "hello v2";
    }

指定POST请求方法:

 @RequestMapping(value = "v3",method = RequestMethod.POST)
    public String v3(){
        return "hello v3";
    }

    @PostMapping("/v4")
    public String v4(){
        return "hello v4";
    }

2.2 请求

2.2.1 传递单个参数

@RequestMapping("/param")
@RestController
public class ParamController {

    @RequestMapping("/p1")
    public String p1(String name){
        return "接收到参数,name "+ name;
    }

2.2.2 传递多个参数

 @RequestMapping("p4")
    public String p4(String name,Integer age){
        return " 接收到年龄: age " + age+" 接收到参数:name "+ name;
    }

@RequestMapping("/p41")
    public String p41(HttpServletRequest request){
        String name = request.getParameter("name");
        Integer age = Integer.valueOf(request.getParameter("age"));

        return "接收到参数,age:" + age + ", name: "+ name;
    }

2.2.3 传递一个对象

先建立一个类:

public class User {

    private String name;
    private Integer age;
    private String gender;


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                '}';
    }
}

  @RequestMapping("/p6")
    public String p6(User user){
        return "user:" + user;
    }

2.2.4 参数重命名

复制代码
@RequestParam 为参数绑定,默认为必传参数,加上false为非必传参数.
 @RequestMapping("/p7")
    public String p7(@RequestParam(value = "username", required = false) String name){
        return " 接收到参数 name :" + name;
    }

2.2.5 传递数组

@RequestMapping("/p8")
    public String p8(String[] arr){
        return " 接收到参数 arr " + List.of(arr);
    }

2.2.6 传递集合

传递集合参数:和数组类似, 同⼀个请求参数名有为多个, 但是需要使⽤ @RequestParam 绑定参数关系

 @RequestMapping("/p9")
    public String p9(@RequestParam List<String> list){
        return " 接收到参数 list :" + list;
    }

2.2.7 传递json数据

JSON就是⼀种数据格式, 有⾃⼰的格式和语法,是⼀种轻量级的数据交互格式

接收JSON对象, 需要使⽤ @RequestBody 注解

RequestBody: 请求正⽂,意思是这个注解作⽤在请求正⽂的数据绑定,请求参数必须在写在请求正 ⽂中

@RequestMapping("/p10")
    public String p10(@RequestBody User user){
        return  " "+user;
    }

2.2.8 获取url中的参数

@PathVariable 这个注解主要作⽤在请求URL路径上的数据绑定

@RequestMapping("/article/{articleId}")
    public String p11(@PathVariable("articleId") String articleId){
        return "articleId:   " + articleId;
    }
@RequestMapping("/article/{articleId}/{name}")
    public String p12(@PathVariable("articleId") String id,@PathVariable String name){
        return "articleId: " + id + "name :" + name;
    }

2.2.9 上传文件

 @RequestMapping("/p13")
    public String p13(MultipartFile file){
        System.out.println(file.getOriginalFilename());
        return  " 文件名称: " + file.getOriginalFilename();
    }

@RequestPart

@RequestPart("fileName") 注解用于映射名为 "file" 的表单数据部分到 MultipartFile 类型的参数 file

@RequestMapping("/p13")
    public String p13(@RequestPart("fileName")  MultipartFile file){
        System.out.println(file.getOriginalFilename());
        return  " 文件名称: " + file.getOriginalFilename();
    }

2.3 Cookie与Session

HTTP协议本身就是无状态协议, 默认情况下HTTP协议的客户端和服务器之间的一次通信与下一次通信没有任何的联系,但实际中,我们在登录一个网页后,下一次在访问时就是默认登录状态,为什么浏览器会记得我们之前的信息呢,那就是Cookie的作用了, Cookie中会存在令牌,这个令牌(携带 Session ID )会对应着我们之前访问的我们客户端的信息,记住令牌对应着我们客户端的信息,不是包含客户端信息,至于令牌对应的信息,那就是Session的事情了

Cookie 就是服务器发送到用户浏览器并保存在本地的 小块数据 ( 包含有关用户的信息,登录状态、登陆时间**),用于存储有关用户会话的信息,以便在用户浏览网站时跨多个页面请求或在后续的会话中识别用户**

2.3.2 Session

Session就是会话,会话就是⼀个客⼾与服务器之间的不中断的请求响应. 对客⼾的每个请求,服务器能够识 别出请求来⾃于同⼀个客⼾. 当⼀个未知的客⼾向Web应⽤程序发送第⼀个请求时就开始了⼀个会话. 当客⼾明确结束会话或服务器在⼀个时限内没有接受到客⼾的任何请求时,会话就结束了,但是服务器同⼀时刻收到的请求是很多的. 服务器需要清楚的区分每个请求是属于哪个⽤⼾, 也就是属于哪 个会话, 就需要在服务器这边记录每个会话以及与⽤⼾的信息的对应关系,Session 就可以用来识别和区分不同的用户,每个用户都有一个唯一的 Session ID,服务器通过这个 ID 来关联用户的会话。

Session的本身就是⼀个 "哈希表", 存储了⼀些键值对结构. Key 就是SessionID, Value 就是⽤⼾信息(用户身份信息,用户偏好设置,表单数据,认证令牌,用户会话状态,缓存数据,临时文件路径等)

1.当⽤⼾登陆的时候, 服务器就在 Session 中新增⼀个新记录, 并把 sessionId返回给客⼾端. (通过 HTTP 响应中的 Set-Cookie 字段返回).

  1. 客⼾端后续再给服务器发送请求的时候, 需要在请求中带上 sessionId. (通过 HTTP 请求中的 Cookie 字段带上).

  2. 服务器收到请求之后, 根据请求中的 sessionId在 Session 信息中获取到对应的⽤⼾信息, 再进⾏后 续操作.找不到则重新创建Session, 并把SessionID返回

Session 默认是保存在内存中的. 如果重启服务器则 Session 数据就会丢失

Cookie 是客⼾端保存⽤⼾信息的⼀种机制,通常作为键值对保存。

Session 是服务器端保存⽤⼾信息的⼀种机制,通过 Session ID 来索引和检索。

Cookie 和 Session之间主要是通过 SessionId 关联起来的, SessionId 是 Cookie 和 Session 之间的桥梁

Cookie 和 Session 经常会在⼀起配合使⽤. 但是不是必须配合.

Cookie:存储在客户端,更容易受到攻击,因此敏感,重要信息不存储在 Cookie 中。

Session:存储在服务器端,更安全,但需要确保 Session ID 的安全性

Cookie :可以设置为持久存储,即使关闭浏览器也能保持,Session:通常是临时储存的,用户会话结束或超时后就会失效

Cookie 来保存⼀些数据在客⼾端. 这些数据不⼀定是⽤⼾⾝份信息, 也不⼀定是 SessionId

Session 中的 sessionId 也不需要⾮得通过 Cookie/Set-Cookie 传递, ⽐如通过URL传递

2.3.5 获取Cookie

Spring MVC是基于 Servlet API 构建的原始 Web 框架, 也是在Servlet的基础上实现的

HttpServletRequest , HttpServletResponse 是Servlet提供的两个类, 是Spring MVC⽅法的内置对象. 需要时直接在⽅法中添加声明即可.

HttpServletRequest 对象代表客⼾端的请求, 当客⼾端通过HTTP协议访问服务器时,HTTP请 求头中的所有信息都封装在这个对象中,通过这个对象提供的⽅法,可以获得客⼾端请求的所有信 息. HttpServletResponse 对象代表服务器的响应. HTTP响应的信息都在这个对象中, ⽐如向客⼾ 端发送的数据, 响应头, 状态码等. 通过这个对象提供的⽅法, 可以获得服务器响应的所有内容 Spring MVC在这两个对象的基础上进⾏了封装, 给我们提供更加简单的使⽤⽅法

2.3.6 获取Session

 @RequestMapping("/setSession")
    public String setSession(HttpServletRequest request){
        //获取session对象
        HttpSession session = request.getSession();
        session.setAttribute("username", "cxk");
        session.setAttribute("age",15);
        return "设置session成功";
    }

    @RequestMapping("/getSession")
    public String getSession(HttpServletRequest request){

        HttpSession session = request.getSession();

        String username = (String) session.getAttribute("username");

        return "username:" + username;

    }
 @RequestMapping("/getSession2")
    public String getSession2(HttpSession session){
        String username = ( String) session.getAttribute("username");
        System.out.println(session.getAttribute("age"));
        return "username:" + username;
    }

    @RequestMapping("/getSession3")
    public String getSession3(@SessionAttribute("username") String username){
        return "username:" + username;
    }

2.3.7 获取Header

 @RequestMapping("/getHeader")
    public  String getHeader(HttpServletRequest request){
        String userAgent = request.getHeader("User-Agent");
        return " UserAgent" + userAgent;
    }


    @RequestMapping("/getHeader2")
    public String header(@RequestHeader("User-Agent") String userAgent) {
        return "userAgent:"+userAgent;
    }
相关推荐
suweijie7683 小时前
SpringCloudAlibaba | Sentinel从基础到进阶
java·大数据·sentinel
公贵买其鹿4 小时前
List深拷贝后,数据还是被串改
java
xlsw_7 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹8 小时前
基于java的改良版超级玛丽小游戏
java
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭8 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫9 小时前
泛型(2)
java
超爱吃士力架9 小时前
邀请逻辑
java·linux·后端
南宫生9 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石9 小时前
12/21java基础
java
李小白669 小时前
Spring MVC(上)
java·spring·mvc