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")
        @ResponseBody
        public 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
        @Bean
        public RequestMappingHandlerMapping handlerMapping(){
           return  new RequestMappingHandlerMapping();
        }
        @Bean
        public RequestMappingHandlerAdapter handlerAdapter(){
            return  new RequestMappingHandlerAdapter();
        }
    }
  5. SpringMVC环境搭建

    /**
     * description: 可以被web项目加载,会初始化ioc容器,会设置dispatcherServlet的地址
     * @author UserName
     */
    public class SpringMvcInit extends AbstractAnnotationConfigDispatcherServletInitializer {
    
        // service mapper层的ioc容器的配置
        @Override
        protected Class<?>[] getRootConfigClasses() {
            return new Class[0];
        }
        
        // 设置我们项目对应的配置 springmvc controller
        @Override
        protected Class<?>[] getServletConfigClasses() {
            return new Class[]{MvcConfig.class};
        }
    
        // 配置springmvc内部自带servlet 的访问地址 !
        @Override
        protected 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)
    @ResponseBody
    public 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})
    @ResponseBody
    public 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")
    @ResponseBody
    public 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")
    @ResponseBody
    public 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")
    @ResponseBody
    public String data2(@RequestParam List<String> hbs){
        System.out.println("hbs = " + hbs);
        return "ok";
    }

    //使用实体对象接值   用户注册(用户的信息)    -》    对应的实体类   -》     插入到数据库 表
    //param/data3?name=二狗子&age=18 准备一个对应属性和get|set方法的实体类即可! -> 形参列表声明对象参数即可!
    @RequestMapping("data3")
    @ResponseBody
    public 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;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高创新 | [24年新算法]NRBO-XGBoost回归+交叉验证基于牛顿拉夫逊优化算法-XGBoost多变量回归预测

高创新 | [24年新算法]NRBO-XGBoost回归交叉验证基于牛顿拉夫逊优化算法-XGBoost多变量回归预测 目录 高创新 | [24年新算法]NRBO-XGBoost回归交叉验证基于牛顿拉夫逊优化算法-XGBoost多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现 [24年新算…

实现 jwt 鉴权- SpringBoot + 微服务

目录 项目结构 主要步骤 auth-service里&#xff1a; 1. 配置 pom.xml 依赖 2. 实现HandlerInterceptor 接口的 preHandle 函数 3. 实现 WebMvcConfigurer 的 addInterceptors 接口 4. 生成 token 和验证 token 5. 登录接口示例 user-service 里&#xff1a; 6. 实现拦…

Netty NioEventLoop详解

文章目录 前言类图主要功能NioEventLoop如何实现事件循环NioEventLoop如何处理多路复用Netty如何管理Channel和Selector管理Channel管理Selector注意事项 前言 Netty通过事件循环机制(EventLoop)处理IO事件和异步任务&#xff0c;简单来说&#xff0c;就是通过一个死循环&…

信息泄露漏洞的JS整改方案

引言 &#x1f6e1;️ 日常工作中&#xff0c;我们经常会面临线上环境被第三方安全厂商扫描出JS信息泄露漏洞的情况&#xff0c;这给我们的系统安全带来了潜在威胁。但幸运的是&#xff0c;对于这类漏洞的整改并不复杂。本文将介绍几种可行的整改方法&#xff0c;以及其中一种…

【C语言】:枚举和联合体

这里写自定义目录标题 1、枚举1.1 枚举类型的声明1.2 枚举类型的优点1.3 枚举类型的使用 2、联合体&#xff08;共用体&#xff09;2.1 联合体类型的声明2.2 联合体的特点2.3联合体大小的计算 1、枚举 1.1 枚举类型的声明 枚举顾名思义就是⼀⼀列举&#xff0c;把可能的取值⼀…

Tomcat以服务方式启动,无法访问网络共享目录问题

关于“Tomcat以服务方式启动&#xff0c;无法访问网络共享目录问题”解决方式如下&#xff1a; 1、通过doc命令【services.msc】打开本地服务找到&#xff0c;找到tomcat服务所在位置 2、右键打开Tomcat服务的属性 3、选择 登陆选项卡 4、选择“此账户”选项&#xff0c;并…

Nginx配置文件修改结合内网穿透实现公网访问多个本地web站点

文章目录 1. 下载windows版Nginx2. 配置Nginx3. 测试局域网访问4. cpolar内网穿透5. 测试公网访问6. 配置固定二级子域名7. 测试访问公网固定二级子域名 1. 下载windows版Nginx 进入官方网站(http://nginx.org/en/download.html)下载windows版的nginx 下载好后解压进入nginx目…

自动驾驶中的多目标跟踪_第二篇

自动驾驶中的多目标跟踪:第二篇 上一节介绍了多目标跟踪的定义、应用场景和类型以及面临的挑战&#xff1b;在这一节&#xff0c;我们回顾贝叶斯滤波&#xff0c;简单介绍运动模型和量测模型&#xff0c;卡尔曼滤波等。 附赠自动驾驶学习资料和量产经验&#xff1a;链接 贝叶…

Spring事务简介,事务角色,事务属性

1.Spring事务简介 事务作用&#xff1a;在数据层保障一系列的数据库操作同成功同失败Spring事务作用&#xff1a;在数据层或业务层保障一系列的数据操作同成功同失败 public interface PlatformTransactionManager{void commit(TransactionStatus status) throws TransactionE…

macU盘在电脑上读不出来 u盘mac读不出来怎么办 macu盘不能写入 Tuxera NTFS for Mac免费下载

对于Mac用户来说&#xff0c;使用U盘是很常见的操作&#xff0c;但有时候可能会遇到Mac电脑无法读取U盘的情况&#xff0c;这时候就需要使用一些特定的工具软件来帮助我们解决问题。本文就来告诉大家macU盘在电脑上读不出来是怎么回事&#xff0c;u盘mac读不出来怎么办。 一、m…

PaddleVideo:onnx模型导出

本文节介绍 PP-TSM 模型如何转化为 ONNX 模型&#xff0c;并基于 ONNX 引擎预测。 1&#xff1a;环境准备 安装 Paddle2ONNX python -m pip install paddle2onnx 安装 ONNXRuntime # 建议安装 1.9.0 版本&#xff0c;可根据环境更换版本号 python -m pip install onnxrunti…

C语言——关于指针运算的例题分析

1.指针运算中关于 sizeof 和 strlen 的例题分析 1. sizeof(数组名)&#xff0c;这⾥的数组名表⽰整个数组&#xff0c;计算的是整个数组的⼤⼩。 2. &数组名&#xff0c;这⾥的数组名表⽰整个数组&#xff0c;取出的是整个数组的地址。 3. 除此之外所有的数组名都表⽰…

【算法每日一练]-动态规划(保姆级教程 篇17 状态压缩)

目录 今日知识点&#xff1a; 把状态压缩成j,dp每行i的布置状态&#xff0c;从i-1和i-2行进行不断转移 把状态压缩成j,dp每行i的布置状态&#xff0c;从i-1行进行状态匹配&#xff0c;然后枚举国王数转移 POJ1185&#xff1a;炮兵阵地 思路&#xff1a; 题目&#xff1a;互…

互联网大厂ssp面经之路:计算机网络part2

什么是 HTTP 和 HTTPS&#xff1f;它们之间有什么区别&#xff1f; a. HTTP&#xff08;超文本传输协议&#xff09;和HTTPS&#xff08;安全超文本传输协议&#xff09;是用于在Web上传输数据的协议。它们之间的区别在于安全性和数据传输方式。 b. HTTP是一种不安全的协议&…

算法训练营第二十一天(二叉树part7)

算法训练营第二十一天&#xff08;二叉树part7&#xff09; 530.二叉搜索树的最小绝对差 力扣题目链接(opens new window) 题目 给你一棵所有节点为非负值的二叉搜索树&#xff0c;请你计算树中任意两节点的差的绝对值的最小值。 示例&#xff1a; 提示&#xff1a;树中至…

原来进制题如此简单

进制相关 二进制数与其他进制数之间的转化 二进制数转其他进制数&#xff08;十进制数除外&#xff09;一般不能直接转化&#xff0c;一般需要过度至十进制数&#xff0c;再转化为其他进制数。同理&#xff0c;其他进制数&#xff08;十进制数除外&#xff09;转二进制数也需过…

flutter多入口点entrypoint

native中引擎对象本身消耗内存(每个引擎对象约莫消耗42MB内存) 多引擎&#xff1a;native多引擎>启动>flutter多入口点entrypoint>多main函数>多子包元素集>多(子)程序 单引擎(复用)&#xff1a;native单引擎>复用启动>flutter多入口点entrypoint>多m…

error:LNK2005 已经在*.obj中定义 的原因分析及对策

LNK2005是一个重复定义错误&#xff0c;造成LNK2005主要有以下几种情况&#xff1a; 目录 全局变量的重复定义 情况A&#xff1a;全局变量在.cpp文件中的多次声明 情况B&#xff1a;变量名重复 头文件的包含重复 解决方案 #ifndef标识符宏定义 pragma once预编译 头文件…

使用yml文件配置python日志

新建一个logging.yml文件&#xff0c;内容如下&#xff1a; logging库提供了多个组件&#xff1a;Logger、Handler、Filter、Formatter&#xff1a; Logger 对象提供应用程序可直接使用的接口&#xff0c;供应用代码使用&#xff1b; Handler 发送日志到适当的目的地&#xff…

PMC管理中落实生产作业计划的思路与方法

在快节奏的现代商业环境中&#xff0c;PMC&#xff08;生产及物料控制&#xff09;管理对于确保企业生产流程的高效运转至关重要。生产作业计划的落实不仅关乎企业的生产效率和成本控制&#xff0c;更是企业竞争力的重要体现。那么&#xff0c;PMC管理中如何有效落实生产作业计…