Controller层接收前端页面传参种类及实现

目录

  • 一、简介
  • 二、接收参数方式
    • 1.无注解的接收
    • 2.请求路径带参数
      • 2.1 @RequestParam
      • 2.2 @PathVariable
    • 3.@RequsetBody
  • 三、总结

一、简介

在使用Controller层处理前端请求时,接收前端页面参数是非常重要的一步,页面的参数该如何接收,常常会让人混淆,比如我~
本文也是我的学习笔记,希望可以帮助大家更好地理解和掌握这些方法,以Restful风格为例,参考了一些CSDN大佬的文章,整理了一下常见的接收传参的方法。

IDE:idea、JDK:1.8

二、接收参数方式

准备环境:Book.class,BookController.class

实体类Book.class,里面的属性有以下:

@Data
public class Book {
    private Long id;
    private String name;
    private float price;
}

控制器类BookController.class

/**
 * 为了方便查看传参是否成功,我们将接收到的参数用log,info()打印在控制台, 该方法需要在控制器类上方添加@Slf4j注解
 */
@Slf4j
@RestController
@RequestMapping("/book")
public class BookController {

}

1.无注解的接收

注意:无注解的接收只能获取Get方式的请求的参数,如果用别的请求就会报错,并且接收不到页面传递过来的参数

@Slf4j
@RestController
@RequestMapping("/book")
public class BookController {
    /**
     * 无注解的接收,单个参数接收的方式
     * http://localhost:8080/book/text1?id=1314
     * @param id
     */
    @GetMapping("/text1")
    public void text1(Long id) {
        log.info(id.toString());    // 1314
    }

    /**
     * 无注解的接收,实体类接收的方式,会自动封装进book中,更加通用,推荐
     * http://localhost:8080/book/text2?id=1314
     * @param book
     */
    @GetMapping("/text2")
    public void text2(Book book) {
        log.info(book.toString());  // Book(id=1314, name=null, price=0.0)
    }
}

2.请求路径带参数

2.1 @RequestParam

@RequestParam将请求参数绑定到你控制器的方法参数上,这样就能够正确地获取前台传递的参数值,并进行后续的业务处理。使用@RequestParam注解可以有效避免参数传递不匹配的问题,提高系统的稳定性和安全性。
@RequestParam(value=”参数名”,required=”true/false”,defaultValue=””)

/*
	value:参数名
	required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报错。
	defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值
*/
@Slf4j
@RestController
@RequestMapping("/book")
public class BookController {
    /**
     * @RequestParam
     * http://localhost:8080/book/test3?name=《编译原理》
     * url参数中的name必须要和@RequestParam("name")一致
     * @param name
     */
    @DeleteMapping("/test3")
    public void test3(@RequestParam("name")String name){
        log.info(name);
    }

    /**
     * @RequestParam
     * http://localhost:8080/book/test4
     * url中没有name参数不会报错,因为required=false、有参数就显示出来
     * @param name
     */
    @DeleteMapping("/test4")
    public void test4(@RequestParam(value="name",required=false)String name){
        log.info(name); // null
    }

    /**
     * @RequestParam
     * http://localhost:8080/book/test5?name=《编译原理》 显示为《编译原理》
     * http://localhost:8080/book/test5?name 显示为《无名之书》
     * defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值
     * @param name
     */
    @DeleteMapping("/test5")
    public void test5(@RequestParam(value="name",required=true,defaultValue="《无名之书》")String name){
        log.info(name); // 第一个url:《编译原理》,第二个url:《无名之书》
    }

    /**
     * @RequestParam
     * http://localhost:8080/book/test6?ids=23&ids=98&ids=64
     * @RequestParam中的参数也可以省略,参数名默认就是和形参名称一致
     * @param ids
     */
    @DeleteMapping("/test6")
    public void test6(@RequestParam List<Long> ids){
        log.info(ids.toString()); // [23, 98, 64]
    }
}

注意:
@RequestParam注解和HttpServletRequest的getParameter()方法的作用相同,都是用于从请求中获取参数的值。但是它们的实现方式略有不同。

@RequestParam注解是SpringMVC框架提供的注解,底层是基于Java反射机制实现的。它通过反射获取Controller方法的参数信息,并根据参数名和@RequestParam注解中的value属性值从请求中获取参数值,然后进行类型转换和参数绑定等操作。

而HttpServletRequest的getParameter()方法是Servlet API中提供的方法,底层是基于Servlet容器实现的。它通过解析HTTP请求中的参数字符串,将参数名和参数值存储在一个名为parameterMap的Map对象中,然后通过调用getParameter()方法获取对应的参数值。

2.2 @PathVariable

@PathVariable用于将 URL中的占位符参数绑定到方法的形参上。例如,对于以下的请求 URL:http://localhost:8080/user/1001,其中的 “1001” 就是一个占位符参数,可以使用 @PathVariable 注解将其绑定到方法的形参上。下面看一下具体的例子

@Slf4j
@RestController
@RequestMapping("/book")
public class BookController {
    /**
     * @PathVariable
     * http://localhost:8080/book/test7/23
     * url参数中的id必须要和@PathVariable("id")一致
     * @param id
     */
    @GetMapping("/test7/{id}")
    public void test7(@PathVariable(value = "id") Long id) {
        log.info(id.toString());    // 23
    }

    /**
     * @PathVariable
     * http://localhost:8080/book/test8/42
     * 如果不指定参数名,则默认使用形参名称作为占位符参数名
     * @param id
     */
    @GetMapping("/test8/{id}")
    public void test8(@PathVariable Long id) {
        log.info(id.toString());    // 42
    }
}

3.@RequsetBody

@RequestBody用于将请求体中的JSON或XML数据绑定到方法的形参上。而最常用的使用请求体传参的无疑是Post请求了,所以使用@RequestBody接收数据时,一般都用Post方式进行提交。

@Slf4j
@RestController
@RequestMapping("/book")
public class BookController {
    /**
     * @RequestBody
     * http://localhost:8080/book/test9
     * 请求体中:
     * {
     *     "name": "《编译原理》",
     *     "id": 10086,
     *     "price": 40.6
     * }
     * @param book
     */
    @PostMapping("/test9")
    public void test9(@RequestBody Book book) {
        log.info(book.toString());  // Book(id=10086, name=《编译原理》, price=40.6)
    }
}

三、总结

接收前端页面参数是实现前后端数据交互的关键步骤,常见的接收传参的方法有:无注解接收、@RequestParam注解、@PathVariable注解和@RequestBody。

  • 无注解接收:直接在方法的参数中定义需要接收的参数名,Spring会自动匹配参数名和前端传递的参数名,并将值赋给参数。
  • @RequestParam注解:使用@RequestParam注解可以将前端传递的参数与方法参数绑定,例如:@RequestParam(“name”) String name,表示将前端传递的名为“name”的参数值绑定到方法参数name上。
  • @PathVariable 注解:使用@PathVariable注解可以将URL中的参数与方法参数绑定,例如:@GetMapping(“/book/{id}”),表示将URL中的{id}与方法参数id绑定。
  • @RequestBody:使用@RequestBody注解可以将前端传递的JSON数据转换为Java对象,例如:@RequestBody Book book,表示将前端传递的JSON数据转换为Book对象。

总之,根据不同的需求和场景,需要选择不同的接收传参的方法,希望本篇文章对大家有帮助~

参考文章:
前端传值的几种方式:https://blog.csdn.net/weixin_42260782/article/details/126059313
@RequestParam:https://blog.csdn.net/sswqzx/article/details/84195043
@PathVariable:https://blog.csdn.net/weixin_45393094/article/details/108814901

你可能感兴趣的:(Springboot,java,spring,boot,json,mvc)