Loading

SpringMVC获取请求参数

通过原生servletAPI获取请求参数

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

controller如下:

package com.lalala.controller;

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

import javax.servlet.http.HttpServletRequest;

@Controller
public class ParamController {

    @RequestMapping("/")
    public String index() {
        System.out.println("Hello SpringMVC");
        //返回视图名称
        return "test_param";
    }

    @RequestMapping("/testServletAPI")
    public String testServletAPI(HttpServletRequest request) {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println("username:" + username + ",password:" + password);
        return "success";
    }
}

test_param.html如下:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>测试请求参数</title>
</head>
<body>
<h1>测试请求参数</h1>
<a th:href="@{/testServletAPI(username='admin',password=123456)}">测试使用servletAPI获取请求参数</a>
</body>
</html>

注意:一般不建议使用原生的servletAPI来获取请求参数。

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

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

controller如下:

package com.lalala.controller;

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

import javax.servlet.http.HttpServletRequest;

@Controller
public class ParamController {
    @RequestMapping("/")
    public String index() {
        System.out.println("Hello SpringMVC");
        //返回视图名称
        return "test_param";
    }
    @RequestMapping("/testParam")
    public String testParam(String username, String password) {
        System.out.println("username:" + username + ",password:" + password);
        return "success";
    }

}

test_param.html如下:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>测试请求参数</title>
</head>
<body>
<h1>测试请求参数</h1>
<a th:href="@{/testParam(username='root',password=123)}">测试使用控制器方法的形参获取请求参数</a>
</body>
</html>

当有多个同名的请求参数时

若请求所传输的请求参数中有多个同名的请求参数,可以在控制器方法的形参中设置字符串数组或者字符串类型的形参接收此请求参数。

测试在test_param.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="@{/testParam}" method="post">
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    爱好:<input type="checkbox" name="hobby" value="听音乐">听音乐
    <input type="checkbox" name="hobby" value="看电影">看电影
    <input type="checkbox" name="hobby" value="打游戏">打游戏<br>
    <input type="submit" value="通过控制器的形参获取请求参数">
</form>
</body>
</html>

若使用字符串类型的形参,最终结果为请求参数的每个值使用逗号拼接的结果:

@RequestMapping("/testParam")
public String testServletAPI(String username, String password, String hobby) {
    System.out.println("username:" + username + ",password:" + password + ",hobby:" + hobby); // username:admin,password:123,hobby:听音乐,看电影
    return "success";
}

若使用字符串数组类型的形参,此参数的数组中包含了每一个数据:

package com.lalala.controller;

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

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

@Controller
public class ParamController {
    @RequestMapping("/")
    public String index() {
        System.out.println("Hello SpringMVC");
        //返回视图名称
        return "test_param";
    }
    @RequestMapping("/testParam")
    public String testParam(String username, String password, String[] hobby) {
        System.out.println("username:" + username + ",password:" + password + ",hobby:" + Arrays.toString(hobby)); //username:admin,password:123,hobby:[听音乐, 看电影, 打游戏]
        return "success";
    }
}

解决中文乱码

在web.xml中加入如下配置:

<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>
</filter>
<filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

通过@RequestParam注解处理请求参数

当请求参数的参数名和控制器方法的形参名不一致时,就会获取不到请求参数值,此时可以通过@RequestParam注解来获取参数。

@RequestParam注解有三个属性:

  • value:指定为形参赋值的请求参数的参数名
  • required:设置是否必须传输此请求参数,默认值为true
  • defaultValue:不管required属性值为true或false,当value所指定的请求参数没有传输或传输的值为""时,则使用默认值为形参赋值
@RequestMapping("/testParam")
public String testParam(
    @RequestParam(value = "user_name", required = false) String username,
    String password,
    String[] hobby) {
    System.out.println("username:" + username + ",password:" + password + ",hobby:" + Arrays.toString(hobby));
    return "success";
}

通过@RequestHeader注解将请求头信息与方法的形参创建映射关系

@RequestHeader是将请求头信息和控制器方法的形参创建映射关系

@RequestHeader注解和@RequestParam一样有三个属性:value、required、defaultValue,用法相同。

@RequestMapping("/testParam")
public String testParam(
    @RequestParam(value = "user_name", required = false) String username,
    String password,
    String[] hobby,
    @RequestHeader("Host") String host) {
    System.out.println("username:" + username + ",password:" + password + ",hobby:" + Arrays.toString(hobby));
    System.out.println(host);
    return "success";
}

通过@CookieValue注解将cookie数据与方法的形参创建映射关系

需要先创建键为JSESSIONID的cookie:

HttpSession session = request.getSession();

控制器方法中获取cookie:

@RequestMapping("/testParam")
public String testParam(
        @RequestParam(value = "user_name", required = false) String username,
        String password,
        String[] hobby,
        @CookieValue("JSESSIONID") String JSESSIONID) {
    System.out.println("username:" + username + ",password:" + password + ",hobby:" + Arrays.toString(hobby));
    System.out.println(JSESSIONID);
    return "success";
}

通过POJO获取请求参数

当控制器方法的形参位置是一个实体类类型的形参,若传输的请求参数的参数名和实体类中的属性名一致,那么请求参数就会为此属性赋值。

controller如下:

package com.lalala.controller;

import com.lalala.pojo.User;
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 ParamController {
    @RequestMapping("/")
    public String index() {
        System.out.println("Hello SpringMVC");
        //返回视图名称
        return "test_param";
    }
    @RequestMapping("/testPojo")
    public String testPojo(User user) {
        System.out.println(user); //User{id=null, username='admin', password='123', sex=男, age=18, email='565169676@qq.com'}
        return "success";
    }
}

test_param.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="@{/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" value="使用实体类接收请求参数">
</form>
</body>
</html>
posted @ 2021-09-14 13:34  charlatte  阅读(29)  评论(0编辑  收藏  举报