SpringMVC获取请求参数:通过servletAPI获取、 通过控制器方式的形参获取请求参数、获取请求头信息、获取cookie信息、通过pojo获取请求参数、解决乱码问题

一、通过servletAPI获取

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

<form th:action="@{/testHttpServletRequest}" method="post">
    username:<input type="text" name="username"><br>
    password:<input type="text" name ="password"><br>
    a<input type="checkbox" name="hobby" value="a">
    b<input type="checkbox" name="hobby" value="b">
    c<input type="checkbox" name="hobby" value="c"><br>
    <input type="submit">
</form><br/>
package com.springmvc.controller;

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

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

@Controller
public class RequestController {
    @PostMapping("/testHttpServletRequest")
    public String testHttpServletRequest(HttpServletRequest request){
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        //HttpServletRequest获取多个同名的值
        String[] hobbies = request.getParameterValues("hobby");

        System.out.println("username:"+username);
        System.out.println("password:"+password);
        System.out.println("hobby"+ Arrays.toString(hobbies));
        /*  username:username
            password:password
            hobby[a, b, c]
       */
        return "success";
    }
}

二、 通过控制器方式的形参获取请求参数

1. 参数名与形参名一致时

请求参数名与形参名字一致时可以直接接收此参数,如果有多个值可以把类型改为数组,如果不改会将多个值用逗号拼接

<form th:action="@{/testParameter}" method="post">
    username:<input type="text" name="username"><br>
    password:<input type="text" name ="password"><br>
    a<input type="checkbox" name="hobby" value="a">
    b<input type="checkbox" name="hobby" value="b">
    c<input type="checkbox" name="hobby" value="c"><br>
    <input type="submit">
</form><br/>
@PostMapping("/testParameter")
    //用与参数同名的形参接受值,如果有多个值则改为数组形式
    public String testParameter(String username,String password,String[] hobby){
        System.out.println("username:"+username);
        System.out.println("password:"+password);
        System.out.println("hobby"+ Arrays.toString(hobby));
        /*
        * username:username
          password:password
          hobby[a, b, c]*/
        return "success";
    }
@PostMapping("/testParameter2")
    public String testParameter2(String username,String password,String hobby){
        System.out.println("username:"+username);
        System.out.println("password:"+password);
        System.out.println("hobby"+ hobby);
        /*
        * username:username
          password:password
          hobby[a, b, c]*/
        return "success";
    }

2. 参数名与形参名不可以一致时,用@RequestParam注解

比如我们的请求名为user_name,这与java的命名规范不一致,可以用到下面的注解:

@RequestParam注解:将请求参数和控制器方法形参创建映射关系,其中属性如下:

  • value:请求参数名对应形参名
  • required:是否是必须的
  • defaultValue:默认值
<form th:action="@{/testParameter3}" method="post">
    username:<input type="text" name="user_name"><br>
    password:<input type="text" name ="password"><br>
    a<input type="checkbox" name="hobby" value="a">
    b<input type="checkbox" name="hobby" value="b">
    c<input type="checkbox" name="hobby" value="c"><br>
    <input type="submit" value="请求参数名与形参名不一致时">
</form><br/>
@PostMapping("/testParameter3")
    public String testParameter3(
            //defaultValue表示默认值,在没有此请求参数传递过来或该请求参数没有值时,会将其赋值为123
            //required表示是否是必要存在的,如果为true,且defaultValue没有设置时,则报400错误,如果为false,则赋值为null
            @RequestParam(value = "user_name", required = false, defaultValue = "123") String username,
            String password,
            String[] hobby
    ) {
        System.out.println("username:" + username);
        System.out.println("password:" + password);
        System.out.println("hobby" + Arrays.toString(hobby));
        /*
        username:username
        password:password
        hobby[a, b, c]
         */
        return "success";
    }

三、获取请求头信息

通过**@RequestHeader**注解获取请求头里面的值。

<form th:action="@{/testHeads}" method="post">
    username:<input type="text" name="user_name"><br>
    password:<input type="text" name ="password"><br>
    a<input type="checkbox" name="hobby" value="a">
    b<input type="checkbox" name="hobby" value="b">
    c<input type="checkbox" name="hobby" value="c"><br>
    <input type="submit" value="请求头信息">
</form><br/>
@PostMapping("/testHeads")
    //defaultValue表示默认值,在没有此请求参数传递过来或该请求参数没有值时,会将其赋值为test
    //required表示是否是必要存在的,如果为true,且defaultValue没有设置时,则报400错误,如果为false,则赋值为null
    public String testHeads(@RequestHeader(value = "host", required = true, defaultValue = "test") String host) {
        System.out.println(host);//localhost:8080
        return "success";
    }

四、获取cookie信息

通过**@CookieVlaue**注解获取cookie里面的值,用法与@RequestHeader、@RequestParam相同。


<form th:action="@{/testCookie}" method="post">
    username:<input type="text" name="user_name"><br>
    password:<input type="text" name ="password"><br>
    a<input type="checkbox" name="hobby" value="a">
    b<input type="checkbox" name="hobby" value="b">
    c<input type="checkbox" name="hobby" value="c"><br>
    <input type="submit" value="testCookie">
</form><br/>
@PostMapping("/testCookie")
    public String testCookie(@CookieValue("Webstorm-47ce7496") String webStorm) {
        System.out.println(webStorm);
        return "success";
    }

五、通过pojo获取请求参数

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

  1. 创建实体类
package com.springmvc.pojo;

import java.util.List;

public class User {
    private int id;
    private String username;
    private String password;
    private List<String> hobby;

    public User() {
    }

    public User(int id, String username, String password, List<String> hobby) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.hobby = hobby;
    }

    public int getId() {
        return id;
    }

    public void setId(int 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 List<String> getHobby() {
        return hobby;
    }

    public void setHobby(List<String> hobby) {
        this.hobby = hobby;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", hobby=" + hobby +
                '}';
    }
}
  1. 前端发送参数
<form th:action="@{/testPojo}" method="post">
    username:<input type="text" name="username"><br>
    password:<input type="text" 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="testPojo">
</form><br/>
  1. 后端接收参数并自动给实体类中的属性赋值,如果参数名与属性的名字一致,则将参数赋给这个实例类对应的属性
@PostMapping("/testPojo")
    public String testPojo( User user) {
        System.out.println(user);
        return "success";
    }

六、解决乱码问题

1. get请求乱码

get请求的乱码需要在tomcat中的配置文件server.xml中配置如下信息:

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

2. post请求乱码

post请求的乱码需要在web.xml中加入如下代码:

 <!--解决post乱码问题-->
    <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>forceResponseEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值