目录
1.参数转换规则
2.转换器自定义
3.参数传递例子
3.1.字符串转换为单个对象
3.2.字符串转换为list
SpringMVC能够将请求中的参数转换为控制器方法中的参数,是因为提供的处理器会以一套规则来实现参数(请求体)的转换。这些规则(转换器)被注册到WevDataBinder中。如果我们自定义自定义了一个转换规则,注册到注册机中也可以使用,从而来转换一些特殊的参数。
语法和原理:
转换器需要实现Converter<S, D>接口,S代表源参数类型,D代表目标参数类型。系统启动成功注册该转换器后,在参数传递到后台,mvc遍历各个转换器寻找对应的转换器,如果S符合前台参数类型,且D是控制器参数类型,则用该转换器来转换参数。如果有多个相同类型的参数转换器,在遍历时寻找到合适的就立马使用,另一个转换器不会被使用。例如将String类型的参数转换为User类型,String中各属性用“-”隔开。
自定义转换器:
package com.zyf.springMVC.mvcparam; import org.springframework.core.convert.converter.Converter; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; /** * 自定义mvc参数转换器 * String类型转换为User类型 */ @Component public class String2UserConverter implements Converter<String, User> { @Override public User convert(String source) { if (StringUtils.isEmpty(source)) { return null; } String[] userArr = source.split("-"); if (userArr.length == 0) { return null; } User user = new User(); user.setId(Integer.parseInt(userArr[0])); user.setName(userArr[1]); user.setSex(Integer.parseInt(userArr[2])); user.setNote(userArr[3]); return user; } }http://localhost:8080/mvcparam/mp8?user=3-wangwu-1-数据转换器测试
测试:
字符串转换为user:
控制器方法获取到参数:
字符串参数可以包号多个实体数据,每个用逗号隔开(有逗号springmvc就认为其是数据参数),mvc将其转换为数组,然后根据3.1的转换器转换为list<User>。
语法:url中的参数名和控制器方法的参数名要相同。
url中的字符串参数被自定义转换器转换为User类型。
@RequestMapping(value = { "/mp9" }) public ModelAndView mp9(List<User> userList) { ModelAndView mv = new ModelAndView(); mv.addObject("userList", userList); mv.setViewName("mvcparam/mp9"); return mv; }URL:http://localhost:8080/mvcparam/mp9?userList=3-wangwu-1-数据转换器测试,4-zhaoliu-2-数据list转换器测试
测试:
github:https://github.com/zhangyangfei/SpringBootLearn.git中的springMVC工程。