当前位置:   article > 正文

Spring MVC上篇_getmapping接收对象

getmapping接收对象

 ~

目录

1.什么是Spring MVC

2.为什么要学Spring MVC

3.Spring MVC的三大核心

3.1Spring MVC的创建与连接

3.1.1创建一个Spring MVC项目

3.1.2@RequestMapping注解

3.1.3@GetMapping注解

3.1.4@PostMapping注解

4.获取参数

4.1传递单个参数

4.2传递多个参数

4.3传递对象

4.4后端参数重命名

4.5获取Json对象

4.6获取URL中的参数

4.7上传文件 


1.什么是Spring MVC

①官网定义译为中文:

Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从一开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来自其源模块的名称(Spring-webmvc),但它通常被称为“Spring MVC” 。
我们可以由上述定义,得到两个点:
a.Spring MVC是一个web框架
b.Spring MVC是基于Servlet API来进行构建的
②什么是MVC?
MVC:Model View Controller翻译中文就是“模型,视图,控制器”,它是一种设计模式,这种设计模式将软件(项目)分为三部分:模型,视图和控制器。
(需要注意的是视图一般分为服务器视图和客户端视图,而在这里我们所说的视图指的是服务器视图)

③MVC和Spring MVC的关系:

MVC是一种设计思想,而Spring MVC更可以说是它的一种实现(一种具体的实现框架)

④用自己的理解来谈谈Spring MVC:

Spring MVC是一个基于MVC设计模式和Servlet API实现的Web项目,同时Spring MVC又是Spring框架中的一个Web模块,它是随着Spring诞生而存在的一个框架 

2.为什么要学Spring MVC

之所以要学习 Spring MVC 是因为它是⼀切项目的基础,我们以后创建的所有 Spring、
Spring Boot 项目基本都是基于 Spring MVC 的。

3.Spring MVC的三大核心

换句话说可以说是我们需要掌握的方法:

①实现用户和程序的映射(用户在URL输入地址之后,能够在程序里找到相应的方法)

②服务器端要得到用户的请求参数

③服务器端要将结果返回给用户(前端)

下面将依次对这几个板块进行介绍

3.1Spring MVC的创建与连接

3.1.1创建一个Spring MVC项目

创建一个Spring MVC项目实质上就是创建一个Spring Boot项目,在配置中选取引入MVC即可。图解步骤如下:(前面Spring Boot创建之前有写过,这里就不作重复了)

实现用户和程序的映射主要有以下三种方法

3.1.2@RequestMapping注解

①用法:

@RequestMapping(“/xxx”)

既可以用于类上,也可以放于方法上,访问地址就是类地址+方法地址

②示例:

a.我们随意创建一个页面来访问:

  1. package com.example.demo;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.ResponseBody;
  5. @Controller
  6. public class UserController1 {
  7. @ResponseBody//返回一个非静态页面
  8. @RequestMapping("/hello")
  9. public String sayhi(){
  10. System.out.println("hello spring mvc");
  11. return "hello spring mvc";
  12. }
  13. }

结果如下:

 b.我们能够知道直接通过url访问的,那么必然是get请求,我们来抓一下包,看看自己的判断是否是正确的:

我们可以发现确实是get请求,那么要是我们用post请求来完成是否可以呢? 

我们用postman来进行测试一下:

我们就发现默认情况下,@RequestMapping既可以支持get请求,又可以支持post请求 。但是,我们仍然可以对参数进行拓展

c.@RequestMapping参数拓展:(让其只支持一种访问方式,我们这里以post为例)

  1. package com.example.demo;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RequestMethod;
  5. import org.springframework.web.bind.annotation.ResponseBody;
  6. @Controller
  7. public class UserController1 {
  8. @ResponseBody
  9. @RequestMapping(method = RequestMethod.POST,value = "/hello")
  10. public String sayhi(){
  11. System.out.println("hello spring mvc");
  12. return "hello spring mvc";
  13. }
  14. }

我们现在可以看到参数里已经指定了method为post,这个时候我们显然是不能够通过URL来访问的,因此,我们用postman来测试现在它支持的形式:

(1)当为post的时候,如预期,没有问题

这个时候我们抓包fiddler也是得到同样的情况:

 (2)当为GET的情况:

我们会发现这样就出现了问题。那么也就是这种指定方式是只能支持指定的一种 。

当然,指定为某种,我们也可以采用更简单的如下方式

3.1.3@GetMapping注解

①用法:

@GetMapping(“/xxx”)

②示例:

  1. package com.example.demo;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.GetMapping;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. import org.springframework.web.bind.annotation.RequestMethod;
  6. import org.springframework.web.bind.annotation.ResponseBody;
  7. @Controller
  8. public class UserController1 {
  9. @ResponseBody
  10. @GetMapping("/hello")
  11. public String sayhi(){
  12. System.out.println("hello spring mvc");
  13. return "hello spring mvc";
  14. }
  15. }

结果如下:

3.1.4@PostMapping注解

①用法:

@PostMapping(/xxx”)

②示例:(POST是无法直接通过URL访问到的,我们需要通过postman来进行测试)

  1. package com.example.demo;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.*;
  4. @Controller
  5. public class UserController1 {
  6. @ResponseBody
  7. @PostMapping("/hello")
  8. public String sayhi(){
  9. System.out.println("hello spring mvc");
  10. return "hello spring mvc";
  11. }
  12. }

结果如下:

4.获取参数

4.1传递单个参数

①解释:

直接在方法中传入一个参数

②示例:

  1. package com.example.demo;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.ResponseBody;
  5. @Controller
  6. public class UserController2 {
  7. @ResponseBody
  8. @RequestMapping("/getuserid")
  9. public Student student(Integer id){//这里必须使用包装类,否则会报错
  10. Student student=new Student();
  11. student.setId(1);
  12. student.setName("张三");
  13. student.setAge(18);
  14. student.setPassword("123456");
  15. return student;
  16. }
  17. }

结果如下:

③注意!!

 此传递名称需要与前端传递的产生名保持一致,否则就获取不到参数的值。如下:

4.2传递多个参数

①说明:

顾名思义就是传递多个参数

②示例:

  1. package com.example.demo;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.ResponseBody;
  5. @Controller
  6. public class UserController2 {
  7. @ResponseBody
  8. @RequestMapping("/getuserid")
  9. public String student(Integer id,String name){//这里必须使用包装类,否则会报错
  10. Student student=new Student();
  11. student.setId(1);
  12. student.setName("张三");
  13. student.setAge(18);
  14. student.setPassword("123456");
  15. return "id: " + id+ " | name: " + name;
  16. }
  17. }

结果如下:

4.3传递对象

当参数非常多的时候,显然这个时候代码的可读性就大大降低了,所以我们为了增强代码的可读性,我们决定使用传递对象。

①说明:

传递对象顾名思义是对整个对象来进行封装传递

②示例:

  1. package com.example.demo;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.ResponseBody;
  5. @Controller
  6. public class UserController3 {
  7. @ResponseBody//返回一个非静态页面
  8. @RequestMapping("/object")
  9. public String reg(Student student){
  10. return "学生的基本信息"+student;
  11. }
  12. }

输出结果:

注意:

虽然我们在代码中传递的是对象,但是不要忘记,在url中我们还是应该输入需要参数的值,否则就会出现为null的如下情况

4.4后端参数重命名

某些特殊的情况下,前端传递的参数 key 和我们后端接收的 key 可能不一致,比如前端传递了一个username给后端,而后端又是name字段来接收的,这样就会出现参数接收不到的情况,如果出现这种情况,我们就可以使用@RequestParam来重命名前后端的参数值。

①示例前后端不一致时会出现的错误:

而有时候面临这个情况,前后端都不愿意选择让步,所以我们引入@RequestParam来进行处理

②引入后处理:

  1. package com.example.demo;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RequestParam;
  5. import org.springframework.web.bind.annotation.ResponseBody;
  6. @Controller
  7. public class UserController2 {
  8. @ResponseBody
  9. @RequestMapping("/getuserid")
  10. public String student(@RequestParam("username") String name){//这里必须使用包装类,否则会报错
  11. Student student=new Student();
  12. student.setId(1);
  13. student.setName("张三");
  14. student.setAge(18);
  15. student.setPassword("123456");
  16. return "name: " + name;
  17. }
  18. }

输出结果:(如果有多个参数需要改名,就用多个@RequestParam即可)

 ③注意:当采用了@RequestParam后,要是不传参数就会报错如下:

而当没有这个注解的时候,没传参数就会默认为null如下:

 ④解决③中当有@RequestParam注解不传参时报错的情况:

(我们会发现在默认情况下,一定要传参数,否则就会报错)

如果想要解决此问题,可以给@RequestParam里面添加required=false,这样不传参数就也不会报错

  1. package com.example.demo;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RequestParam;
  5. import org.springframework.web.bind.annotation.ResponseBody;
  6. @Controller
  7. public class UserController2 {
  8. @ResponseBody
  9. @RequestMapping("/getuserid")
  10. public String student(@RequestParam(name="username",required = false) String name){//这里必须使用包装类,否则会报错
  11. Student student=new Student();
  12. student.setId(1);
  13. student.setName("张三");
  14. student.setAge(18);
  15. student.setPassword("123456");
  16. return "name: " + name;
  17. }
  18. }

结果如下: 

4.5获取Json对象

如果需要接收json格式的对象,那么我们就必须添加@RequestBody这个注解

①未添加@RequestBody注解的情况:

我们用fiddler来进行抓包,来看这个是什么形式:

 可以看出此时并不是json格式的,这个的输出结果是这样:

②当我们加了@RequestBody后的情况:

 这个时候我们访问fiddler,也可以看到现在的类型究竟是什么:

4.6获取URL中的参数

①此处URL中的参数的含义:

直接拿URL地址中的参数,简单来说,就是从URL中?前面的字段中获取参数。

举个例子:

②为什么要获取URL中的参数?

因为某些软件或者游戏为了增加曝光度的话,当我们搜索其角色或者是内容名字,要是它加在?后的话,曝光率相比于加在?前会大大降低,所以更多的商家,就将其参数放于?前的URL中。

③格式:

a.在@RequestMapping(“/xxx/{参数1}{参数2}”) 

b.在方法中加上@PathVariable注解

④示例如下:

  1. package com.example.demo;
  2. import org.springframework.stereotype.Component;
  3. import org.springframework.stereotype.Controller;
  4. import org.springframework.web.bind.annotation.PathVariable;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.ResponseBody;
  7. @Controller
  8. public class UserController4 {
  9. @ResponseBody
  10. @RequestMapping("/getThing/{id}/{name}")
  11. public String getThing(@PathVariable Integer id,@PathVariable String name){
  12. return "id:"+id+"name:"+name;
  13. }
  14. }

这样当我们在URL里输入id为1,name为小乔时,就会出现如下结果:

4.7上传文件

①格式:

用@RequestPart注解

②示例:保存路径写死的情况

  1. package com.example.demo;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.springframework.stereotype.Controller;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. import org.springframework.web.bind.annotation.RequestPart;
  6. import org.springframework.web.bind.annotation.ResponseBody;
  7. import org.springframework.web.multipart.MultipartFile;
  8. import java.io.File;
  9. import java.io.IOException;
  10. @Slf4j
  11. @Controller
  12. @ResponseBody //返回一个非静态页面
  13. public class UserController5 {
  14. //上传文件
  15. @RequestMapping("/upimg")
  16. public boolean upImg(Integer id, @RequestPart("img") MultipartFile file) {
  17. boolean result = false;
  18. //保存文件到本地目录
  19. try {
  20. file.transferTo(new File("C:\\zhuomian\\222.png"));
  21. result = true;
  22. } catch (IOException e) {
  23. log.error("上传图片失败" + e.getMessage());
  24. }
  25. return result;
  26. }
  27. }

我们用postman来看示例是否成功:

然后我们会发现在桌面上多了一个222.png

 而在实际开发中,我们的保存路径却并没有写死,所以我们要用更符合实际开发的来写:

②保存路径不写死的情况:

a.因为在公司中会涉及不同的测试,开发环境,运行环境等等,然而当环境改变的时候,为了使我们更加方便,所以我们引入相应的配置,最终的时候,只需要修改一行配置,就可以完成切换。如下,我们设置三个yml配置文件。

我们这里就用yml文件来进行演示,需要注意的是,前面的application是固定的,我们只需要更改后面的名称即可。

(1)主配置文件application.yml中来配置配置文件的运行平台

  1. # 设置配置文件的运行平台
  2. spring:
  3. profiles:
  4. active: xxx
  5. # 如运行application-dev配置文件 即active: dev

(2)在不同的环境下配置不同的参数,如在开发配置文件中配置图片保存路径:

  1. # 文件保存路径
  2. img:
  3. path: C:\\zhuomian\\

b.而在这种情况下,我们要保存图片到任意路径的话,需要操作以下几步:

(1)配置并获取保存的路径

(2)利用(UUID)来保持图片名称的唯一性

(在此步要获取到名片的格式,并且将UUID与图片的格式拼接在一起)

(3)储存图片

代码如下:

  1. package com.example.demo;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.springframework.beans.factory.annotation.Value;
  4. import org.springframework.stereotype.Controller;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RequestPart;
  7. import org.springframework.web.bind.annotation.ResponseBody;
  8. import org.springframework.web.multipart.MultipartFile;
  9. import java.io.File;
  10. import java.io.IOException;
  11. import java.util.UUID;
  12. @Slf4j
  13. @Controller
  14. @ResponseBody //返回一个非静态页面
  15. public class UserController5 {
  16. //获取配置文件的保存路径
  17. @Value("${img.path}")
  18. private String imgpath;
  19. //上传文件
  20. @RequestMapping("/upimg")
  21. public boolean updateImg(Integer id, @RequestPart("img") MultipartFile file) {
  22. boolean result = false;
  23. //得到原图片的名称
  24. String filename = file.getOriginalFilename();
  25. //得到图片后缀(png)
  26. String fixType = filename.substring(filename.lastIndexOf("."));
  27. //生成不重名的文件名
  28. filename = UUID.randomUUID().toString() + filename;
  29. try {
  30. //将图片保存
  31. file.transferTo(new File(imgpath + filename));
  32. result = true;
  33. } catch (IOException e) {
  34. log.error("图片上传失败!" + e.getMessage());
  35. }
  36. return result;
  37. }
  38. }

postman来测试:

 测试结果如下:

测试成功 

目录少写了cookie,header,session的获取,下期我们再补上哦,顺便把MVC内容讲完

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/194669
推荐阅读
相关标签
  

闽ICP备14008679号