当前位置: 首页 > news >正文

SpringMVC数据接收(全面/详细注释)

 SpringMVC涉及组件:

  1. DispatcherServlet :  SpringMVC提供,我们需要使用web.xml配置使其生效,它是整个流程处理的核心,所有请求都经过它的处理和分发![ CEO ]
  2. HandlerMapping :  SpringMVC提供,我们需要进行IoC配置使其加入IoC容器方可生效,它内部缓存handler(controller方法)和handler访问路径数据,被DispatcherServlet调用,用于查找路径对应的handler![秘书]
  3. HandlerAdapter : SpringMVC提供,我们需要进行IoC配置使其加入IoC容器方可生效,它可以处理请求参数和处理响应数据数据,每次DispatcherServlet都是通过handlerAdapter间接调用handler,他是handler和DispatcherServlet之间的适配器![经理]
  4. Handler : handler又称处理器,他是Controller类内部的方法简称,是由我们自己定义,用来接收参数,向后调用业务,最终返回响应结果![打工人]
  5. ViewResovler : SpringMVC提供,我们需要进行IoC配置使其加入IoC容器方可生效!视图解析器主要作用简化模版视图页面查找的,但是需要注意,前后端分离项目,后端只返回JSON数据,不返回页面,那就不需要视图解析器!所以,视图解析器,相对其他的组件不是必须的![财务]

1.快速体验使用MVC接收数据

  1. 在Maven项目中新建模块并转换成Web项目

  2. 导入依赖

    <properties><spring.version>6.0.6</spring.version><servlet.api>9.1.0</servlet.api><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties><dependencies><!-- springioc相关依赖  --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><!-- web相关依赖  --><!-- 在 pom.xml 中引入 Jakarta EE Web API 的依赖 --><!--在 Spring Web MVC 6 中,Servlet API 迁移到了 Jakarta EE API,
    因此在配置 DispatcherServlet 时需要使用Jakarta EE 提供的相应类库和命名空间。--><dependency><groupId>jakarta.platform</groupId><artifactId>jakarta.jakartaee-web-api</artifactId><version>${servlet.api}</version><scope>provided</scope></dependency><!-- springwebmvc相关依赖  --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency></dependencies>
  3. 创建Controller类

    @Controller
    @RequestMapping("param")
    public class ParamController {//后端直接接收//  /param/data?name=root&age=18//  形参列表,填写对应名称的参数即可!  请求参数名 = 形参参数名即可!//  1. 名称相同  2.可以不传递 不报错@RequestMapping("data")@ResponseBodypublic String data(String name,int age){System.out.println("接收到:name = " + name + ", age = " + age);return "成功给前端返回:name = " + name + ", age = " + age;}
    }
  4. Spring MVC核心组件配置类

    @Configuration
    @ComponentScan("com.example")
    public class MvcConfig {//@Bean方式配置handlerMapper和handlerAdapter@Beanpublic RequestMappingHandlerMapping handlerMapping(){return  new RequestMappingHandlerMapping();}@Beanpublic RequestMappingHandlerAdapter handlerAdapter(){return  new RequestMappingHandlerAdapter();}
    }
  5. SpringMVC环境搭建

    /*** description: 可以被web项目加载,会初始化ioc容器,会设置dispatcherServlet的地址* @author UserName*/
    public class SpringMvcInit extends AbstractAnnotationConfigDispatcherServletInitializer {// service mapper层的ioc容器的配置@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[0];}// 设置我们项目对应的配置 springmvc controller@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{MvcConfig.class};}// 配置springmvc内部自带servlet 的访问地址 !@Overrideprotected String[] getServletMappings() {return new String[]{ "/"};}
    }
  6. 运行测试      ​​​​​

2.SpringMVC数据接收

@ResponseBody注解

用来标识方法或者方法返回值,表示方法的返回值是要直接返回给客户端的数据,而不是由视图解析器来解析并渲染生成响应体(viewResolver没用)。

    1.访问路径设置

        1.1 在@RequestMapping注解指定精确地址匹配。
@Controller
public class HelloController {@RequestMapping("springmvc/hello") //对外访问的地址 到handlerMapping注册的注解@ResponseBody  //直接返回字符串给前端,不要找视图解析器!!!public String hello(){System.out.println("HelloController.hello");//返回给前端return "hello springmvc!!";}
}
        1.2 通过使用通配符,匹配多个类似的地址。
@Controller
public class HelloController {@RequestMapping("springmvc/*")@ResponseBody  //直接返回字符串给前端,不要找视图解析器!!!public String handleAllBooks() {// 匹配所有以 /books/ 开头的路径System.out.println("匹配到一层springmvc/*");return "一层springmvc/*";}@RequestMapping("springmvc/**")@ResponseBody  //直接返回字符串给前端,不要找视图解析器!!!public String handleBookDetails() {// 匹配所有以 /books/ 开头的路径及其子路径System.out.println("匹配到多层springmvc/**");return "多层springmvc/**";}
}

                运行访问:

###
GET http://localhost:8080/springmvc/aaa
###
GET http://localhost:8080/springmvc/aaa/bb//输出:
springmvc/*
springmvc/**
        1.3 标记类+标记handler方法
@Controller
@RequestMapping("springmvc")
public class HelloController {@RequestMapping("hello")//底层是字符串拼接,但mvc会自动加“/”号@ResponseBody  //直接返回字符串给前端,不要找视图解析器!!!public String hello() {System.out.println("hello mvc");return "hello mvc";}
}

                运行访问:

###
GET http://localhost:8080/springmvc/aaa/bb//输出:
hello mvc
        1.4 附带请求方式限制

默认情况下:@RequestMapping("/logout") 任何请求方式都可以访问!

@RequestMapping(value="/login",method=RequestMethod.GET)
等于->
@GetMapping(value="/login")

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping

可以特定指定,但违背请求方式,会出现405异常!!!:

@Controller
public class UserController {/*** method = RequestMethod.POST 可以指定单个或者多个请求方式!* 注意:违背请求方式会出现405异常!*/@RequestMapping(value = {"/user/login"} , method = RequestMethod.POST)@ResponseBodypublic String login(){System.out.println("UserController.login");return "login success!!";}
//    @PostMapping(value = {"/user/login"})
//    @ResponseBody
//    public String login1(){
//        System.out.println("UserController.login");
//       return "login success!!";
//    }@RequestMapping(value = {"/user/register"},method = {RequestMethod.POST, RequestMethod.GET})@ResponseBodypublic String register(){System.out.println("UserController.register");return "register success!!";}}

 2.param参数接收

@Controller
@RequestMapping("param")
public class ParamController {//后端直接接收//  /param/data?name=root&age=18//  形参列表,填写对应名称的参数即可!  请求参数名 = 形参参数名即可!//  1. 名称相同  2.可以不传递 不报错@RequestMapping("data")@ResponseBodypublic String data(String name,int age){System.out.println("name = " + name + ", age = " + age);return "成功给后台返回:name = " + name + ", age = " + age;}//注解指定//指定任意的请求参数名  要求必须传递  要求不必须传递 给与一个默认值// /param/data1?account=root&page=1// account必须传递   page可以不必须传递,如果不传递默认值就是1/*** @RequestParam -> 形参列表  指定请求参数名 或者是否必须传递 或者 非必须传递设置默认值*                用法: @RequestParam(value="指定请求参数名,如果形参名和请求参数名一致,可以省略!",*                                    required = false 前端是否必须传递此参数,默认是必须 , 不传400异常!,*                                    defaultValue = "1" 当非必须传递 false ,可以设置默认值)*/@GetMapping("data1")@ResponseBodypublic String data1(@RequestParam(value = "account") String username,@RequestParam(required = false,defaultValue = "1") int page){System.out.println("username = " + username + ", page = " + page);return "username = " + username + ", page = " + page;}//特殊值// 一名多值   key=1&key=2 直接使用集合接值即可//param/data2?hbs=吃&hbs=玩&hbs=学习//不加注解@RequestParam 将 hbs对应的一个字符串直接赋值给集合! 类型异常!//加了注解,经理就会将集合 add加入对应的字符串@GetMapping("data2")@ResponseBodypublic String data2(@RequestParam List<String> hbs){System.out.println("hbs = " + hbs);return "ok";}//使用实体对象接值   用户注册(用户的信息)    -》    对应的实体类   -》     插入到数据库 表//param/data3?name=二狗子&age=18 准备一个对应属性和get|set方法的实体类即可! -> 形参列表声明对象参数即可!@RequestMapping("data3")@ResponseBodypublic String data3(User user){System.out.println("user = " + user);return user.toString();}
}

测试data3:

3. 动态路径参数接收

动态路径设计: /user/{动态部分}/{动态部分}

@Controller
@RequestMapping("path")
@ResponseBody
public class PathController {//  path/账号/密码//动态路径设计  {key} =  *  {key} 在形参列表获取传入的参数//接受路径参数  String account,String password -> 接受param格式参数// 必须使用 @PathVariable@RequestMapping("{account}/{password}")public String login(@PathVariable(value = "account") String username, @PathVariable String password){System.out.println("username = " + username + ", password = " + password);return "username = " + username + ", password = " + password;}
}

运行测试:

4. JSON参数接收

前端传递 JSON 数据时,Spring MVC 框架可以使用 @RequestBody 注解来将 JSON 数据转换为 Java 对象。@RequestBody 注解表示当前方法参数的值应该从请求体中获取,并且需要指定 value 属性来指示请求体应该映射到哪个参数上

实体类:
public class Person {private String name;private int age;private String gender;// getter 和 setter 略
}
使用 @RequestBody 注解
@RequestMapping(value = "json")
@Controller
@ResponseBody
public class JsonController {@PostMapping("data")public String data(@RequestBody Person person) {System.out.println("person = " + person);return person.toString();}
}
pom.xml 加入jackson依赖
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.15.0</version>
</dependency>
使用@EnableWebMvc配置
/*TODO: 导入handlerMapping和handlerAdapter的三种方式
1.自动导入handlerMapping和handlerAdapter [推荐]
2.可以不添加,springmvc会检查是否配置handlerMapping和handlerAdapter,没有配置默认加载
3.使用@Bean方式配置handlerMapper和handlerAdapter
*/
@EnableWebMvc//handlerAdapter配置了json转化器
@Configuration
@ComponentScan("com.example")
public class MvcConfig {//@Bean//public RequestMappingHandlerMapping handlerMapping(){//   return  new RequestMappingHandlerMapping();//}//@Bean//public RequestMappingHandlerAdapter handlerAdapter(){//    return  new RequestMappingHandlerAdapter();//}
}
运行测试:

或者前端使用Axios:

axios.post('/json/datas', {name: "Lucy",age: 18,gender: "man"
})

 5.Cookie参数接收

    1. 定义向响应中添加Cookie数据的方法。创建了一个名为 "cookieName",值为 "root" 的Cookie,并通过 response.addCookie(cookie) 将其添加到响应中,成功后返回“ok”。
    2.使用 @CookieValue 注解来接收名为 "cookieName" 的Cookie的值。
@Controller
@RequestMapping("cookie")
@ResponseBody
public class CookieController {@GetMapping("save")public String save(HttpServletResponse response){Cookie cookie = new Cookie("cookieName","这是一个cookieName");response.addCookie(cookie);return "ok";}@RequestMapping("data")public String data(@CookieValue(value = "cookieName") String value){System.out.println("value = " + value);return value;}
}
运行测试:

                

6.  请求头数据接收

@Controller
@RequestMapping("header")
@ResponseBody
public class HeaderController {@GetMapping("data")public String data(@RequestHeader("Host") String host){System.out.println("host = " + host);return "host = " + host;}
}

相关文章:

SpringMVC数据接收(全面/详细注释)

SpringMVC涉及组件&#xff1a; DispatcherServlet : SpringMVC提供&#xff0c;我们需要使用web.xml配置使其生效&#xff0c;它是整个流程处理的核心&#xff0c;所有请求都经过它的处理和分发&#xff01;[ CEO ]HandlerMapping : SpringMVC提供&#xff0c;我们需要进行…...

golang 冒泡、选择、插入、快速排序法

个人学习笔记&#xff5e; 1. 冒泡排序 // Author sunwenbo // 2024/4/6 22:37 /* 1. 一共会经过arr.length -1 次的轮数比较&#xff0c;每一轮将会确认一个数的位置 2. 每一轮的比较次数逐渐的减少 [4,3,2,1] 3. 当发现前面的一个数比后面的一个数大的时候&#xff0c;就进行…...

vue3 +Taro 页面实现scroll-view 分页功能

需求 现在分页列表 后端只给你一个分页的数据列表 没有总页数 没有当前的分页 页数 只有这么一个list 、、、 如何去分页 我这使用的是scroll-view 组件 滑动到底部的事件 根据你当前设定的每页的数据数量和后端返回给你的数据列表数量 当某一次分页 两个数量不相等了以后 就…...

【http】常见http headers

相关文章&#xff1a;http 状态码 和http methods及restful api 常见http headers 1 常见的Request Headers Accept 浏览器可接收的数据格式 Accept-Encoding 浏览器可接收的压缩算法&#xff0c;gzip Accept-language 浏览器可接收的语言 Connection:keep-alive 一次TCP连接…...

Web App 入门指南:构建预测模型 App 的利器(shiny)

Web App 入门指南&#xff1a;构建预测模型 App 的利器 简介 近年来&#xff0c;随着机器学习和人工智能技术的快速发展&#xff0c;预测模型在各行各业得到了广泛应用。为了方便地部署和使用预测模型&#xff0c;将模型构建成 Web App 是一种非常好的选择。Web App 无需下载…...

6.7物联网RK3399项目开发实录-驱动开发之Camera摄像头的使用(wulianjishu666)

90款行业常用传感器单片机程序及资料【stm32,stc89c52,arduino适用】 链接&#xff1a;https://pan.baidu.com/s/1M3u8lcznKuXfN8NRoLYtTA?pwdc53f Camera 使用 简介 AIO-3399J 开发板分别带有两个 MIPI&#xff0c;MIPI 支持最高 4K 拍照&#xff0c;并支持 1080P 30fp…...

OSCP靶场-- Sybaris

OSCP靶场–Sybaris 考点(redis MODULE LOAD命令执行) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.158.93 -sV -sC -Pn --min-rate 2500 -p- Starting Nmap 7.92 ( https://nmap.org ) at 2024-04-11 04:24 EDT Nmap scan report for 192.168.158.93…...

MyBatis 执行流程

加载配置文件:MvBatis 的执行流程从加载配置文件开始。通常&#xff0c;MyBatis 的配置文件是一个 XML 文件&#xff0c;其中包含了数据源配置、SQL 映射配置、连接池配置等信息。构建 SqlSessionFactory:在配置文件加载后&#xff0c;MyBatis 使用配置信息来构建 SqlSessionFa…...

android11 SystemUI入門之KeyguardPatternView解析

view层级树为&#xff1a; 被包含在 keyguard_host_view.xml中 。 <?xml version"1.0" encoding"utf-8"?> <!-- This is the host view that generally contains two sub views: the widget viewand the security view. --> <com.andro…...

doss攻击为什么是无解的?

这个让Google、亚马逊等实力巨头公司也无法避免的攻击。可以这么说&#xff0c;是目前最强大、最难防御的攻击之一&#xff0c;属于世界级难题&#xff0c;并且没有解决办法。 Doss攻击的原理不复杂&#xff0c;就是利用大量肉鸡仿照真实用户行为&#xff0c;使目标服务器资源…...

2. 如何让mybatis-plus的逻辑删除注解@TableLogic临时失效

文章目录 如何让mybatis-plus的逻辑删除注解TableLogic临时失效1. 场景复现1.1 controller代码1.2 service层代码1.3 entity代码 2. 问题分析3. 解决方案3.1 说明3.2 核心代码3.3 service方法对应修改为3.4 运行结果 如何让mybatis-plus的逻辑删除注解TableLogic临时失效 1. 场…...

基于单片机的智能窗帘系统设计

摘要: 介绍了一种智能窗帘系统,该系统由单片机STC89C52 为控制核心,光照控制电路采用光敏电阻和ADC0832 芯片,步进电机驱动电路采用ULN2003 芯片,以达到不同光照强度下窗帘的自动启闭。仿真和实物结果显示,该系统实用性强,应用范围广,具有很好的应用前景。 关键词: 单片…...

代码随想录 Day17 字符串 | LC344 反转字符串 LC541 反转字符串II 卡码网54替换数字

一、反转字符串 题目&#xff1a; 力扣344&#xff1a;反转字符串 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题…...

LeetCode 刷题汇总——题目序号顺序版

剑指 Offer——和为 S 的两个数字 剑指 Offer——数字在排序数组中出现的次数 剑指 Offer——和为 S 的连续正数序列 剑指 Offer——最小的 K 个数 剑指 Offer——连续子数组的最大和 剑指 Offer——数组中的逆序对 LeetCode 1——两数之和 LeetCode 2——两数相加 LeetCode 3…...

【Java】JDK1.8 HashMap源码,put源码详细讲解

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 在Java中&#xff0c;HashMap结构是被经常使用的&#xff0c;在面试当中也是经常会被问到的。这篇文章我给大家分享一下我对于HashMap结构源码的理解。 HashMap的存储与一般的数组不同&#xff0c;HashMap的每一个元素存…...

自定义注解进行数据转换

前言&#xff1a; Java注解是一种元数据机制&#xff0c;可用于方法&#xff0c;字段&#xff0c;类等程序上以提供关于这些元素的额外信息。 以下内容是我自己写的一个小测试的demo,参考该文章进行编写&#xff1a;https://blog.csdn.net/m0_71621983/article/details/1318164…...

React - 你知道在React组件的哪个阶段发送Ajax最合适吗

难度级别:中级及以上 提问概率:65% 如果求职者被问到了这个问题,那么只是单纯的回答在哪个阶段发送Ajax请求恐怕是不够全面的。最好是先详细描述React组件都有哪些生命周期,最后再回过头来点题作答,为什么应该在这个阶段发送Ajax请求。那…...

spa、vue、elementUi

spa (single page application). 动态重写当前页面而非从服务器重新加载整个新页面。使应用程序更像一个桌面应用程序。所有的html、javascript、css通过单个页面检索加载资源。前端页面使用ajax与后端通信。一个项目只有一个html页面。所有的页面跳转都通过路由导航。 vue可用…...

tcp接受命令执行并回显

为了实现循环执行命令并能够多次从TCP客户端接收命令&#xff0c;您需要对上面的代码进行一些修改。下面是一个修改后的示例&#xff0c;它将在接收到新的TCP连接后进入一个循环&#xff0c;不断地读取命令、执行命令&#xff0c;并将结果发送回客户端&#xff0c;直到客户端断…...

LLMs之ToolAlpaca:ToolAlpaca(通用工具学习框架/工具使用语料库)的简介、安装和使用方法、案例应用之详细攻略

LLMs之ToolAlpaca&#xff1a;ToolAlpaca(通用工具学习框架/工具使用语料库)的简介、安装和使用方法、案例应用之详细攻略 目录 ToolAlpaca的简介 0、《ToolAlpaca: Generalized Tool Learning for Language Models with 3000 Simulated Cases》翻译与解读 1、数据集列表 2…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...