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

网友投稿 1658 2022-12-11

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

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()http:// {

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;

}

}

前端代码:

hello, [[${msg}]]

hello, [(${msg})]

用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 http://Student test6(@RequestBody Student s) {

return s;

}

postman测试:

前端传递对象数组

后台代码

@PostMapping("/test6")

public List test6(@RequestBody List 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 ) {

rettqDTCYThSurn 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,//这里有两种写法

tqDTCYThS @PathVariable(value = "name") String name) {

Student s=new Student();

s.setId(id);

s.setName(name);

return s;

}

@PostMapping("/test6")

public List test6(@RequestBody List list) {

Iterator it = list.iterator();

while (it.hasNext()){

Student s=(Student)it.next();

System.out.println(s.getId()+":"+s.getName());

}

return list;

}

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:详谈ThreadLocal
下一篇:解决程序包org.springframework.test.context不存在
相关文章

 发表评论

暂时没有评论,来抢沙发吧~