05.springMVC获得请求参数2

83 阅读3分钟

通过request获得参数

1. controller方法

@RestController
public class GetDataController {
​
    @RequestMapping("/getParamByRequest")
    public String getParam(HttpServletRequest request) {
        String userid = request.getParameter("userid");
        String password = request.getParameter("password");
        return "userid="+userid+", password="+password;
    }
}

@RestController 暂时理解为该类的每个方法返回的都是字符串即可。后面会单独介绍。

2. postman请求测试

image-20230327151539335

通过@RequestParam获得参数

1. controller方法

@RequestMapping("/getParamByName")
public String getParam2(String userid, @RequestParam("pwd") String password){
    return "userid="+userid+", password="+password;
}

说明:

如果方法参数名称和请求的参数名称一致的情况下,是不用加@RequestParam的。如果不一致则需要写。

2. postman测试请求

image-20230327153414281

通过POJO接收参数

1. 引入lombok

<!-- lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.24</version>
    <scope>provided</scope>
</dependency>

2. 定义POJO类

@Data
public class UserInfo {
    private String userid;
    private String username;
    private Integer age;
    /**
     * 接收多个值
     */
    private String[] hobby;
    /**
     * 这里如果需要用Date类型,则需要加@DateTimeFormat,
     * 否则也可以用String进行接收
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date birthdate;
}

3. controller方法

@RequestMapping("/getParamByPojo")
public String getParam3(UserInfo userInfo) {
    return userInfo.toString();
}

4. postman测试请求

image-20230327165854743

接收List类型参数

1. 修改UserInfo类

@Data
public class UserInfo {
    // 省略其他属性值
    ......
    /**
     * 喜欢的书籍
     */
    List<BookInfo> books;
}

2. 添加BookInfo类

@Data
public class BookInfo {
    /**
     * 书籍id
     */
    private String bookId;
    /**
     * 书籍名称
     */
    private String bookName;
}

3. controller新加测试方法

@RequestMapping("/getParamByPojoWithList")
public String getParam4(UserInfo userInfo) {
    return userInfo.toString();
}

4. postman发送测试数据

image-20230330133558841

接收Map类型参数

1. 修改UserInfo类

@Data
public class UserInfo {
    // 省略其他属性值
	......
    /**
     * 喜欢的书籍Map形式
     */
    Map<String, BookInfo> bookMap;
}

2. controller新加测试方法

@RequestMapping("/getParamByPojoWithMap")
public String getParam5(UserInfo userInfo) {
    return userInfo.toString();
}

3. postman发送测试数据

image-20230330142001862

接收json数据

1. 引入jackson

<!-- 请求和返回json数据时需要的包 -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.14.2</version>
</dependency>

2. controller增加方法

@RequestMapping("/getParamByPojoWithJson")
public String getParam6(@RequestBody UserInfo userInfo) {
    return userInfo.toString();
}

3. postman发送测试数据

image-20230330174024961

接收参数乱码问题

避免乱码的核心思想是,统一所有传输为utf-8编码。包括idea设置的文件编码:

image-20230331090754625

1. GET方式乱码

Tomcat 8 及之后的版本,处理 get 请求的编码为 UTF-8。而tomcat7的URIEncoding 为 ISO-8859-1。如果传中文会出现乱码。假设你用的是tomcat7的话,那么需要修改$TOMCAT/conf/server.xml文件,修改如下内容:

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

就是加上URIEncoding="UTF-8"即可

2. post方式乱码

首先说明一点,在实际的测试中,post方式乱码仅仅出现在通过form表单提交的时候会出现,其他情况比如:@RequestBody传json或者虽然是post方式请求,但是请求值通过url传参的这两种情况都不会出现乱码。

处理乱码的方式,是在web.xml中配置一个全局字符串编码过滤器:

<!--Spring 中提供的字符编码过滤器-->
<filter>
    <filter-name>encFilter</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>encFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

代码地址

gitee.com/mayuanfei/s…下的springmvc02

记忆印记

  • @RequestMapping可以放在类上或者方法上,而且是叠加路径的
  • @RequestParam可以接受请求参数名和参数名不一致的情况;如果名称一致可以不用写
  • @RequestBody接收json数据时,引入jackson
  • form表单采用post提交数据乱码时,配置字符编码过滤器可以解决