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;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/803106.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零开始:一步步学习爬虫技术的实用指南(一)

从零开始&#xff1a;一步步学习爬虫技术的实用指南&#xff08;一&#xff09; Urllib1.什么是互联网爬虫2.爬虫核心3.爬虫的用途4.爬虫的分类4.1 通用爬虫&#xff1a;4.1 聚焦爬虫&#xff1a; 5.反爬手段5.1 User‐Agent&#xff1a;5.2.代理IP5.3.验证码访问5.4.动态加载网…

11.python的字典dict(下) 遍历字典,结构优化

11.python的字典dict(下) 遍历所有的键值对 items()方法是字典的一个内置方法&#xff0c;用于返回字典中所有键值对的视图&#xff08;view&#xff09;。它返回一个可迭代的对象&#xff0c;每个元素都是一个包含键和对应值的元组。 下面用一个例子来说明items()方法的用法…

Vue中Suspense组件详细介绍

<Suspense> 是一个内置组件&#xff0c;用来在组件树中协调对异步依赖的处理。它让我们可以在组件树上层等待下层的多个嵌套异步依赖项解析完成&#xff0c;并可以在等待时渲染一个加载状态。 异步依赖​ 要了解 <Suspense> 所解决的问题和它是如何与异步依赖进行交…

服务器负载均衡原理及算法

服务器负载均衡原理及算法 一、引言 随着互联网技术的飞速发展&#xff0c;网络服务的需求日益增长&#xff0c;单台服务器的性能往往难以满足大规模并发访问的需求。因此&#xff0c;服务器负载均衡技术应运而生&#xff0c;它能够有效地将网络请求分发到多台服务器上&#…

[C++/Linux] UDP编程

一. UDP函数 UDP&#xff08;用户数据报协议&#xff0c;User Datagram Protocol&#xff09;是一种无连接的网络协议&#xff0c;用于在互联网上交换数据。它允许应用程序发送数据报给另一端的应用程序&#xff0c;但不保证数据报能成功到达&#xff0c;也就是说&#xff0c;它…

双指针2s总结

5.双指针 双指针理论基础 那么vector< char > 和 string 又有什么区别呢&#xff1f; 其实在基本操作上没有区别&#xff0c;但是 string提供更多的字符串处理的相关接口&#xff0c;例如string 重载了&#xff0c;而vector却没有。 所以想处理字符串&#xff0c;我们…

Java常用类(二)

常用类&#xff08;二&#xff09; Object类 超类&#xff0c;基类&#xff0c;所有类的直接或间接父类&#xff0c;位于继承树的最高层任何类&#xff0c;如没有书写extends显示继承某个类&#xff0c;都默认直接继承Object类&#xff0c;否则为间接继承Object类中所定义的方…

C语言题目:数组寻找最小绝对值

题目描述 输入10个数&#xff0c;找出其中绝对值最小的数&#xff0c;将它和最后一个数交换&#xff0c;然后输出这10个数。 输入格式 十个数 输出格式 交换后的十个数 样例输入 10 2 30 40 50 60 70 80 90 100 样例输出 10 100 30 40 50 60 70 80 90 2 代码解析 包含…

扫描IP开放端口该脚本用于对特定目标主机进行常见端口扫描(加载端口字典)或者指定端口扫描,判断目标主机开

扫描IP开放端口该脚本用于对特定目标主机进行常见端口扫描(加载端口字典)或者指定端口扫描,判断目标主机开 #/bin/bash #该脚本用于对特定目标主机进行常见端口扫描(加载端口字典)或者指定端口扫描,判断目标主机开放来哪些端口 #用telnet方式 IP$1 #IP119.254.3.28 #获得IP的前…

BUUCTF刷题十一道(12)SSTI专题一

文章目录 学习文章[Flask]SSTI[GWCTF 2019]你的名字[第三章 web进阶]SSTI[pasecactf_2019]flask_ssti[NewStarCTF 公开赛赛道]BabySSTI_One[Dest0g3 520迎新赛]EasySSTI[NewStarCTF 公开赛赛道]BabySSTI_Two[NewStarCTF 公开赛赛道]BabySSTI_Three[GYCTF2020]FlaskApp[CSCCTF 2…

网易云歌曲评论抓取

网易云歌曲评论爬取 步骤1.找到一首歌曲2.按下F12键打开开发者模式,对其进行抓包3.查找获得评论数据的接口4.对获得评论数据接口进行分析5.构建加密函数方法一方法二运行结果全部代码使用Js文件只使用python新的代码小结与展望这次的任务是获取网易云音乐下面的评论,涉及的知…

List接口(1) | ArrayList

参考阅读&#xff1a;ArrayList 源码分析 一、特点 ArrayList 继承于 AbstractList &#xff0c;实现了 List, RandomAccess, Cloneable, java.io.Serializable 这些接口&#xff0c;具有以下特点&#xff1a; 支持添加&#xff0c;删除和查找操作支持随机快速访问&#xff…

前端ocr技术:electron+vue3中使用tesseract插件识别图片中字符

同学们可以私信我加入学习群&#xff01; 正文开始 前言一、electron各种csp问题二、试用插件总结 前言 项目需要ocr技术识别图片中的中文字符&#xff0c;本来这部分是后端的工作&#xff0c;但是因为各种原因&#xff0c;决定前端也做一个版本。 在ai时代之前&#xff0c;o…

基于spring boot的漫画之家系统

基于spring boot的漫画之家系统设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&…

pta L1-012 计算指数

L1-012 计算指数 分数 5 全屏浏览 切换布局 作者 陈越 单位 浙江大学 真的没骗你&#xff0c;这道才是简单题 —— 对任意给定的不超过 10 的正整数 n&#xff0c;要求你输出 2n。不难吧&#xff1f; 输入格式&#xff1a; 输入在一行中给出一个不超过 10 的正整数 n。 …

Java排序算法

冒泡排序 相邻两个元素比较&#xff0c;每次排序获得一个当前排序区间的最大值 // 冒泡排序 // 外层循环每次最后一个元素已经是最大的了&#xff0c;所以每次循环都减少一个元素 for (int i arr.length - 1; i >0; i--) {// 内层循环每次都是从第一个元素开始&#xff0c;…

鲁棒线性模型估计(Robust linear model estimation)

鲁棒线性模型估计 1.RANSAC算法1.1 算法的基本原理1.2 迭代次数N的计算1.3 参考代码 参考文献 当数据中出现较多异常点时&#xff0c;常用的线性回归OLS会因为这些异常点的存在无法正确估计线性模型的参数&#xff1a; W ( X T X ) − 1 X T Y \qquad \qquad W(X^TX)^{-1}X^T…

力扣热题100_链表_19_删除链表的倒数第 N 个结点

文章目录 题目链接解题思路解题代码 题目链接 19. 删除链表的倒数第 N 个结点 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 示例 2&am…

数据结构—图

图的基本概念 图就是由顶点的有穷非空集合和顶点之间的边组成的集合。通常表示为&#xff1a;G(V,E)&#xff0c;其中&#xff0c;G 表示一个图&#xff0c;V 表示顶点的集合&#xff0c;E 表示边的集合。 顶点 图中的数据元素&#xff0c;我们称之为顶点&#xff0c;图至少有…

2024年3月电子学会青少年软件编程 中小学生Python编程等级考试一级真题解析(判断题)

2024年3月Python编程等级考试一级真题解析 判断题&#xff08;共10题&#xff0c;每题2分&#xff0c;共20分&#xff09; 26、turtle 画布的坐标系原点是在画布的左上角 答案&#xff1a;错 考点分析&#xff1a;考查turtle相关知识&#xff0c;turtle画布坐标系是在画布的…