Spring Web MVC

发布于:2024-04-24 ⋅ 阅读:(20) ⋅ 点赞:(0)

目录

1 什么是Spring Web MVC

1.1MVC定义

1.2 什么是Spring MVC?

2 学习Spring MVC

2.1 项目准备

2.2 建立连接 

2.2.1 @RequestMapping 注解

2.2.2 @RequestMapping 使用

2.2.3 @RequestMapping是GET还POST请求? 

2.3 请求 

2.3.1 传递单个参数

2.3.2 传递多个参数

2.3.3 传递对象

2.3.4 后端参数重命名

2.3.5 传递数组

2.4.6 传递集合 

2.4.7 传递JSON数据

2.4.8 获取URL中参数@PathVariable

2.4.9 上传文件

2.4.10 获取Cookie/Session

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路由映射,也就是浏览器连接程序的作用

@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既可以修饰类,也可以修饰方法,当修饰类和方法时,访问的地址时类路径+方法路径

@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中直接用方法的参数就可以了

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

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

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

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

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

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

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

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

2.3.2 传递多个参数

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

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

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

2.3.3 传递对象

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

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

2.3.4 后端参数重命名

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

@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来避免不传递时报错。

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

2.3.5 传递数组

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

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

2.4.6 传递集合 

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

@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:请求正文,这个注解的作用在请求正文的数据绑定,请求参数必须写在正文中

@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:路径变量

@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 上传文件

@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

@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
 

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

 

获取Session 

Session需要先存储,才能获取

Session存储

@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获取 

    @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

    @RequestMapping("/getSession")
    public String getSession(@SessionAttribute String username) {
        return "username:" + username;
    }
    @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

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

简洁的获取header

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

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