SpringMVC获取请求参数的方法详解

 更新时间:2023年07月21日 10:38:09   作者:从未止步..  
这篇文章主要为大家详细介绍了SpringMVC中获取请求参数的方法,例如通过ServletAPI获取和通过控制器方法的形参获取请求参数等,需要的可以参考下

本篇文章的项目配置是在这篇文章的基础上实现的

通过ServletAPI获取

将HttpServletRequest作为控制器方法的形参,此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象

举例如下:

第一步:在html文件中创建表单,如下所示:

index.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>欢迎进入首页!</h1>
<form th:action="@{/param/ServletAPI}" method="post">
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    登录:<input type="submit" value="登录">
</form>
</body>
</html>

第二步:创建控制器方法,如下所示:

浏览器发送的请求被DispatcherServlet处理后,DispatcherServlet会将得到的请求信息和当前控制器中的@RequestMapping的信息进行匹配,如果匹配成功,则调用当前的方法处理当前的请求

package Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.servlet.http.HttpServletRequest;
@Controller
public class ServletAPIController {
    @RequestMapping( value = "/param/ServletAPI",method = RequestMethod.POST)
    //HttpServletRequest是Servlet API提供的一个接口,用于封装HTTP请求的信息,而request即为当前要处理的请求对象
    public String getParamTesting(HttpServletRequest request){
        String username=request.getParameter("用户名");
        String password=request.getParameter("密码");
        System.out.println("username:"+username+",password:"+password);
        return "success" ;
    }
}

重新部署项目,测试结果如下:

表单填写完成后,点击登录

成功跳转到success页面

返回控制台,表单信息也被成功获取

通过控制器方法的形参获取请求参数

在控制器方法的形参位置,设置和请求参数同名的形参,当浏览器发送请求,匹配到请求映射时,在DispatcherServlet中就会将请求参数赋值给相应的形参

举例如下:

第一步:创建新的控制器和控制器方法,如下所示:

package Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class paramTesting {
    @RequestMapping("/param")
    public String getParamTesting(String username,String password){//注意这里的形参名必须与表单中的name相一致
        System.out.println("username:"+username+",password:"+password);
        return "success";
    }
}

第二步:将变量的值动态的渲染到form表单中

index.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>欢迎进入首页!</h1>
<form th:action="@{/param}" method="post">
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    登录:<input type="submit" value="登录">
</form>
</body>
</html>

重新部署项目,将浏览器中的表单填写

跳转到如下所示成功的登录页面:

打开控制台,获取到的表单中的信息如下所示:

我们会发现username,我们在表单填写时的值为小明,而出现在控制台却是乱码的,解决方法如下所示:

package Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.io.UnsupportedEncodingException;
@Controller
public class paramTesting {
    @RequestMapping("/param")
    public String getParamTesting(String username,String password) throws UnsupportedEncodingException {
        //在controller层添加这句话,把jsp前端传过来的字符串改变编码
        username= new String(username.getBytes("ISO8859-1"),"UTF-8");
        password= new String(password.getBytes("ISO8859-1"),"UTF-8");
        System.out.println("username:"+username+",password:"+password);
        return "success";
    }
}

此时重新部署项目,测试结果如下所示:

乱码问题被解决

上述我们是通过设置和请求参数同名的形参,但是在实际开发中往往都是前后端分离,可能会出现前端命名不规范,或者后端变量名冲突,此时后端获取到的有可能为null,对此我们可手动创建请求参数和形参的关系

@RequestParam注解的使用

@RequestParam注解源码,如下所示:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package org.springframework.web.bind.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
    @AliasFor("name")
    String value() default "";
    @AliasFor("value")
    String name() default "";
    boolean required() default true;
    String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}

@RequestParam注解是Spring MVC框架中的一个注解,用于绑定请求参数到方法的参数上。它的作用是将HTTP请求中的参数值映射到方法的参数上,以便在方法中使用这些参数值。

具体来说,@RequestParam注解可以用于以下几个方面:

1:绑定请求参数的名称:通过@RequestParam注解,可以指定请求参数的名称,将请求中对应名称的参数值绑定到方法的参数上

2:设置参数的默认值:通过@RequestParam注解的defaultValue属性可以设置参数的默认值。如果请求中没有传递对应名称的参数,那么方法的参数将使用默认值。

3:设置参数的必需性:通过@RequestParam注解的required属性可以指定参数是否为必需的。如果将required属性设置为true(默认值为true),而请求中没有传递对应名称的参数,那么将抛出MissingServletRequestParameterException异常。例如:

但由于我们是表单提交的方式,因此表单中的每个参数名都会被传递,所以为了测试该属性的效果,我们可以手动在地址栏将username删除,只保留password,如下所示:

但是当我们将required的值设置为false时,即使我们手动的在地址栏将请求参数名username删除,只保留password,也不会报错,如下所示:

@RequestHeader注解的使用

将请求头信息和控制器方法进行绑定

@RequestHeader注解源码如下所示:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package org.springframework.web.bind.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestHeader {
    @AliasFor("name")
    String value() default "";
    @AliasFor("value")
    String name() default "";
    boolean required() default true;
    String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}

举例如下:

假设我们现在向获取请求头信息中的referer,如下所示:

获取方法如下所示:

package Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.io.UnsupportedEncodingException;
@Controller
public class paramTesting {
    @RequestMapping(value = "/param")
    public String getParamTesting(@RequestParam(required = false,defaultValue = "hello") String username, String password, @RequestHeader("referer") String referer) throws UnsupportedEncodingException {//在控制器方法的形参处创建新的形参名referer,并且给该形参名添加@RequestHeader注解,注解值为请求头信息的参数名
        username= new String(username.getBytes("ISO8859-1"),"GBK");
        password= new String(password.getBytes("ISO8859-1"),"GBK");
        System.out.println("referer:"+referer);
        System.out.println("username:"+username+",password:"+password);
        return "success";
    }
}

测试后,控制台输出如下所示:

@RequestHeader注解中的defaultvalue属性,当该请求的请求头信息中包含@RequestHeader注解中的value时,那么如上所示,它会直接获取该值,否则,将输出defaultvalue中的值,举例如下所示:

我们将defaultvalue的值设置为"No referer",因此当该请求没有来源地址时,会输出该值

public String getParamTesting(@RequestParam(required = false,defaultValue = "hello") String username, String password, @RequestHeader(value = "referer",defaultValue = "No referer") String referer)

测试方法为:将http://localhost:8080/ServletAPI/param?username=zhangsan&password=123复制在新的浏览器地址栏中打开,控制台输出如下所示:

@CookieValue注解的使用

将cookie数据和控制器方法进行绑定

@CookieValue注解源码如下所示:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package org.springframework.web.bind.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CookieValue {
    @AliasFor("name")
    String value() default "";
    @AliasFor("value")
    String name() default "";
    boolean required() default true;
    String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}

通过之前的学习,我们都知道cookie是键值对,因此,当我们想要获取cookie就比较麻烦,首先通过getcookies()方法获取一个类型为cookie的数组,再通过getName和getValue方法进行获取其键名和值,如果我们想获取一个指定的cookie,那么还需要判断它是否属于某个类,属于我们才能获取其值,但在SpringMVC中,我们不需要如此麻烦,我们可以直接通过@CookieValue注解,如下所示:

假设我们想获取该cookie,方法如下:

测试结果如下所示,控制台输出:

通过pojo获取请求参数

假设我们通过浏览器向服务器传输的数据很复杂,包括姓名,年龄,性别,爱好,邮箱,家庭住址等等,如果我们还是按照上述的方法在控制器方法的参数部分创建形参来接受,这样就会非常麻烦,对此SpringMVC为我们提供了一种简单的方法:只需要在控制器方法的形参位置设置实体类形参,但是需要保证实体类中的属性和请求参数中的名称一致,那么我们才可以直接将请求参数中的值封装到实体类类型的形参中

举例如下所示:

第一步首先创建实体类:

package Controller.pojo;
public class User {
    private Integer id;
    private String username;
    private String password;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public User(Integer id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }
    public User() {
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

第二步:创建控制器方法

package Controller.pojo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class pojoController {
    @RequestMapping("/param/pojo")
    public String pojoTesting(User user){//在控制器方法的形参位置设置实体类形参
    	System.out.println("用户信息为如下所示:");
        System.out.println(user);
        return "success";
    }
}

第三步修改index.html文件

如下所示:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>欢迎进入首页!</h1>
<form th:action="@{/param/pojo}">
    id:<input type="text" name="id"><br>
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    登录:<input type="submit" value="登录">
</form>
</body>
</html>

在浏览器中填写表单:

页面跳转成功后,控制台输出如下所示:

以上就是SpringMVC获取请求参数的方法详解的详细内容,更多关于SpringMVC获取请求参数的资料请关注脚本之家其它相关文章!

相关文章

  • Java利用ElasticSearch实现增删改功能

    Java利用ElasticSearch实现增删改功能

    这篇文章主要为大家详细介绍了Java如何利用ElasticSearch实现增删改功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-08-08
  • jQuery.event.trigger()的简单解释

    jQuery.event.trigger()的简单解释

    今天小编就为大家分享一篇关于jQuery.event.trigger()的简单解释,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • SpringBoot详解如何进行整合Druid数据源

    SpringBoot详解如何进行整合Druid数据源

    Druid是阿里开发的一款开源的数据源,被很多人认为是Java语言中最好的数据库连接池,本文主要介绍了SpringBoot整合Druid数据源的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • jcrop 网页截图工具(插件)开发

    jcrop 网页截图工具(插件)开发

    今天给大家介绍一下一个web 中经常会用到的截图(如:头像等)工具,需要的朋友可以了解下
    2012-11-11
  • 如何通过Java打印Word文档

    如何通过Java打印Word文档

    这篇文章主要介绍了如何通过Java打印Word文档,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • java String[]字符串数组自动排序的简单实现

    java String[]字符串数组自动排序的简单实现

    下面小编就为大家带来一篇java String[]字符串数组自动排序的简单实现。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • Windows中在IDEA上安装和使用JetBrains Mono字体的教程

    Windows中在IDEA上安装和使用JetBrains Mono字体的教程

    这篇文章主要介绍了Windows IDEA上安装和使用JetBrains Mono字体的教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • Java在PDF中添加表格过程详解

    Java在PDF中添加表格过程详解

    这篇文章主要介绍了Java在PDF中添加表格过程详解,本文将介绍通过Java编程在PDF文档中添加表格的方法。添加表格时,可设置表格边框、单元格对齐方式、单元格背景色、单元格合并、插入图片、设置行高、列宽、字体、字号等,需要的朋友可以参考下
    2019-07-07
  • Java提效神器Stream的一些冷门技巧汇总

    Java提效神器Stream的一些冷门技巧汇总

    这篇文章主要给大家介绍了关于Java提效神器Stream的一些冷门技巧,Stream是java对集合操作的优化,相较于迭代器,使用Stream的速度非常快,并且它支持并行方式处理集合中的数据,默认情况能充分利用cpu的资源,需要的朋友可以参考下
    2021-07-07
  • RabbitMQ实现Work Queue工作队列的示例详解

    RabbitMQ实现Work Queue工作队列的示例详解

    工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。本篇文章将记录和分享RabbitMQ工作队列相关的知识点,希望对大家有所帮助
    2023-01-01

最新评论