目录
1.参数转换规则
SpringMVC能够将请求中的参数转换为控制器方法中的参数,是因为提供的处理器会以一套规则来实现参数(请求体)的转换。这些规则(转换器)被注册到WevDataBinder中。如果我们自定义自定义了一个转换规则,注册到注册机中也可以使用,从而来转换一些特殊的参数。
2.转换器自定义
语法和原理:
- 转换器需要实现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;
}
}
3.参数传递例子
3.1.字符串转换为单个对象
@Controller
@RequestMapping(path = { "/mvcparam" })
public class MvcParamController {
/**自定义转换(1对1)*/
@RequestMapping(value = { "/mp8" })
public ModelAndView mp8(User user) {
ModelAndView mv = new ModelAndView();
mv.addObject("user", user);
mv.setViewName("mvcparam/mp8");
return mv;
}
}
http://localhost:8080/mvcparam/mp8?user=3-wangwu-1-数据转换器测试
测试:
字符串转换为user:
控制器方法获取到参数:
3.2.字符串转换为list<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工程。