SpringMVC请求参数的绑定及其常用注解
3.3 请求参数的绑定
绑定机制
表单中的请求都是基于key=value的
SpringMVC绑定请求参数的过程就是通过把表单提交请求参数,作为控制器中方法参数进行绑定的。
例如:
<a href="account/findAccount?accountId=10">查询账户</a>
,请求参数是:accoutnId=10/** * 查询账户 * @return */ @RequestMapping("/findAccount") public String findAccount(Integer accountId) { System.out.println("查询了账户。。。。"+accountId); return "success"; }
支持的数据类型
- 基本类型参数:
- 包括基本类型和String类型
- POJO类型参数:
- 包括实体类,以及关联的实体类
- 数组和集合类型参数:
- 包括List结构和Map结构的集合(包括数组)
- SpringMVC绑定请求参数是自动实现的,但是要想使用,必须遵循使用要求。
使用要求
-
基本类型或者String类型:
- 要求我们的参数名称必须和控制器中方法的形参名称保持一致(严格区分大小写)
-
POJO类型,或者它的关联对象:
- 要求表单中参数名称和POJO类的属性名称保持一致。并且控制器方法的参数类型是POJO类型
-
集合类型,有两种方式:
-
第一种:
要求集合类型的请求参数必须在POJO中。在表单中请求参数名称要和POJO中集合属性名称相同。
给List集合中的元素赋值,使用下标。
给Map集合中的元素复制,使用键值对。
-
第二种:
接收的请求参数是json格式数据。需要借助一个注解实现。
-
总结
-
请求参数的绑定说明
- 绑定机制
- 表单提交的数据都是k=v格式的 username=haha&password=123
- SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定
- 要求:提交表单的name和参数的名称是相同的
- 支持的数据类型
- 基本数据类型和字符串类型
- 实体类型(JavaBean)
- 集合数据类型(List、Map集合等)
- 绑定机制
-
基本数据类型和字符串类型
- 提交表单的name和参数的名称是相同的
- 区分大小写
-
实体类型(JavaBean)
- 提交表单的name和JavaBean中的属性名称需要一致
- 如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:address.name
-
给集合属性数据封装
- JSP页面编写方式:list[0].属性
-
请求参数中文乱码的解决
-
在web.xml中配置Spring提供的过滤类
<!-- 配置过滤器,解决中文乱码的问题 --> <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>
-
自定义类型转换器
-
使用场景:
- 我们通过前端页面传送到后端的参数一般都是String类型的,SpringMVC可以帮我们转换大部分的Spring类型的数据变成我们需要的基本数据类型,但仍然有不能转换的地方,例如日期格式:2020-12-8,此时我们就需要自定义一个类型转换器
-
使用步骤
-
第一步:定义一个类,实现 Converter 接口,该接口有两个泛型。
public interface Converter<S, T> {//S:表示接受的类型,T:表示目标类型 /** * 实现类型转换的方法 */ @Nullable T convert(S source); } /** * 自定义类型转换器 * @author 黑马程序员 * @Company http://www.ithiema.com * @Version 1.0 */ public class StringToDateConverter implements Converter<String, Date> { /** * 用于把 String 类型转成日期类型 */ public Date convert(String source) { try { if(StringUtils.isEmpty(source)) { throw new NullPointerException("请输入要转换的日期"); } format = new SimpleDateFormat("yyyy-MM-dd"); Date date = format.parse(source); return date; } catch (Exception e) { throw new RuntimeException("输入日期有误"); } } }
-
第二步:在 spring 配置文件中配置类型转换器。
spring 配置类型转换器的机制是,将自定义的转换器注册到类型转换服务中去。<!-- 配置类型转换器工厂 --> <bean id="converterService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <!-- 给工厂注入一个新的类型转换器 --> <property name="converters"> <array> <!-- 配置自定义类型转换器 --> <bean class="com.itheima.web.converter.StringToDateConverter"></bean> </array> </property> </bean>
-
第三步:在 annotation-driven 标签中引用配置的类型转换服务
<!-- 引用自定义类型转换器 --> <mvc:annotation-driven conversion-service="converterService"></mvc:annotation-driven>
-
3.4 常用注解
RequestParam
-
作用:把请求中的指定名称参数传递给控制器中的形参赋值
-
属性:
- value:请求参数中的名称
- rrequired:请求参数中是否必须提供此参数,默认值是true,必须提供
-
/** * 接收请求 * @return */ @RequestMapping(path="/hello") public String sayHello(@RequestParam(value="username",required=false)String name) { System.out.println("aaaa"); System.out.println(name); return "success"; }
RequestBody注解
-
作用:用于获取请求体的内容(注意:get方法不可以)
-
属性
- required:是否必须有请求体,默认值是true
-
/** * 接收请求 * @return */ @RequestMapping(path="/hello") public String sayHello(@RequestBody String body) { System.out.println("aaaa"); System.out.println(body); return "success"; }
PathVariable注解
-
作用:拥有绑定url中的占位符的。例如:url中中有/delete{id},{id}就是占位符
-
属性:
- value:指定url中的占位符名称
-
Restful风格的URL
- 请求路径一样,可以根据不同的请求方式去执行后台的不同方法
- Restful风格的URL有点
- 结构清晰
- 符合标准
- 易于理解
- 扩展方便
- 请求路径一样,可以根据不同的请求方式去执行后台的不同方法
-
<a href="user/hello/1">入门案例</a> /** * 接收请求 * @return */ @RequestMapping(path="/hello/{id}") public String sayHello(@PathVariable(value="id") String id) { System.out.println(id); return "success"; }
RequestHeader注解
-
作用:获取指定请求头的值
-
属性:
- value:请求头名称
-
@RequestMapping(path="/hello") public String sayHello(@RequestHeader(value="Accept") String header) { System.out.println(header); return "success"; }
CookieValue注解
-
作用:用于获取指定cookie的名称的值
-
属性:
- value:cookie的名称
-
@RequestMapping(path="/hello") public String sayHello(@CookieValue(value="JSESSIONID") String cookieValue) { System.out.println(cookieValue); return "success"; }
ModelAttribute注解
-
作用:
- 出现在方法上:表示当前方法会在控制器方法执行前执行
- 出现在参数上:获取指定的数据给参数赋值
-
应用场景
- 当提交表单数据不是完整的实体数据时,保证没有提交的字段使用数据库原来的数据
-
修饰的方法有返回值↓
-
/** * 作用在方法,先执行 * @param name * @return */ @ModelAttribute public User showUser(String name) { System.out.println("showUser执行了..."); // 模拟从数据库中查询对象 User user = new User(); user.setName("哈哈"); user.setPassword("123"); user.setMoney(100d); return user; } /** * 修改用户的方法 * @param cookieValue * @return */ @RequestMapping(path="/updateUser") public String updateUser(User user) { System.out.println(user); return "success"; }
-
修饰的方法没有返回值↓
-
/** * 作用在方法,先执行 * @param name * @return */ @ModelAttribute public void showUser(String name,Map<String, User> map) { System.out.println("showUser执行了..."); // 模拟从数据库中查询对象 User user = new User(); user.setName("哈哈"); user.setPassword("123"); user.setMoney(100d); user.setMoney(100d); map.put("abc", user); } /** * 修改用户的方法 * @param cookieValue * @return */ @RequestMapping(path="/updateUser") public String updateUser(@ModelAttribute(value="abc") User user) { System.out.println(user); return "success"; }
SessionAttributes注解
- 作用:用于多次执行控制器方法间的参数共享
- 属性:
- value:指定存入属性的名称