SpringMVC获取请求参数

本篇基于第一个SpringMVC程序,本篇将介绍:

  1. 通过Servlet API获取请求参数。
  2. 通过控制器方法形参获取请求参数。
  3. 通过控制器方法形参获取请求头信息。
  4. 通过控制器方法形参获取cookie数据。
通过Servlet API获取请求参数
package com.example.mvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

@Controller
public class TestController {
    @RequestMapping("/")
    public String index(){
        return "index";
    }

    @GetMapping("/test")
    public String test(HttpServletRequest request){
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println("username="+username+",password="+password);
        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>Hello World!</h1>
  <a th:href="@{/test(username='tom',password=123456)}">测试</a>
</body>
</html>
<!-- success.html -->
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8" >
    <title>success</title>
</head>
<body>
<h1>here is success</h1>
</body>
</html>

在这里插入图片描述
使用Servlet API getParameter("username")获取请求参数username的值。
使用Servlet API getParameter("password")获取请求参数password的值。

如果同一个请求参数有多个值呢?

package com.example.mvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;

@Controller
public class TestController {
    @RequestMapping("/")
    public String index(){
        return "index";
    }
    @GetMapping("/test")
    public String test(HttpServletRequest request){
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String hobby = request.getParameter("hobby");
        System.out.println("username="+username+" password="+password+" hobby="+hobby);
        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>Hello World!</h1>
  <form th:action="@{/test}" method="get">
      用户名:<input type="text" name="username" /><br/>
      密码:<input type="password" name="password" /><br/>
      爱好:<input type="checkbox" name="hobby" value="football"/>足球
      <input type="checkbox" name="hobby" value="basketball"/>篮球
      <input type="checkbox" name="hobby" value="ping-pong"/>乒乓球<br/>
      <input type="submit" value="提交">
  </form>
</body>
</html>

如果仍使用getParameter("hobby"),获取的hobby的值仅为football,这显然是不对的。这时,应该使用Servlet API getParameterValues(),如下所示,

@GetMapping("/test")
public String test(HttpServletRequest request){
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    String[] hobby = request.getParameterValues("hobby");
    System.out.println("username="+username+" password="+password+" hobby="+hobby);
    System.out.println("username="+username+" password="+password+" hobby="+Arrays.toString(hobby));
    return "success";
}

hobby值为[Ljava.lang.String;@6744520c,其中,

  • [,表示一维数组([[,表示二维数组)。
  • L,表示一个对象。
  • java.lang.String,表示对象类型。
  • @6744520c@后面表示该对象的HashCode。

Arrays.toString(hobby),将数组转换为字符串,最后输出的值为[football, basketball, ping-pong]

通过控制器方法的形参获取请求参数
控制器方法形参名与请求参数名一致
package com.example.mvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

@Controller
public class TestController {
    @RequestMapping("/")
    public String index(){
        return "index";
    }

    @GetMapping("/test")
    public String test(String username,String password){
        System.out.println("username="+username+",password="+password);
        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>Hello World!</h1>
  <a th:href="@{/test(username='tom',password=123456)}">测试</a>
</body>
</html>

在这里插入图片描述
请求参数为username=tom&password=123456
控制器方法形参为(String username,String password)
只要控制器方法形参的名字与请求参数的名字一致,就可以通过控制器方法形参获取请求参数的值。

本例,从http://localhost:8080/demo1/test?username=tom&password=123456中,获取了请求参数usernamepassword的值,分别为tom123456

如果同一个请求参数有多个值呢?如,hobby=football&hobby=basketball&hobby=ping-pong

package com.example.mvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class TestController {
    @RequestMapping("/")
    public String index(){
        return "index";
    }

    @GetMapping("/test")
    public String test(String username,String password,String hobby){
        System.out.println("username="+username+",password="+password+",hobby="+hobby);
        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>Hello World!</h1>
  <form th:action="@{/test}" method="get">
      用户名:<input type="text" name="username"/><br/>
      密码:<input type="password" name="password" /><br/>
      爱好:<input type="checkbox" name="hobby" value="football"/>足球
      <input type="checkbox" name="hobby" value="basketball"/>篮球
      <input type="checkbox" name="hobby" value="ping-pong"/>乒乓球<br/>
      <input type="submit" value="提交">
  </form>
</body>
</html>

同样地,只要保证控制器方法形参的名字与请求参数的名字一致即可。
请求参数为username=admin&password=123456&hobby=football&hobby=basketball&hobby=ping-pong
控制器方法形参为(String username,String password,String hobby)
String hobby,控制器方法中以字符串类型的形参接收该请求参数hobby,得到的值为football,basketball,ping-pong

控制器方法的形参也可以是一个字符串数组,即(String username,String password,String[] hobby),这样得到的hobby是数组对象[Ljava.lang.String;@20126552,将该数组转换为字符串,结果为[football, basketball, ping-pong]
在这里插入图片描述

使用注解@RequestParam建立控制器方法形参与请求参数的映射关系
package com.example.mvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class TestController {
    @RequestMapping("/")
    public String index() {
        return "index";
    }

    @GetMapping("/test")
    public String test(
           @RequestParam("username") String name,
           @RequestParam("password") String passwd,
            String hobby
    ) {
        System.out.println("name="+name);
        System.out.println("passwd="+passwd);
        System.out.println("hobby="+hobby);
        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>Hello World!</h1>
  <form th:action="@{/test}" method="get">
      用户名:<input type="text" name="username" autocomplete="off"/><br/>
      密码:<input type="password" name="password" /><br/>
      爱好:<input type="checkbox" name="hobby" value="football"/>足球
      <input type="checkbox" name="hobby" value="basketball"/>篮球
      <input type="checkbox" name="hobby" value="ping-pong"/>乒乓球<br/>
      <input type="submit" value="提交">
  </form>
</body>
</html>

在这里插入图片描述
请求参数为username=admin&password=123456&hobby=football&hobby=basketball&hobby=ping-pong
控制器方法形参为(String name,String passwd,String hobby)

  • @RequestParam("username") String name
    请求参数名为username,控制器方法形参名为name,使用注解@RequestParam建立控制器方法形参与请求参数之间的映射关系。
  • @RequestParam("password") String passwd
    请求参数名为password,控制器方法形参名为passwd,使用注解@RequestParam建立控制器方法形参与请求参数之间的映射关系。

@RequestParam注解用来建立请求参数与控制器方法形参的映射关系,它有四个属性,分别是

  • value():String,value属性同name属性。
  • name():String,name属性同value属性。
  • required():boolean,是否必需,布尔值,默认为true
  • defaultValue:String,默认值。
@GetMapping("/test")
public String test(
       @RequestParam(value = "username",required = false,defaultValue = "somebody") String name,
       @RequestParam("password") String passwd,
        String hobby
) {
    System.out.println("name="+name);
    System.out.println("passwd="+passwd);
    System.out.println("hobby="+hobby);
    return "success";
}

在这里插入图片描述

使用实体类接收请求参数

控制器方法的形参是一个实体类,且实体类的属性名与请求参数的参数名一致。

package com.example.mvc.controller;

import com.example.mvc.controller.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class TestController {
    @RequestMapping("/")
    public String index() {
        return "index";
    }

    @PostMapping("/test")
    public String test(User user) {
        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>Hello World!</h1>
  <form th:action="@{/test}" method="post">
      用户名:<input type="text" name="username"/><br/>
      密码:<input type="password" name="password" /><br/>
      性别:<input type="radio" name="gender" value=""/><input type="radio" name="gender" value="" /><br/>
      邮箱:<input type="text" name="email" /><br/>
      <input type="submit" value="提交">
  </form>
</body>
</html>
package com.example.mvc.controller.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Integer id;
    private String username;
    private String password;
    private String gender;
    private String email;
}

在这里插入图片描述
本例中,浏览器向服务器发送post请求,请求体中包含如下表单数据。
在这里插入图片描述
服务器端的控制器方法test(User user),该方法接收User类型的形参,User类中包含usernamepasswordgenderemail,与上述表单数据名称一致。
在这里插入图片描述
通过控制器方法形参的实体类参数获取得到请求参数,idea控制台打印出如下信息:

User(id=null, username=张三, password=1234, gender=男, email=test@123.com)
通过控制器方法形参获取请求头信息
使用注解@RequestHeader建立请求头与控制器方法形参的映射关系
@GetMapping("/test")
public String test(
       @RequestParam(value = "username",required = false,defaultValue = "somebody") String name,
       @RequestParam("password") String passwd,
        String hobby,
       @RequestHeader("Host") String host,
       @RequestHeader(value = "test",required = true,defaultValue = "helloworld") String test
) {
    System.out.println("name="+name);
    System.out.println("passwd="+passwd);
    System.out.println("hobby="+hobby);
    System.out.println("host="+host);
    System.out.println("test="+test);
    return "success";
}

在这里插入图片描述

@RequestHeader注解用来建立请求头与控制器方法形参的映射关系,它也有四个属性,分别是,

  • value():String,value属性同name属性。
  • name():String,name属性同value属性。
  • required():boolean,是否必需,布尔值,默认为true
  • defaultValue:String,默认值。
通过控制器方法形参获取cookie数据
使用注解@CookieValue建立cookie数据与控制器方法形参的映射关系
package com.example.mvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Arrays;

@Controller
public class TestController {
    @RequestMapping("/")
    public String index(HttpServletRequest request) {
        return "index";
    }

    @GetMapping("/test/api")
    public String testAPI(HttpServletRequest request){
        HttpSession session = request.getSession();
        return "success";
    }
    @GetMapping("/test")
    public String test(
           @RequestParam(value = "username",required = false,defaultValue = "somebody") String name,
           @RequestParam("password") String passwd,
            String hobby,
           @RequestHeader("Host") String host,
           @RequestHeader(value = "test",required = true,defaultValue = "helloworld") String test,
           @CookieValue(value = "JSESSIONID") String JSESSIONID
    ) {
        System.out.println("name="+name);
        System.out.println("passwd="+passwd);
        System.out.println("hobby="+hobby);
        System.out.println("host="+host);
        System.out.println("test="+test);
        System.out.println("JSESSIONID="+JSESSIONID);
        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>Hello World!</h1>
  <a th:href="@{/test/api}">test api</a>
  <form th:action="@{/test}" method="get">
      用户名:<input type="text" name="username" autocomplete="off"/><br/>
      密码:<input type="password" name="password" /><br/>
      爱好:<input type="checkbox" name="hobby" value="football"/>足球
      <input type="checkbox" name="hobby" value="basketball"/>篮球
      <input type="checkbox" name="hobby" value="ping-pong"/>乒乓球<br/>
      <input type="submit" value="提交">
  </form>
</body>
</html>

在这里插入图片描述
首次点击链接"test_api"访问接口/test/api时,会调用request.getSession(),此时得到一个HttpSession类型的对象session,session的id值(一个随机序列)会保存至cookie(键名为JSESSIONID,键值为id值),且该cookie会被回写至响应头(Response Headers)
在这里插入图片描述

再次访问接口/test/api时,请求的请求头(Request Headers)会默认携带上述cookie,但响应头(Response Headers)中则不会再有cookie了。
服务器就是根据JSESSIONID这个字段值找到对应的session的。
在这里插入图片描述
@CookieValue注解用来建立cookie数据与控制器方法形参的映射关系,它也有四个属性,分别是,

  • value():String,value属性同name属性。
  • name():String,name属性同value属性。
  • required():boolean,是否必需,布尔值,默认为true
  • defaultValue:String,默认值。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值