Spring Boot 控制层之参数传递方法详解

当然,您自己创建一个项目也是可以的。

bean包下的Student.java

package com.example.demo.bean;
public class Student {
    private Integer id; //学号
    private String name; //姓名
    public Student() {
    }
    public Student(Integer id, String name) {
        this.id = id;
        this.name = name;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

无注解获取参数

  • 直接把 HTTP 请求的参数写在后台方法的形参中,允许参数为空。
  • HTTP 请求的参数值(字符串)将自动转换为方法形参的类型。
  • 要求:方法的参数名称要和 HTTP 请求的参数名称保持一致。
  • 适用于 GET 和 POST 请求方式。

后台代码:

@RestController
public class TestController {

    @RequestMapping("/test1")
    public Student test1(Integer id, String name) {
        Student s=new Student();
        s.setId(id);
        s.setName(name);
        return s;
    }
}

前端代码:

<body>
	<p th:inline = "none" >hello, [[${msg}]]</p>
	<p th:inline = "none" >hello, [(${msg})]</p>
</body>

用postman尝试:
前端请求:http://localhost:8080/test1?id=2019001&name=小明

参数是 key=value 形式
value 默认都是字符串类型

参数和请求之间用?连接
参数之间用&连接

为空值的情况:

使用HttpServletRequest对象

方法的参数中添加 HttpServletRequest 对象。
通过该对象 getParameter(“xxx”) 获取请求的 “xxx” 参数值(字符串值)。

适用于 GET 和 POST 请求方式。

后台代码:

@RequestMapping("/test2")
    public Student test2( HttpServletRequest request ) {
        Integer id = Integer.parseInt( request.getParameter("id") );
        String name = request.getParameter("name");
        Student s=new Student(id,name);
        return s;
    }

postman测试:

使用实体类封装 ★

直接使用实体类做为控制器参数,Spring Boot会自动创建这个类的对象,并用 HTTP 参数装配它。
要求:实体类属性名称要和 HTTP 请求的参数名称保持一致。
适用于 GET 和 POST 请求方式。

后台代码:

@RequestMapping("/test3")
    public Student test3( Student s ) {
        return s;
    }

要求:实体类属性名称要和 HTTP 请求的参数名称保持一致

postman测试:
一般情况:

多的参数不接收:

为空:

名称不一致:

使用 @RequestParam 获取参数

在无注解的情况下,要求 HTTP 参数名与控制器参数名称保持一致,然
而现在在前后台分离的趋势下,前端的命名规则可能与后端的不一样。
使用 @RequestParam 注解来确定前后端参数名称的映射关系。
适用于 GET 和 POST 请求方式。
@RequestParam 有三个配置参数:
value 为接收 HTTP 请求的参数名。

required 表示是否必须,默认为 true,表示参数必填。
defaultValue 可设置请求参数的默认值。

后台代码:

@RequestMapping("/test4")
    public Student test4( @RequestParam(value="stu_id") Integer id,
                          @RequestParam(value="stu_name") String name) {
        Student s=new Student();
        s.setId(id);
        s.setName(name);
        return s;
    }

postman测试:


报错:stu_name参数默认必填

添加默认值

@RequestMapping("/test4")
    public Student test4(@RequestParam(value="stu_id", required = true, defaultValue = "2019000") Integer id,
                         @RequestParam(value="stu_name", required = false) String name) {
        Student s=new Student();
        s.setId(id);
        s.setName(name);
        return s;
    }

postman测试:

全为空:

使用 @PathVariable 获取参数

REST风格请求,例如:http://localhost:8080/test4/2019001/小明(数据直接放在请求路径上,并用"/“连接)
后台请求映射:
@RequestMapping(”/test4/{id}/{name}")
参数绑定:
@PathVariable(“xxx”) 将占位符参数"xxx"绑定到控制器方法的形参中。
注意:
(1)路径上必须有参数(required=true),且不能设置默认值。
(2)适用于 GET 和 POST 请求方式。

后台代码:

@RequestMapping("/test5/{id}/{name}")
    public Student test5( @PathVariable("id") Integer id,//这里有两种写法
                          @PathVariable(value = "name") String name) {
        Student s=new Student();
        s.setId(id);
        s.setName(name);
        return s;
    }

前端请求:(这次不用postman测试了,用也可以,都一样)

错误的前端请求:



@PathVariable与@RequestParam的区别

使用 @RequestBody 获取参数

@RequestBody 主要用来接收前端传递的 json 数据。
 注意:
(1)使用 @RequestBody 接收数据时,前端必须 POST 方式提交;
(2)且必须与 contentType = “application/json” 配合使用。

不设置时使用的是默认值:application/x-www-form-urlencoded

后台代码

@PostMapping("/test6")
    public Student test6(@RequestBody Student s) {
        return s;
    }

postman测试:

前端传递对象数组

后台代码

@PostMapping("/test6")
    public List<Student> test6(@RequestBody List<Student> list) {
        Iterator it = list.iterator();
        while (it.hasNext()){
            Student s=(Student)it.next();
            System.out.println(s.getId()+":"+s.getName());
        }
        return list;
    }

postman测试:

控制器代码完整版:

TestController.java

package com.example.demo.controller;

import com.example.demo.bean.Student;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.*;

@RestController
@ServletComponentScan
public class TestController {

    @RequestMapping("/test1")
    public Student test1(Integer id, String name) {
        Student s=new Student();
        s.setId(id);
        s.setName(name);
        return s;
    }
    @RequestMapping("/test2")
    public Student test2( HttpServletRequest request ) {
        Integer id = Integer.parseInt( request.getParameter("id") ); // 转换一下(没有判断空串或null)
        String name = request.getParameter("name");
        Student s=new Student(id,name);
        return s;
    }
    @RequestMapping("/test3")
    public Student test3( Student s ) {
        return s;
    }
    @RequestMapping("/test4")
    public Student test4(@RequestParam(value="stu_id", required = true, defaultValue = "2019000") Integer id,
                         @RequestParam(value="stu_name", required = false) String name) {
        Student s=new Student();
        s.setId(id);
        s.setName(name);
        return s;
    }
    @RequestMapping("/test5/{id}/{name}")
    public Student test5( @PathVariable("id") Integer id,//这里有两种写法
                          @PathVariable(value = "name") String name) {
        Student s=new Student();
        s.setId(id);
        s.setName(name);
        return s;
    }
    @PostMapping("/test6")
    public List<Student> test6(@RequestBody List<Student> list) {
        Iterator it = list.iterator();
        while (it.hasNext()){
            Student s=(Student)it.next();
            System.out.println(s.getId()+":"+s.getName());
        }
        return list;
    }

}

到此这篇关于Spring Boot 控制层之参数传递方法详解的文章就介绍到这了,更多相关Spring Boot 参数传递内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot 设置传入参数非必要的操作

    我就废话不多说了,大家还是直接看代码吧~ 设置参数是否为必要参数 @RequestParam(required = false) 补充:SpringBoot 开发案例之参数传递的正确姿势 前言 开发这么多年,肯定还有不少小伙伴搞不清各种类型的参数是如何传递的,很多同学都是拿来即用,复制粘贴一把撸,遇到问题还是一脸懵逼. 姿势 学习参数传递的正确姿势,先说怎么做,再说为什么,本质上还是复制粘贴一把撸,问题是你想问不想问为什么! 传递 用户登录 前端代码: var param = { "userna

  • springboot控制层传递参数为非必填值的操作

    目录 springboot控制层传递参数为非必填值 Controller层接收参数的形式 1.参数存在于请求路径中 2.参数在请求体中 springboot控制层传递参数为非必填值 需求是查询全部评价时,后端控制层的level为非必选项,即为空. 这里@RequestParam(required=false)就可以处理level为非必须值的情况. 如果没有这一行,当level为空时,会返回空白页面. 这里要注意一下!是个坑 Controller层接收参数的形式 1.参数存在于请求路径中 1.请求

  • Spring Boot中@RequestParam参数的5种情况说明

    目录 Spring Boot中@RequestParam参数的5种情况 实例如下: Spring Boot注解:@RequestParam详解 1.value:参数名字,即入参的请求参数名字 ​2.required:该参数是否为必传项. ​3.defaultValue:参数的默认值 Spring Boot中@RequestParam参数的5种情况 实例如下: // 可带参数可不带参数,方法都能执行 @RequestMapping("/list") public String test1

  • SpringBoot中自定义注解实现参数非空校验的示例

    前言 由于刚写项目不久,在写 web 后台接口时,经常会对前端传入的参数进行一些规则校验,如果入参较少还好,一旦需要校验的参数比较多,那么使用 if 校验会带来大量的重复性工作,并且代码看起来会非常冗余,所以我首先想到能否通过一些手段改进这点,让 Controller 层减少参数校验的冗余代码,提升代码的可阅读性. 经过阅读他人的代码,发现使用 annotation 注解是一个比较方便的手段,SpringBoot 自带的 @RequestParam 注解只会校验请求中该参数是否存在,但是该参数是

  • Spring Boot 控制层之参数传递方法详解

    当然,您自己创建一个项目也是可以的. bean包下的Student.java package com.example.demo.bean; public class Student { private Integer id; //学号 private String name; //姓名 public Student() { } public Student(Integer id, String name) { this.id = id; this.name = name; } public In

  • Spring Boot读取resources目录文件方法详解

    这篇文章主要介绍了Spring Boot读取resources目录文件方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在Java编码过程中,我们常常希望读取项目内的配置文件,按照Maven的习惯,这些文件一般放在项目的src/main/resources下,因此,合同协议PDF模板.Excel格式的统计报表等模板的存放位置是resources/template/test.pdf,下面提供两种读取方式,它们分别在windows和Linux

  • Spring Boot自定义错误视图的方法详解

    Spring Boot缺省错误视图解析器 Web应用在处理请求的过程中发生错误是非常常见的情况,SpringBoot中为我们实现了一个错误视图解析器(DefaultErrorViewResolver).它基于一些常见的约定,尝试根据HTTP错误状态码解析出错误处理视图.它会在目录/error下针对提供的HTTP错误状态码搜索模板或者静态资源,比如,给定了HTTP状态码404,它会尝试搜索如下模板或者静态资源: /<templates>/error/404.<ext> - 这里<

  • spring boot 防止重复提交实现方法详解

    本文实例讲述了spring boot 防止重复提交实现方法.分享给大家供大家参考,具体如下: 服务器端实现方案:同一客户端在2秒内对同一URL的提交视为重复提交 上代码吧 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.or

  • spring boot使用thymeleaf模板的方法详解

    前言 Thymeleaf 是一个跟 Velocity.FreeMarker 类似的模板引擎,它可以完全替代 JSP .相较与其他的模板引擎,它有如下三个极吸引人的特点: 1.Thymeleaf 在有网络和无网络的环境下皆可运行,即它可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的动态页面效果.这是由于它支持 html 原型,然后在 html 标签里增加额外的属性来达到模板+数据的展示方式.浏览器解释 html 时会忽略未定义的标签属性,所以 thymeleaf 的模板可以

  • Spring Boot Thymeleaf实现国际化的方法详解

    前言 开发传统Java WEB工程时,我们可以使用JSP页面模板语言,但是在SpringBoot中已经不推荐使用了.SpringBoot支持如下页面模板语言 Thymeleaf FreeMarker Velocity Groovy JSP 上面并没有列举所有SpringBoot支持的页面模板技术.其中Thymeleaf是SpringBoot官方所推荐使用的,下面来谈谈Thymeleaf实现应用国际化方法. ps:当然现在开发基本上是前后端分离了,但是难免需要维护遗留项目或没有条件前后端分离的团队

  • Spring boot中使用ElasticSearch的方法详解

    0.版本选择 我这里选择了5.6.x,记得如果spring-boot-starter-parent是1.x可以选择2.x版本的elasticsearch,版本要对应,不然会有莫名其妙的问题 1.安装ElasticSearch https://www.elastic.co/downloads/past-releases windows 测试的,解压就能用 解压,到bin目录,双击elasticsearch.bat 1.1安装elasticsearch-head https://github.com

  • Spring Boot异步输出Logback日志方法详解

    一.介绍 1.1 Logback Logback是由log4j创始人设计的另一个开源日志组件,它分为下面下个模块: logback-core:其它两个模块的基础模块 logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能 1.2 日志级别 包括:TRACE.DEBUG.INFO.WARN

  • Spring boot注解@Async线程池实例详解

    这篇文章主要介绍了Spring boot注解@Async线程池实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 从Spring3开始提供了@Async注解,该注解可以被标注在方法上,以便异步地调用该方法.调用者将在调用时立即返回,方法的实际执行将提交给Spring TaskExecutor的任务中,由指定的线程池中的线程执行. 1. TaskExecutor Spring异步线程池的接口类,其实质是java.util.concurrent

  • Spring实现声明式事务的方法详解

    1.回顾事务 事务在项目开发过程非常重要,涉及到数据的一致性的问题,不容马虎! 事务管理是企业级应用程序开发中必备技术,用来确保数据的完整性和一致性. 事务就是把一系列的动作当成一个独立的工作单元,这些动作要么全部完成,要么全部不起作用. 事务四个属性ACID 原子性(atomicity) 事务是原子性操作,由一系列动作组成,事务的原子性确保动作要么全部完成,要么完全不起作用. 一致性(consistency) 一旦所有事务动作完成,事务就要被提交.数据和资源处于一种满足业务规则的一致性状态中.

随机推荐