首页 > 其他分享 >SpringMVC的数据获取问题

SpringMVC的数据获取问题

时间:2024-07-01 16:58:12浏览次数:20  
标签:username String SpringMVC register sex 获取 password 数据 public

在传统的javaweb中我们获取数据是通过HttpServletRequest中的getParameter或者getHeader等方法来获取相关的信息。由此我们引出了以下问题:

在SpringMVC中应该如何获取请求提交的数据呢?
在SpringMVC中又应该如何获取请求头信息呢?
在SpringMVC中又应该如何获取客户端提交的Cookie数据呢?

接下来我们将逐一解释上面的三个问题。我们使用idea进行开发。在进行解释之前我们需要准备一个`Register.html`的页面。方便进行表单的提交。`Register.html`代码如下:



问题1 如何获取请求提交的数据?

1.1使用Servlet原生api获取

 //方式一采用原生请求方式
    @PostMapping(value = "/register")
    public String register(HttpServletRequest req){
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println("username: "+username+" send a request");
        return "success";
    }

如果 System.out.println("username: "+username+" send a request");语句输出成功,并且浏览器跳转到success.html页面即为测试成功。

测试结果:



页面跳转:



控制台输出:

1.2采用RequestMapping的Param参数

1.2.1基本使用:
   //采用params参数
    @PostMapping(value = "/register")
    public String register(
            @RequestParam("username")
            String Username,
            @RequestParam("password")
            String password){
        System.out.println("Username: "+Username+" Password: "+password);
        return "success";
    }


##### 测试结果:


1.2.2 添加require属性

在注解中添加required属性并且设置为true表示请求必须携带该参数,否则无法使用

   //采用params参数
    @PostMapping(value = "/register")
    public String register(
            @RequestParam(value = "username" ,required = false)
            String Username,
            @RequestParam("password")
            String password,
            @RequestParam("sex",required = true)
            String sex){
        System.out.println("Username: "+Username+" Password: "+password);
        return "success";
    }
1.2.3 defaultValue属性

defaultValue属性用来设置形参的默认值,当没有提供对应的请求参数或者请求参数的值是空字符串""的时候,方法的形参会采用默认值。

@PostMapping(value = "/register")
    public String register(
            @RequestParam(value = "username" ,required = false)
            String Username,
            @RequestParam("password")
            String password,
            @RequestParam("sex")
            String sex,
            @RequestParam(value = "hobby" ,required = false ,defaultValue = "未知")
            String hobby){
        System.out.println("Username: "+Username+" Password: "+password);
        return "success";
    }

1.3 依靠控制器方法上的形参名来接收

@RequestParam 这个注解是可以省略的,如果方法形参的名字和提交数据时的name相同,则 @RequestParam 可以省略。

但有一个前提:如果你采用的是Spring6+版本,你需要在pom.xml文件中指定编译参数'-parameter',配置如下:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.12.1</version>
            <configuration>
                <source>21</source>
                <target>21</target>
                <compilerArgs>
                    <arg>-parameters</arg>
                </compilerArgs>
            </configuration>
        </plugin>
    </plugins>
</build>

注意:如果你使用的是Spring5的版本,以上的配置是不需要的。

Controller中的方法只需要这样写:形参的名字必须和提交的数据的name一致!!!!!

@PostMapping(value="/register")
public String register(String username, String password, String sex, ){
    System.out.println(username + "," + password + "," + sex  );
    return "success";
}

1.4 POJO类/JavaBean接收请求参数(重要)

在我之前的《SpringMVC框架和Servlet开发有啥子区别?》一文中我提到了 SpringMVC架构相对于传统原生的Servlet多了一个使用POJO类/JavaBean接收请求参数。为我们开发提供极大的简便。


当提交的数据非常多时,方法的形参个数会非常多,这不是很好的设计。在SpringMVC中也可以使用POJO类/JavaBean来接收请求参数。不过有一个非常重要的要求:POJO类的属性名必须和请求参数的参数名保持一致。SpringMvC底层会使用反射机制创建对象并且调用对象的set方法给User对象的属性赋值。提供以下的JavaBean:

ublic class User {
    private Long id;
    private String username;
    private String password;
    private String sex;
    private String[] hobby;
    private String intro;

    public User() {
    }

    public User(Long id, String username, String password, String sex, String[] hobby, String intro) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.sex = sex;
        this.hobby = hobby;
        this.intro = intro;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long 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 String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String[] getHobby() {
        return hobby;
    }

    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }

    public String getIntro() {
        return intro;
    }

    public void setIntro(String intro) {
        this.intro = intro;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", sex='" + sex + '\'' +
                ", hobby=" + Arrays.toString(hobby) +
                ", intro='" + intro + '\'' +
                '}';
    }
}

问题二:在SpringMVC中又应该如何获取请求头信息呢?

通过RequestHeader注解可以拿到请求头信息。请求头信息的形式也是key:value的键值对形式。该注解的作用是:将请求头信息映射到方法的形参上。和RequestParam注解功能相似,RequestParam注解的作用:将请求参数映射到方法的形参上。当然,对于RequestHeader注解来说,也有三个属性:value、required、defaultValue,和RequestParam一样。

@PostMapping("/register")
public String register(User user, 
                       @RequestHeader(value="Referer", required = false, defaultValue = "") 
                       String referer){
    System.out.println(user);
    System.out.println(referer);
    return "success";
}

问题三:在SpringMVC中又应该如何获取客户端提交的Cookie数据呢?

我们可以通过CookieValue注解来获取Cookie信息。该注解的作用:将请求提交的Cookie数据映射到方法形参上。该注解同样是有三个属性:value、required、defaultValue。

前端代码:

<script type="text/javascript">
    function sendCookie(){
        document.cookie = "id=123456789; expires=Thu, 18 Dec 2025 12:00:00 UTC; path=/";
        document.location = "/springmvc/register";
    }
</script>
<button onclick="sendCookie()">向服务器端发送Cookie</button>

后端接收代码

    @GetMapping("/register")
    public String register(User user,
                           @RequestHeader(value="Referer", required = false, defaultValue = "")
                           String referer,
                           @CookieValue(value="id", required = false, defaultValue = "2222222222")
                           String id){
        System.out.println(user);
        System.out.println(referer);
        System.out.println(id);
        return "success";
    }

标签:username,String,SpringMVC,register,sex,获取,password,数据,public
From: https://www.cnblogs.com/bobospace/p/18278101

相关文章

  • 大数据面试题之Spark(6)
              Spark输出文件的个数,如何合并小文件?Spark的driver是怎么驱动作业流程的?SparkSQL的劣势?介绍下SparkStreaming和StructedStreamingSpark为什么比Hadoop速度快?DAG划分Spark源码实现?SparkStreaming的双流join的过程,怎么做的?Spark的Bl......
  • 利用阿里云API获取实时天气信息|C语言Linux网络编程练手小项目
    文章目录目录文章目录前言一、HTTP数据请求1.HTTP概述2.数据请求方式3.JSON格式二、阿里云API获取,使用1.购买(白嫖)API接口步骤2.API使用代码编写3.编译程序 4.运行结果总结前言在项目开发时常常需要显示各种信息,如时间、天气、温度、空气质量指数等等。在......
  • 使用Vue 3和Axios从第三方API获取异步数据并展示
    在前端开发中,从第三方API获取数据并动态展示是非常常见且重要的需求之一。今天我们将深入探讨如何使用Vue3和Axios从第三方API获取异步数据并将其展示在页面上。通过这个例子,你将了解如何在Vue3中集成Axios,如何进行异步请求,以及如何动态地将数据绑定到模板以实......
  • 1、变量和简单数据类型
    1.1变量的命名和适用①必须是字母,数字,下划线。不能数字开头message="xxxx"1_message="xxxx"(不行)_message="xxx"0="xxx"(不行)②常变量名之间不能有空格greetingmessage="xxx"(不行)greeting_message="xxx"③不能用......
  • 获取所有的叶子节点
    获取所有的叶子节点/***获取叶子节点*@paramtree*@paramoptions*@returns{*[]}*/exportfunctiongetLeafNodes(tree,options={}){ const{childrenProp='children'}=options//默认子节点属性名为'children' constleafNodes=[] functio......
  • 根据时区获取当地时间
    时区列表publicstaticStringgetTimeByZoneID(StringzoneID){Stringformatted=null;if(ZoneId.getAvailableZoneIds().contains(zoneID)){ZoneIdzoneId=ZoneId.of(zoneID);ZonedDateTimenow=ZonedDateTime.now(zoneId);Date......
  • Oracle数据库知识汇总
    一、数据库三大范式第一范式:每个列都不可再拆分;第二范式:在第一范式的基础上,非主键字段完全依赖于主键字段,而不是依赖部分主键字段;第三范式:在第二范式的基础上,非主键字段只依赖于主键字段,不依赖其他非主键字段。二、索引定义:建立在表一列或多列的辅助对象,目的是加快访问表的......
  • 磐维数据库安装提示max_process_memory must greater than问题
    很多人在个人虚拟机部署磐维测试环境时会碰上一个提示内存太少的报错,多数是因为虚拟机给的内存太少了。遇到报错也可以不用调整虚拟机内存,可以调整参数解决。报错示例如下:BACKEND]FATAL:thevaluesofmemoryoutoflimit,thedatabasefailedtobestarted,max_process_mem......
  • 磐维数据库查询结果按列展示
    磐维数据库中如何实现查询结果按列展示?类似与MySQL数据库的\G效果,可以使用\x命令,以扩展方式显示查询结果。示例如下:postgres=#\xExpandeddisplayison.postgres=#select*frompg_user;-[RECORD1]----+-------------usename|dtpusesysid|20720usecreatedb|0......
  • php 获取微信用户的openId
    //这里的code是通过前端页面获取的//$appid="公众号在微信的appid";//$secret="公众号在微信的appsecret";publicfunctionuserOpenId($appid,$secret,$code){$url="https://api.weixin.qq.com/sns/jscode2session?appid=$appid&secret=$secret&......