JavaWeb开发(四)4.2——Spring MVC 的请求与响应、restful
创始人
2025-05-30 10:50:08
0

一、SpringMVC 请求与响应

1、@RequestMapping 注解

  • @RequestMapping 注解是一个用来处理请求地址映射的注解,可用于映射一个请求或一个方法,可以用在类或方法上。
  • 如果加载在方法上就是具体访问路径,如果加载在类上就是访问的前缀。
  • springmvc 定义url路径是不允许重复。

eg:

package com.qizekj.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;/*** @author chenqun* @date 2023/3/18 19:12*/
@Controller
@RequestMapping("/user")
public class UserController {/*** /add UserController.add  OrderController.add?* 如果我们将@RequestMapping注解加在我们的类上面 是访问该接口前缀* 如果加在方法上就是我们具体的访问路径* /user/add* @return*/@RequestMapping("/add")@ResponseBodypublic String add() {return "user add ok";}@RequestMapping("/delete")@ResponseBodypublic String delete() {return "user delete ok";}@RequestMapping("/select")@ResponseBodypublic String select() {return "user select ok";}
}
package com.qizekj.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;/*** @author chenqun* @date 2023/3/18 19:13*/
@Controller
@RequestMapping("/order")
public class OrderController {@RequestMapping("/add")@ResponseBodypublic String add() {return "order add ok";}@RequestMapping("/delete")@ResponseBodypublic String delete() {return "order delete ok";}@RequestMapping("/select")@ResponseBodypublic String select() {return "order select ok";}
}

2、接收Get/Post请求参数

  • 和Controller层方法的形参同名,那么可以直接通过参数名接收值。
  • 创建controller

eg:

package com.qizekj.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;/*** @author chenqun* @date 2023/3/18 19:26*/
@Controller
public class MemberController {/*** RequestMapping 默认的情况下 RequestMapping支持所有请求方式 例如 get、post 、delete* method = RequestMethod.POST 设定该接口支持的类型 post** @return*/@RequestMapping(value = "/addMember", method = RequestMethod.POST)@ResponseBodypublic String addMemberPost(Integer id, String name) {System.out.println("id:" + id);System.out.println("name:" + name);return "post---ok";}/*** addMember* 

* RequestMapping 默认的情况下 RequestMapping支持所有请求方式 例如 get、post 、delete* method = RequestMethod.POST 设定该接口支持的类型 post** @return*/@RequestMapping(value = "/addMember", method = RequestMethod.GET)@ResponseBodypublic String addMemberGet(Integer id, String name) {System.out.println("id:" + id);System.out.println("name:" + name);return "get---ok";} }

  • 运行项目后用postman访问:
    在这里插入图片描述
    在这里插入图片描述
    后台打印:
    在这里插入图片描述

3、springmvc 5种接受参数类型

3.1、普通参数

  1. url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数;
  2. 如果发生url地址传参,地址参数名与形参变量名不同,使用@RequestParam绑定参数关系;

参数:
required:是否为必传参数;
defaultValue:参数默认值。

//springmvc5种接受参数类型
//1.1、普通参数
@RequestMapping("/demo01")
@ResponseBody
public String demo01(String name, Integer age) {return "name:" + name + ",age:" + age;
}//1.2、普通参数2
/*** 当访问时的传递参数名称name与方法形参名称qizekjName不一致时,可以用@RequestParam注解进项绑定* 1.@RequestParam("name")地址栏 传递参数名称name 方法形参名称qizekjName* 2.required:是否必须传递该参数,默认是为true,也就是需要传递该参数;required = false,不需要必须传递该参数*/
@RequestMapping("/demo02")
@ResponseBody
public String demo02(@RequestParam(name = "name", required = false) String qizekjName,@RequestParam(name = "age", required = false) Integer qizekjAge) {return "name:" + qizekjName + ",age:" + qizekjAge;
}

3.2、对象参数/嵌套对象参数

  • 请求参数名与形参对象属性名相同,定义对象类型形参即可接收参数。
  • 嵌套对象参数:请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套对象属性参数。
/*** 2、接收对象类型参数* 地址栏中传递的参数名称与对象中成员属性名称保持一致即可* @param qizekjUser* @return*/
@RequestMapping("/demo03")
@ResponseBody
public String demo03(QizekjUserEntity qizekjUser) throws UnsupportedEncodingException {return "name:" + qizekjUser.getUserName() + ",age:" + qizekjUser.getAge() + ",addres:" +qizekjUser.getQizekjUserInfo().getAddres();
}
package com.qizekj.entity;/*** @author chenqun* @date 2023/3/18 19:37*/
public class QizekjUserEntity {/*** ?userName=qizekj&age=4*/private String userName;private Integer age;/*** ?qizekjUserInfo.addres=AnHuiHeFei*/private QizekjUserInfoEntity qizekjUserInfo;public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public QizekjUserInfoEntity getQizekjUserInfo() {return qizekjUserInfo;}public void setQizekjUserInfo(QizekjUserInfoEntity qizekjUserInfo) {this.qizekjUserInfo = qizekjUserInfo;}
}
package com.qizekj.entity;/*** @author chenqun* @date 2023/3/18 19:39*/
public class QizekjUserInfoEntity {private String addres;public String getAddres() {return addres;}public void setAddres(String addres) {this.addres = addres;}
}

3.3、数组参数

请求参数名与形参属性名相同且请求参数为多个,定义数组类型形参即可接收参数。

http://localhost:8081/demo04?arrays=qizekj&arrays=chenqun

/*** 3、接收数组类型参数* demo04?arrays=qizekj&arrays=chenqun* 请求参数名与形参属性名相同且请求参数为多个,定义数组类型形参即可接收参数* @param arrays* @return*/
@RequestMapping("/demo04")
@ResponseBody
public String demo04(String[] arrays) {return Arrays.toString(arrays);
}

3.4、集合参数

请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam绑定参数关系。

http://localhost:85/demo05?arrays=1&arrays=2

@RequestParam :同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据

eg:

/*** 4、接收集合普通类型参数* 请求参数名与形参属性名相同且请求参数为多个,定义数组类型形参即可接收参数* @param arrays* @return*/
@RequestMapping("/demo05")
@ResponseBody
public String demo05(@RequestParam List arrays) {return Arrays.toString(arrays.toArray());
}

二、SpringMVC 接收json数据

1、开启接收json数据

package com.qizekj.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;/*** @author chenqun* @date 2023/3/18 13:07*/
@Configuration
@ComponentScan("com.qizekj.controller")
@EnableWebMvc
public class SpringMVCConfig {/*** 1.@Configuration  定义SpringMVCConfig.xml配置文件* 2.需要将我们的控制类注入到ioc容器 @ComponentScan("com.qizekj.springmvc")* @ComponentScan("com.qizekj.springmvc")将该包下所有的类 注入到IOC容器种* 3.在springmvc原理 所有请求过来先达到DispatcherServlet 分发具体控制类 方法执行*/
}

2、添加maven依赖


com.fasterxml.jackson.corejackson-databind2.9.0

3、以实体类方式接收

  • 接收参数加上@RequestBody QizekjUserEntity qizekjUserEntity 标记,接收json数据
  • 自动根据json数据反序列化成对象qizekjUserEntity 。
/*** 5、接收json数据(以实体类方式)* {* "userName":"qizhekj",* "age":/4* }* @return*/@RequestMapping("/demo06")@ResponseBodypublic String demo06(@RequestBody QizekjUserEntity qizekjUserEntity) {return qizekjUserEntity.toString();}

使用postman访问接口:

在这里插入图片描述

{"userName":"qizekj","age":4,"qizekjUserInfo":{"addres":"HeFei"}
}

4、以Map方式接收

  • json数据,key为Map的key,value为Map的value。
  • 注意json数据的value与Map集合的value类型需保持一致,否则报错。
/*** 6、接收json数据(以Map方式接收)* @param paramMap* @return*/
@RequestMapping("/demo07")
@ResponseBody
public String demo07(@RequestBody Map paramMap) {return paramMap.toString();
}

用postman访问:
在这里插入图片描述

5、以List方式接收

/*** 7、接收json数据(以List集合方式接收),以json数组的形式传递数据* @param list* @return*/
@RequestMapping("/demo8")
@ResponseBody
public String demo8(@RequestBody List list) {return list.toArray().toString();
}/*** 8、接收json数据(以List集合方式接收),以json对象的形式传递数据* @param list* @return*/
@RequestMapping("/demo9")
@ResponseBody
public String demo9(@RequestBody List list) {return list.toArray().toString();
}
  • 以json数组的形式传递数据
["qizekj","4"
]

在这里插入图片描述

  • 以json对象的形式传递数据
[{"userName": "qizekj","age": "4"},{"userName": "chenqun","age": "32"}
]

在这里插入图片描述

三、SpringMVC 响应json数据

  1. 在接口上加上@ResponseBody注解,是表示根据该方法返回值,返回对应json数据。底层是根据返回值,序列化成json数据。
  2. @RestController注解,是标记该控制类所有接口都是返回json数据。
    eg:
@RestController
public class QizekjRestController {}

@Controller
@ResponseBody

四、使用HttpServletRequest 获取参数

springmvc底层基于Servlet实现的。

获取httprequest/response三种方式:

  1. public String qizekj(HttpServletRequest request,HttpServletResponse response)
  2. HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
  3. @Autowired

eg:

 /*** 获取到我们的 HttpServletRequest httpServletRequest** @param id* @param name* @param httpServletRequest* @return*/@RequestMapping(value = "/httprequestDemo01", method = RequestMethod.GET)@ResponseBodypublic String httprequestDemo01(Integer id, String name, HttpServletRequest httpServletRequest) {System.out.println("id:" + id);System.out.println("name:" + name);String reqId = httpServletRequest.getParameter("id");String reqName = httpServletRequest.getParameter("name");System.out.println("reqId:" + reqId);System.out.println("reqName:" + reqName);/*** 2.HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();*/// 从ThreadLocal获取HttpServletRequest  springmvc 底层基于Servlet 提前缓存好了ttpServletRequestHttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();return "ok---get";}/*** 获取到我们的 HttpServletRequest httpServletRequest** @param id* @param name* @return*/@RequestMapping(value = "/httprequestDemo02", method = RequestMethod.GET)@ResponseBodypublic String httprequestDemo02(Integer id, String name) {System.out.println("id:" + id);System.out.println("name:" + name);/*** 2.HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();*/// 从ThreadLocal获取HttpServletRequest  springmvc 底层基于Servlet 提前缓存好了ttpServletRequestHttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();String reqId = request.getParameter("id");String reqName = request.getParameter("name");System.out.println("reqId:" + reqId);System.out.println("reqName:" + reqName);return "ok---get";}

五、springmvc restful简单介绍

1、什么是restful

Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格规范。基于这个风格设计的软件可以更简洁,更有层次。

资源操作:使用POST、DELETE、PUT、GET,使用不同方法对资源进行操作。

传统方式操作资源:通过不同的参数来实现不同的效果,post 和 get。
http://127.0.0.1/qizekj/getUser?id=1 查询,GET,查询用户id为1信息
http://127.0.0.1/qizekj/saveUser 新增,POST
http://127.0.0.1/qizekj/updateUser 更新,POST
http://127.0.0.1/qizekj/deleteUser?id=1 删除,GET ,删除用户id为1信息
(查询、删除)一般用GET,写操作(新增、修改)一般用POST

使用RESTful操作资源:可以通过不同的请求方式来实现不同的效果。
例如:请求地址一样,但是实现的效果不一样。例如
发送请求GET执行查询、 发送POST 执行新增、发送PUT执行更新、发送DELETE 执行删除
http://127.0.0.1/user/1 查询,GET
http://127.0.0.1/user 新增数据,POST
http://127.0.0.1/user 更新,PUT
http://127.0.0.1/user/1 删除,DELETE

根据发送不同的类型(GET 、POST 、PUT、DELETE等),判断访问不同的接口。

2、restful案例演示

在@RequestMapping的value中使用URI template({变量名}),然后在@RequestMapping注解方法的需要绑定的参数前,使用@PathVariable指定变量名(如果变量名和参数名一致也可以不指定),从而将URL中的值绑定到参数上。

@RequestMapping组合注解
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping

package com.qizekj.controller;import com.qizekj.entity.QizekjUserEntity;
import org.springframework.web.bind.annotation.*;/*** @author chenqun* @date 2023/3/18 22:13*/
@RestController
public class QizekjRestfulController {//Restful api 请求地址都是一样 根据不同请求方法判断/*** 1、提供根据id查询接口 ---请求方法类型为get,指定请求类型为get* /user/{id}  /user/1*/
//  @RequestMapping(value = "/user/{id}", method = RequestMethod.GET)@GetMapping(value = "/user/{id}")public QizekjUserEntity getUser(@PathVariable("id") Integer id) {System.out.println("[getUser] id:" + id);return new QizekjUserEntity("qizekj" + id, 22);}/***2、根据id删除数据 发送请求类型 delete* @param id* @return*/
//  @RequestMapping(value = "/user/{id}", method = RequestMethod.DELETE)@DeleteMapping(value = "/user/{id}")public String deleteUser(@PathVariable("id") Integer id) {System.out.println("[deleteUser] id:" + id);return "ok:id" + id;}/*** 3、新增添加数据 Post类型 传递 json数据* @return*/
//  @RequestMapping(value = "/user", method = RequestMethod.POST)@PostMapping(value = "/user")public String addUser(@RequestBody QizekjUserEntity qizekjUserEntity) {System.out.println("[addUser] qizekjUserEntity:" + qizekjUserEntity);return "ok";}/*** 4、修改数据 put类型 传递 json数据* @return*/
//  @RequestMapping(value = "/user", method = {RequestMethod.PUT})@PutMapping(value = "/user")public String updateUser(@RequestBody QizekjUserEntity qizekjUserEntity) {System.out.println("[updateUser] qizekjUserEntity:" + qizekjUserEntity);return "ok";}/***  @RequestMapping 没有指定请求方法 则 包含所有请求类型 get、put、post等 指定请求方法类型 method = RequestMethod.PUT*/
}

相关内容

热门资讯

全网最详细,Jmeter性能测... 目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目...
刑释解教人员安置帮教工作计划 刑释解教人员安置帮教工作计划  为切实做好刑满解教人员的安置帮教工作,预防和减少重新犯罪,降低恶性案...
语文教学工作计划 有关语文教学工作计划四篇  时间真是转瞬即逝,我们的工作又将在忙碌中充实着,在喜悦中收获着,让我们对...
办公室工作计划 关于办公室工作计划范文合集十篇  时间真是转瞬即逝,成绩已属于过去,新一轮的工作即将来临,来为以后的...
记一次Excel模板导出功能 前言 这篇文章是要记载在开发过程中实现:使用自己定义的excel模板文件,将list数据填入模板文件...
学校教师德育工作计划 学校教师德育工作计划  时间过得太快,让人猝不及防,我们的工作又将迎来新的进步,是时候开始写工作计划...
秋季幼儿园保育工作计划 秋季幼儿园保育工作计划(精选3篇)  时间真是转瞬即逝,我们的工作又迈入新的阶段,让我们一起来学习写...
八年级英语教学工作计划 八年级英语教学工作计划合集15篇  光阴迅速,一眨眼就过去了,很快就要开展新的工作了,现在的你想必不...
学校工作计划 【精品】学校工作计划合集8篇  光阴如水,我们又将迎来新一轮的努力,不妨坐下来好好写写工作计划吧。相...
样式声明——文本属性 系列文章目录 前端系列文章——传送门 CSS系列文章——传送门 文章目录系列文章目录1.文本的颜色...
springcloud3 Se... 一 分布式事务 1.1 分布式事务 一次业务操作需要跨多个数据源或者需要跨多个系统进行远程调用&#x...
Hadoop--万恶NameN... 每次用到Hadoop集群时NameNode总有各种各样奇奇怪怪的问题启动不了或者hdfs用9870端...
小学安全工作计划 【精选】小学安全工作计划汇编8篇  日子如同白驹过隙,我们又将迎来新一轮的努力,为此需要好好地写一份...
小学综合实践工作计划 小学综合实践工作计划(精选20篇)  光阴迅速,一眨眼就过去了,我们又有了新的工作,是时候认真思考工...
机器人误差动力学与PID控制 #机器人 #控制 #误差动力学 #设定点控制 #计算力矩控制器 #PID控制 详细可参考书本:《现代...
3.19百度移动端 一连三... 记录一下第一次面试过程,积德求offer😭 预约的3.19上午九点的面...
如何学习深度学习 深度学习是机器学习领域中的一个分支,它通过多层神经网络来建模和解决各种问题。深度学习已...
秋季学期幼儿园教师的工作计划 2021年秋季学期幼儿园教师的工作计划(精选5篇)  时间过得真快,总在不经意间流逝,我们的工作又迈...
小学班级工作计划 小学班级工作计划(通用17篇)  时间过得飞快,我们的工作又进入新的阶段,为了今后更好的工作发展,此...
0-1背包问题dp[][]/d... 先推荐个视频b站算法训练营一、类型1,重量限制题目:给定N个物品,每个物...