处理中文乱码
配置 web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!-- 引入 DispatcherServlet --> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <!-- 指定 Spring MVC 配置文件位置 --> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/spring-mvc.xml</param-value> </init-param> <!-- 设置此 Servlet 在 Tomcat 启动的时候创建 --> <load-on-startup>1</load-on-startup> </servlet> <!-- POST 中文乱码 --> <servlet> <servlet-name>characterEncodingFilter</servlet-name> <servlet-class>org.springframework.web.filter.CharacterEncodingFilter</servlet-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>characterEncodingFilter</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app>
HttpServletRequest
/** * 发送Get请求 * http://localhost:8080/api1?username=XW&password=123456 */ @RequestMapping("/api1") public String api1(HttpServletRequest request) { String username = request.getParameter("username"); String password = request.getParameter("password"); System.out.println("username = " + username + ", password = " + password); return "index"; }
简单变量
/** * 发送Get请求 * http://localhost:8080/api2?username=XW&password=123456&age=10 */ @RequestMapping("/api2") public String api2(String username, String password, Integer age) { System.out.println("username = " + username + ", password = " + password + ", age = " + age); return "index"; }
- 对于常用的类型变量(八大基本数据类型 + String),SpringMVC 会对自动进行类型的转换。
- 在定义参数的时候使用基本数据类型的包装器。
基于 POJO 的请求传参
package world.xuewei.entity; /** * 用户实体 * * @author 薛伟 * @since 2023/10/30 16:18 */ public class User { private String username; private String password; private Integer age; 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 Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
/** * 发送Get请求 * http://localhost:8080/api3?username=XW&password=123456&age=10 */ @RequestMapping("/api3") public String api3(User user) { System.out.println(user); return "index"; }
- 当接口的参数列表为
String api3(String username, User user)
时,简单变量和 POJO 对象都可以接收到参数的值。
简单变量数组
/** * 发送Get请求 * http://localhost:8080/api4?ids=1&ids=2&ids=3 */ @RequestMapping("/api4") public String api4(Integer[] ids) { System.out.println(Arrays.toString(ids)); return "index"; }
注意:这种情况不可以使用
List
来接受参数。原因是 SpringMVC 在做参数赋值的时候先去判断是否为简单对象,如果不是简单对象,那么会去创建定义的参数的对象,然后调用 set 方法进行属性的赋值。对于这个场景而言,首先 List 是接口,无法创建对象,程序将抛出异常,若将 List 改为 ArrayList,那么虽然可以创建对象,但是 ArrayList 中并没有 ids 的属性,所以无法进行赋值。
接收一组 POJO 对象
接收一组 POJO 就需要定义一个 DTO,在 DTO 中创建对应的属性,完成属性的赋值。
package world.xuewei.entity; import java.util.List; /** * 用户传输对象 * * @author 薛伟 * @since 2023/10/30 16:18 */ public class UserDTO { List<User> users; public List<User> getUsers() { return users; } public void setUsers(List<User> users) { this.users = users; } }
/** * 发送POST请求 */ @RequestMapping("/api5") public String api5(UserDTO dto) { System.out.println(dto.getUsers()); return "index"; }
@RequestParam注解
在 Spring 框架中,@RequestParam 注解用于将请求中的参数绑定到方法的参数上。它可以被用于处理 GET 或 POST 请求中的查询字符串参数或表单参数。
使用 @RequestParam 注解时,你需要指定参数的名称,该名称与请求中的参数名称一致。如果请求中的参数与方法参数的名称相同,可以省略 @RequestParam 注解中的 value 属性。
@RequestParam 注解提供了一些可选属性,让你可以更好地控制参数的行为:
- value:指定请求参数的名称,如果省略,则默认使用参数名作为请求参数的名称。
- required:指定该参数是否为必需的,默认为 true,表示请求中必须包含该参数,否则将抛出异常。如果设置为 false,则表示该参数是可选的。
- defaultValue:指定当请求中没有指定该参数时的默认值。如果请求中存在该参数,则使用请求中的值,否则使用默认值。
下面是一个使用 @RequestParam 注解的示例:
@RequestMapping(value = "/example") public String exampleMethod(@RequestParam(value = "n", required = true) String name, @RequestParam(value = "age", required = false, defaultValue = "0") int age) { // 方法体 }
POJO 类型的形参,不能使用此注解,不然会报错 400。
接收Map数据
单值动态参数
package world.xuewei.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import java.util.Map; import java.util.Objects; /** * 第一个控制器 * * @author 薛伟 * @since 2023/10/30 16:18 */ @Controller public class MapController { @RequestMapping("/map") public String map(@RequestParam Map<String, Object> map) { System.out.println(map); return "index"; } }
http://localhost:8080/map?name=xw&age=25
注意:必须使用 @RequestParam 注解
多值动态参数
package world.xuewei.controller; import org.springframework.stereotype.Controller; import org.springframework.util.MultiValueMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; /** * 第一个控制器 * * @author 薛伟 * @since 2023/10/30 16:18 */ @Controller public class MapController { @RequestMapping("/map") public String map(@RequestParam MultiValueMap<String, String> map) { System.out.println(map); return "index"; } }
http://localhost:8080/map?name=xw&name=zs&name=li
注意:此处使用 MultiValueMap 接口参数,每个 key 对应的值都是一个 List。