Spring MVC中获取请求参数的方式

news2024/9/22 11:23:45

在Spring MVC中获取请求方式参数的主要方式有@RequestParam,@PathVariable,@RequestBody,HttpServletRequest,@RequestHeader等方式,接下来我们分别对其请求获取参数的方式进行相关介绍和使用。

@RequestParam

用于获取请求参数,适用于GET和POST请求。例如:

@GetMapping("/example")
public String example(@RequestParam("paramName") String param) {
    // 处理参数
    return "result";
}

优点:

  • 简单易用,适合获取简单的请求参数。
  • 支持设置默认值和必填参数。
  • 可以直接将请求参数映射到方法参数,代码简洁。

缺点:

  • 只适用于GET和POST请求,无法处理复杂数据结构。
  • 对于大量参数时,方法签名可能会变得冗长。

使用场景:

  • 适合处理简单的表单提交或URL查询参数,例如搜索功能、过滤条件等。

@PathVariable

用于获取URL路径中的变量,通常用于RESTful风格的请求。例如:

@GetMapping("/example/{id}")
public String example(@PathVariable("id") Long id) {
    // 处理id
    return "result";
}

优点:

  • 适合RESTful风格的API设计,能够清晰地表达资源的层次结构。
  • URL中直接包含参数,易于理解和使用。

缺点:

  • 只能用于URL路径中的参数,无法处理查询参数。
  • URL结构需要设计得当,可能会影响API的灵活性。

使用场景:

  • 适合RESTful API中的资源操作,例如获取特定用户信息(/users/{id})、删除某个资源等。

@RequestBody

用于获取请求体中的数据,通常用于POST请求,特别是当请求内容是JSON或XML时。例如:

@PostMapping("/example")
public String example(@RequestBody MyObject myObject) {
    // 处理myObject
    return "result";
}

优点:

  • 可以直接将请求体中的复杂对象映射到Java对象,适合处理JSON或XML数据。
  • 支持复杂数据结构,能够处理嵌套对象。

缺点:

  • 需要确保请求体的格式正确,可能会导致解析错误。
  • 不适用于GET请求,因为GET请求没有请求体。

使用场景:

  • 适合处理POST、PUT等请求,尤其是需要提交复杂数据结构的场景,如创建用户、更新资源等。

HttpServletRequest

可以通过注入HttpServletRequest对象来获取请求的所有信息,包括参数、头信息等。例如:

@GetMapping("/example")
public String example(HttpServletRequest request) {
    String param = request.getParameter("paramName");
    // 处理参数
    return "result";
}

优点:

  • 提供了对请求的全面访问,包括参数、头信息、请求方法等。
  • 灵活性高,可以根据需要获取各种信息。

缺点:

  • 代码相对冗长,不够简洁。
  • 需要手动解析参数,增加了出错的可能性。

使用场景:

  • 适合需要访问请求的多个方面,或者在处理请求时需要动态获取参数的场景。

@RequestHeader

用于获取请求头中的参数。例如:

@GetMapping("/example")
public String example(@RequestHeader("Authorization") String authHeader) {
    // 处理请求头
    return "result";
}

优点:

  • 可以方便地获取请求头中的信息,如认证信息、用户代理等。
  • 代码简洁,易于理解。

缺点:

  • 只适用于获取请求头中的参数,无法处理其他类型的请求数据。
  • 对于不常用的请求头,可能会导致代码的可读性下降。

使用场景:

  • 适合需要获取认证信息、跨域请求中的CORS头、或其他特定请求头的场景。

补充

@CookieValue

我们还可以通过 @CookieValue将cookie数据和控制器方法的形参创建映射关系从而将值进行获取

@CookieValue注解一共有三个属性:value、required、defaultValue,用法同@RequestParam

@RequestMapping("/testParam")
    public String testParam(HttpServletRequest request){
        //只要我们在这里获取session,他就会对我们的所有操作绑定一个cookie,前提条件必须执行该方法
        HttpSession session = request.getSession();
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        System.out.println("前端获取的用户名称:"+ username + ";密码" + password);

        return "success";
    }    


/**
     * @RequestHeader注解的作用是将请求头绑定到控制器方法的参数上
     * 如果请求头没有传递,则会报错,如果请求头传递了值,则使用请求头的值
     * 例如defaultValue = "123"
     * @CookieValue注解的作用是将请求头绑定到控制器方法的参数上
     */
    @RequestMapping("/testParam4")
    public String testParam4(@RequestParam("username") String username, @RequestParam("password") String password,
                             @RequestHeader("referer") String referer,
                             @CookieValue("JSESSIONID") String sessionId){
        System.out.println("username:"+ username + ";password:" + password);
        System.out.println("referer:"+ referer);
        System.out.println("sessionId:"+ sessionId);
        return "success";
    }

优点:

  • 可以方便地获取客户端发送的 Cookie 值,适用于需要基于 Cookie 进行身份验证或状态管理的场景。
  • 代码简洁,易于理解。

缺点:

  • 只能获取 Cookie 中的值,无法处理其他类型的请求参数。
  • 需要确保客户端正确设置了 Cookie,否则可能会导致获取失败。

使用场景:

  • 适合需要从 Cookie 中获取信息的场景,例如用户登录状态、用户偏好设置等。

直接从前端传递实体类

可以在控制器方法的形参位置设置一个实体类类型的形参,此时若浏览器传输的请求参数的参数名和实体类中的属性名一致,那么请求参数就会为此属性赋值

<form th:action="@{/testpojo}" method="post">
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    性别:<input type="radio" name="sex" value=""><input type="radio"name="sex" value=""><br>
    年龄:<input type="text" name="age"><br>
    邮箱:<input type="text" name="email"><br>
    <input type="submit">
</form>
@RequestMapping("/testpojo")
public String testPOJO(User user){
    System.out.println(user);
    return "success";
}
//最终结果-->User{id=null, username='张三', password='123', age=23, sex='男',email='123@qq.com'}

乱码问题解决

顺带完成一下我们在Tomcat中因为Tomcat版本问题导致的乱码问题,主要是关于Post的请求会导致乱码问题
tomcat 低于8的版本,我们进入server.xml文件,然后配置如下配置

    <Connector port="8080" URIEncoding="UTF-8" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

解决请求参数的乱码问题,需要在web.xml中使用SpringMVC提供的编码过滤器,CharacterEncodingFilter。

<!--配置springMVC的编码过滤器-->
<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

顺带为了给初学者提供方便,我这里给出完整的web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

  <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <filter>
    <filter-name>HiddenHttpMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>HiddenHttpMethodFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <servlet>
    <servlet-name>SpringMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

</web-app>

通常情况下,@RequestParam和@PathVariable用于简单的参数获取,@RequestBody用于复杂数据结构的处理,而HttpServletRequest和@RequestHeader则提供了更大的灵活性和控制力。根据项目的需求,合理选择合适的方式可以提高代码的可读性和维护性。

补充:
如果你IDEA的配置中全部配置成UTF-8,且你配置了post和get的编码集处理,还是输出中文乱码,请在Tomcat虚拟机配置处配置 -Dfile.encoding=UTF-8

在这里插入图片描述

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

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

相关文章

AMR 机器人底盘分析(补充中)

AMR 机器人底盘分析 1 介绍2 不同轮系底盘类型单舵轮双舵轮底盘四舵轮底盘麦克纳姆轮底盘两驱差速底盘四驱差速底盘单差速总成四差速总成底盘 3 行业专利分析CN220701198U -- 某柔CN110758038A谋星翼*菲谋工 参考 1 介绍 AGV 广泛应用于物流、制造业、安防巡检等领域&#xff…

C语言部分内存函数详解

C语言部分内存函数详解 前言1.memcpy1.1基本用法1.2注意事项**目标空间与原空间不能重叠****目标空间原数据会被覆盖****目标空间要够大****拷贝字节数需小于原空间大小** 1.3模拟实现 2.memmove2.1基本用法2.2注意事项2.3模拟实现 3.memset3.1基本用法 4.memcmp4.1基本用法4.2…

C#使用onnxruntime加载模型,部署到别人的PC上报错

C#使用onnxruntime加载模型&#xff0c;部署到别人的PC上报错 C#使用onnxruntime加载模型&#xff0c;部署到别人的PC上报错解决方案 C#使用onnxruntime加载模型&#xff0c;部署到别人的PC上报错 C#使用onnxruntime加载模型&#xff0c;部署到别人的PC上报错&#xff1a; Sys…

Python Web 应用和数据处理任务库之Redis Queue (RQ) 使用详解

概要 在现代 Web 应用和数据处理任务中,后台任务处理是一个非常重要的部分。Redis Queue (RQ) 是一个使用 Redis 作为消息队列的简单 Python 库,专注于处理异步任务。RQ 易于设置和使用,适用于需要后台处理的 Web 应用或数据处理项目。本文将详细介绍 RQ 库,包括其安装方法…

火狐如何离线继承配置

陪伴自己6年的电脑&#xff0c;因为CPU烧了&#xff0c;导致一些配置没导出来&#xff0c;其中包括浏览器的收藏记录、网站密码。 火狐浏览器离线继承配置 把老电脑的C盘取出&#xff0c;插入硬盘盒中&#xff0c;找到C:\Users\用户名\AppData\Roaming\Mozilla\Firefox\Profile…

【MySQL】JDBC的基础使用

系列文章目录 第一章 数据库基础 第二章 数据库基本操作 第三章数据库约束 第四章表的设计 第五章查询进阶 第六章索引和事务 文章目录 系列文章目录前言一、JDBC基本概念二、JDBC的准备工作三、JDBC-Demo小结 四、JDBC进阶写法总结 前言 在前面对MySQL已经有了基本的认知&am…

分类预测|基于白鲸优化混合核极限学习机结合Adaboost的数据分类预测Matlab程序BWO-HKELM-Adaboost

分类预测|基于白鲸优化混合核极限学习机结合Adaboost的数据分类预测Matlab程序BWO-HKELM-Adaboost 文章目录 前言分类预测|基于白鲸优化混合核极限学习机结合Adaboost的数据分类预测Matlab程序BWO-HKELM-Adaboost 一、BWO-HKELM-Adaboost模型1. 模型组成1.1 白鲸优化算法&#…

Arco Design,字节跳动出品的UI库

Arco Design是字节跳动出品的UI库&#xff0c;支持Vue和React。还是比较美观的。并且Arco Design还提供了中后台模版。但是通过提供的arco-cli连接了github&#xff0c;正常情况下无法构建。但效果还是挺好的&#xff0c;下面是效果图&#xff1a; 更新&#xff1a; 传送门可…

用C#写一个随机音乐播放器

form1中namespce里的代码如下 public partial class Form1 : Form {public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){string folder textBox1.Text;string folderPath folder; // 指定音频文件所在的文件夹路径OpenRandomFi…

C#关于多线程的线程问题

using System.Text; ​ namespace 平时练习8._19day06 {internal class Program{static async Task Main(string[] args){Console.WriteLine(Thread.CurrentThread.ManagedThreadId );StringBuilder sb new StringBuilder();for (int i 0; i < 10000; i){sb.Append("…

嵌入式系统:全面解读与关键要点

嵌入式系统&#xff0c;这个看似专业而遥远的技术词汇&#xff0c;其实早已渗透进了我们日常生活的方方面面。从智能手机到家用电器&#xff0c;再到汽车中的电子控制系统&#xff0c;嵌入式系统无处不在。你是否好奇它们是如何工作的&#xff0c;又有哪些关键点值得我们关注&a…

Android12 显示框架之Transaction----client端

目录&#xff1a;Android显示终极宝典 在前面的章节中&#xff0c;应用通过createSurface()在surfaceflinger中创建了一层layer&#xff0c;紧接着要做的事情就是对这个layer设置一些属性&#xff08;或者叫状态&#xff09;&#xff0c;常设置的属性有位置、大小、z-order等等…

RM悬挂系统

悬挂系统是汽车的车架与车桥或车轮之间的一切传力连接装置的总称&#xff0c;其作用是传递作用在车轮和车架之间的力和力扭&#xff0c;并且缓冲由不平路面传给车架或车身的冲击力&#xff0c;并衰减由此引起的震动&#xff0c;以保证汽车能平稳地行驶。 其主要由减震器和弹簧组…

PictureSelector自定义路径首页不显示数据的问题

1、依赖导入和源码查看 网址&#xff1a;https://github.com/LuckSiege/PictureSelector/tree/version_component 使用PictureSelector 2、自定义路径的实现&#xff1a; 使用方法&#xff1a;setLoaderFactoryEngine进行设置 见[read.md] (https://github.com/LuckSiege/Pi…

C++ wxWidgets图形界面开发用什么IDE最好?

在主流免费的IDE工具中&#xff0c;我们可以想到的支持cmake项目的工具就只有QtCreator&#xff0c;VisualStudio&#xff0c;VSCode这三个。其中QtCreator和VSCode支持WIndows&#xff0c;Mac&#xff0c;WIndows三大主流平台。但是VSCode在Ubuntu等系统下的支持并没有在WIndo…

VMware Esxi 7.0 安装P40显卡疑难杂症小诊断

第一章、小叙 今天安装一台X99主板的机器&#xff0c;操作系统是VMware Esxi 7.0&#xff0c;配备一张P40显卡&#xff0c;显卡已在Esxi硬件中识别到&#xff0c;但是无法安装驱动&#xff0c;安装完驱动之后无法分配给虚拟机&#xff0c;如图所示为识别的硬件。 第二章、安装显…

Spark-SparkSubmit详细过程

一、概览 《Spark-环境启动》中讲了Spark环境的启动&#xff0c;以及Master和多个Worker之间时基于Endpoint之间的Netty通信&#xff0c;也被称为Spark的RpcEnv。在此基础上我们来看下spark-submit是如何将我们写的Spark程序调起的 二、启动脚本示例&#xff1a; spark-subm…

css通过keyframes实现文字定时向上滚动

一、效果 二、代码 <!DOCTYPE html> <html lang="en"><head>

软考软件设计师-备考须知

&#x1f939;‍♀️潜意识起点&#xff1a;个人主页 &#x1f399;座右铭&#xff1a;得之坦然&#xff0c;失之淡然。 &#x1f48e;擅长领域&#xff1a;大前端 是的&#xff0c;我需要您的&#xff1a; &#x1f9e1;点赞❤️关注&#x1f499;收藏&#x1f49b; 是我…

【hot100篇-python刷题记录】【矩阵置零】

R5-矩阵篇 印象题&#xff0c;思路即可&#xff1a; 手动置0 无非就是行和列都置0 使用thex和they将该元素的i和y存储起来&#xff0c;再分别遍历thex&#xff0c;将所有y的位置置0 遍历they&#xff0c;将所有x 置0 class Solution:def setZeroes(self, matrix: List[List…