【SpringBoot】-Spring MVC项目如何传递参数?

作者:学Java的冬瓜
博客主页:☀冬瓜的主页🌙
专栏【Framework】
主要内容:使用SpringBoot的SpringMVC框架传递各种参数,如传对象,传表单,传文件。后端对前端的请求信息的获取,如Cookie,Header。后端对session进行设置和获取。

文章目录

一、传递不同参数类型

注意:

1> 参数传递不使用基础数据类型,因为容易出错(包装类型最多是参数为null)

2> 在后端路由的方法中仍然可以使用Servlet阶段学的 HttpServletRequest和HttpServletResponse作为参数(这两个相当于隐藏的参数),但是没必要。

3> 当有多个参数时,前后端进行参数匹配,是以参数的名称进行匹配的,与参数的前后位置无关。

4> Spring MVC可以实现自动的参数映射,因此传关于对象的信息时,在后端就可以转成一个对象使用。

1、传递单个参数

前端发送http请求

后端接收参数

java 复制代码
	//1.传递单个参数
    @RequestMapping("/m1")
    public Object method_1(String name){
        System.out.println("==============================");
        System.out.println("参数name:" + name);
        System.out.println("==============================");
        return "传递单个参数";
    }

后端处理结果

2、传递对象

理解:前端发送对象信息,后端将信息获取并封装在对象中。

前端发送http请求

后端接收信息并将信息转为对象

java 复制代码
	@RequestMapping("/m2")
    public String method_2(Person p){
        System.out.println("==================================");
        System.out.println("p对象username:" + p.getUsername());
        System.out.println("p对象password:" + p.getPassword());
        System.out.println("==================================");
        return "传递对象";
    }

后端处理后打印的信息

3、传递表单数据

后端有两种处理方式:1>一个一个获取前端传的参数(类似1) 2>把前端传来的参数封装成一个对象(类似2)。

4、传递Json对象 后端用@RequestBody注解

理解:后端使用@RequestBody注解,表示从请求的请求体获取信息,请求体是个Json格式数据,因此后端可以正常获取前端的数据并封装在对象中

前端发送http请求:

后端使用**@RequestBody注解:**

后端处理后成功打印信息:

5、参数部分传参@RequestParam和 基础URL传参@RequestVariable

理解:

参数部分传参指的是:http://localhost:8080/test/m4?username='张三'

基础URL传参指的是:http://localhost:8080/test/m4/zhangsan。前者传参的username在后面的参数部分,而后者传参的username在基础path中。
区别:

前者适用于要传参数较多的情况;

后者适用于参数较少,且对搜索有关键词要求的情况(基础URL传参对搜索引擎搜索的权重更大,因为要传的参数在path里)。
注意: @RequestParam和@PathVariable都可以重命名参数,也可以设置参数为非必要参数。

基础URL传参前端:

后端接收基础URL部分参数:使用@PathVariable注解

c 复制代码
	@RequestMapping("/m5/{name}/{pwd}")
    public String method_5(@PathVariable String name, @PathVariable String pwd){//@PathVariable注解表示,参数为基础URL传参。
        System.out.println("=================================");
        System.out.println(name + " " + pwd);
        System.out.println("=================================");
        return "基础URL传参";
    }

后端处理后成功打印信息:

6、上传文件 @RequestPart

注意点:
【SpringBoot文档】

易错点:文件传输有大小限制。在SpringBoot文档中,注明了默认上传文件最大为1MB,请求最大为10MB,这两个参数可以在我们项目的 application配置文件中修改大小。

修改如下图:spring.servlet.multipart.max-file-size和spring.servlet.multipart.max-request-size

上传文件正式操作:

前端上传文件:选择表单,然后填写文件上传的key(后端用这个key接收上传文件),选择上传文件并上传。

后端处理文件上传: 将文件保存在E盘路径下

代码如下:

c 复制代码
@RestController
public class UpLoadController {
    //4.上传文件
    @RequestMapping("/myUpload")
    public String Upload(@RequestPart("myImg") MultipartFile file) throws IOException {
        System.out.println("=================================");
        String originalFileName = file.getOriginalFilename();
        // 1>获得上传文件后缀名
        String hzName = originalFileName.substring(originalFileName.lastIndexOf("."));
        // 2>获得文件保存地址(使用唯一标识,确保同一时刻多个用户上传文件不会覆盖)
        String filePath = "E:/"+ UUID.randomUUID() + hzName;  //(空指针异常)

        System.out.println(filePath);

        File saveFile = new File(filePath);
        try {
            file.transferTo(saveFile);//保存文件
            System.out.println("文件上传成功!");
            System.out.println("=================================");
            return "上传文件成功!";
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "上传文件失败!!!";
    }
}

二、关于参数的设置

1、后端参数重命名和必传参数 后端用@RequestParam注解

场景描述:

当前端发送和后端接收的参数名称不一致时,可以使用@RequestParam给后端参数重命名。这样就在后端可以使用和前端名称不一致的参数获取到前端的值。具体操作如下:

前端发送http请求:使用name传参

后端接收请求:

@RequestParam会自动给一个必传参数(上图name默认是必传参数),也就是说此时前端必须用name传参,而不能再使用与后端相同名称的参数username传参。

2、非必传参数设置

注意:如果有个参数是非必传参数,可以使用@RequestParam(value = "name", required = false)来限制,此时该参数就可传可不传,如下代码:

java 复制代码
	@RequestMapping("/m3")
    public String method_3(@RequestParam(value = "name", required = false) String username, String password){
        return  "后端参数重命名";
    }

三、后端关于前端各类参数接收

1、获取Cookie------@CookieValue

获取Cookie的后端代码:使用@CookieValue注解

java 复制代码
@RestController
public class TestController {
    @RequestMapping("/getCookie")
    public String func_1(@CookieValue("cookieKey") String cookie){
        return "cookie" + cookie;
    }
}

注意后端的CookieKey要和前端的cookie名称相同,可以通过在前端浏览器界面打开开发者工具添加指定的cookie进行验证,如下图。

后端处理后前端显示内容:

2、获取Header参数------@RequestHeader

后端获取Header信息:只需修改代码中注解内的信息,即可得到相应的请求头信息。

java 复制代码
//2、获取header
    @RequestMapping("/getHeader")
    public String func_2(@RequestHeader("User-Agent") String headerMsg){
        return headerMsg;
    }

前端请求和响应信息:

3、获取Session------@SessionAttribute

要想获取session,得先保存session。如下图:

保存session:

java 复制代码
	@RequestMapping("/setSession")
    public String func_3(HttpServletRequest request){
        HttpSession session = (HttpSession) request.getSession(true);
        if (session != null){
            session.setAttribute("username", "张三");
        }
        return "set session succeed!";
    }

浏览器请求URL和显示信息:

获取session:

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

浏览器请求URL和显示信息:

相关推荐
NE_STOP2 小时前
SpringBoot--简单入门
java·spring
seventeennnnn2 小时前
谢飞机的Java高级开发面试:从Spring Boot到分布式架构的蜕变之旅
spring boot·微服务架构·java面试·分布式系统·电商支付
超级小忍3 小时前
服务端向客户端主动推送数据的几种方法(Spring Boot 环境)
java·spring boot·后端
张小洛4 小时前
Spring AOP 设计解密:代理对象生成、拦截器链调度与注解适配全流程源码解析
java·后端·spring·spring aop·aop
时间会给答案scidag4 小时前
报错 400 和405解决方案
vue.js·spring boot
Wyc724094 小时前
SpringBoot
java·spring boot·spring
ladymorgana6 小时前
【Spring Boot】HikariCP 连接池 YAML 配置详解
spring boot·后端·mysql·连接池·hikaricp
neoooo6 小时前
别慌,Java只有值传递——一次搞懂“为啥我改了它还不变”!
java·后端·spring
GJCTYU7 小时前
spring中@Transactional注解和事务的实战理解附代码
数据库·spring boot·后端·spring·oracle·mybatis
linweidong8 小时前
七牛云Java开发面试题及参考答案(60道面试题汇总)
spring·读写分离·aop·cap·java开发·spring ioc·java面经