一、概要
在springmvc中,接收前端提交的数据是通过方法形参来接收的。
从客户端请求的key/value数据,经过参数绑定,将key/value数据绑定到controller方法的形参上,然后就可以在controller中的方法上使用该参数了。
二、支持参数的类型
- 简单类型参数
- 内置类型参数
- 数组类型参数
- pojo类型参数
- 复杂pojo类型参数
- 集合参数
- 日期类型
- 特殊类型参数绑定
用FormattingConversionServiceFactoryBean类管理自定义参数
三、基本类型
1、说明
八种基本类型数据(包装类型)及String类型数据。
注意: 请求中的参数名必须和方法形参名称一致,
2、栗子
/**
* 基本类型参数绑定
* /base?username='admin'&age=1&flag=true
*/
@RestController
@Slf4j
public class BaseParamsController {
@RequestMapping("/base")
public String base(String username, int age, boolean flag) {
log.debug("基本类型参数{}", username);
log.debug("基本类型参数{}", age);
log.debug("基本类型参数{}", flag);
return "基本类型参数绑定";
}
}
四、数组集合类型
1、说明
在请求的url的参数中使用同一个键传递多个值,springmvc中可以定义数组接受参数
如何使用List的参数必须结合@RequestParam()注解
注意: 请求中的参数名必须和方法形参名称一致,
2、栗子
控制层
@RestController
@Slf4j
@RequestMapping("/params")
public class ArrayParamsController {
@RequestMapping("/base")
public String baseArray(String[] arr) {
for (String name : arr) {
log.debug("数组参数{}", name);
}
return "数组类型参数绑定";
}
/**
* 注意不支持这种写法,会报错 必须结合@RequestParam()
* 注意不支持这种写法,会报错 必须结合@RequestParam()
* 注意不支持这种写法,会报错 必须结合@RequestParam()
*/
@RequestMapping("/list")
public String baseList(@RequestParam("arr") List<String> arr) {
for (String name : arr) {
log.debug("数组参数{}", name);
}
return "集合类型参数绑定";
}
}
测试
imageajax
let arr={params:['admin','test']};
$.ajax({url:请求地址,
data:arr,
// 注意添加traditional:true,表示不深度序列化参数对象
traditional:true, //默认false
type:"POST",
success:function(){
}
});
五、pojo类型
1、说明
在请求的方法的形参上使用pojo引用类型和pojo类型参数的名称无关,使用该pojo对像中set方法进行参数绑定。
注意:
Http请求中参数的key要和该pojo的setter方法的后缀一致,即可以完成参数绑定。
2、栗子
控制层
@RestController
@Slf4j
public class PojoParamsController {
@RequestMapping("/pojo")
public String pojoParams(User user) {
log.debug(user.getUid()+"");
log.debug(user.getName());
return "简单对象参数";
}
}
测试
image image六、pojo嵌套类型
1、说明
请求的参数中对象里嵌套对象
2、栗子
pojo
public class User {
private Integer uid;
private String name;
private Address address;
}
public class Address {
private Integer addressId;
private String city;
}
控制层
@RestController
@Slf4j
@RequestMapping("/nest")
public class NestPojoController {
@RequestMapping("/pojo")
public String nestPojoParams(User user) {
log.debug(user.getName());
log.debug(user.getAddress().getCity());
return "对象嵌套对象";
}
}
测试
image七、pojo嵌套集合
1、说明
springmvc不支持集合类型参数直接绑定形参上。解决方案有两种前面已经演示过了使用@RequestParam注解
还可以可以把集合类型参数封装到pojo中,则可以完成参数绑定
个人建议复杂的嵌套客服端使用json格式上传比较合理
2、栗子
pojo
/**
* @author zhangwei
*/
@Data
public class User implements Serializable {
private Integer uid;
private String name;
private Address address;
private List<Address> addressList;
private Map<String,Address> map;
}
控制层
@RestController
@RequestMapping("/pojo")
@Slf4j
public class PojoListController {
@RequestMapping("/list")
public String nestListParams(User user) {
log.debug(user.getName());
log.debug(user.getAddressList().toString());
return "pojo对象嵌套list";
}
@RequestMapping("/map")
public String nestMapParams(User user) {
log.debug(user.getMap().get("1").toString());
return "pojo对象嵌套Map";
}
}
测试代码
image<form action="pojo/list" method="post">
<input type="text" name="username">
<input name="addressList[0].city">
<input name="addressList[1].city">
<input type="submit" value="提交">
</form>
image
<form action="" method="post">
<input type="text" name="name">
<input type="text" name="map['address1'].city">
<input type="text" name="map['address2'].city">
<input type="submit" value="注册">
</form>
八、内置类型(SpringMVC)
1、说明
在控制器方法的形参上使用该类型的变量,则Spring会自动创建相应类型的对像绑定到该形参之上(和形参名无关)
2、栗子
@RestController
@Slf4j
public class SpringTypeController {
@RequestMapping("/type")
private String testSpringType(HttpServletRequest request,
HttpServletResponse response,
HttpSession session,
Model model,
ModelMap modelMap,
Map map) {
log.debug(request.toString(),
response.toString(),
session.toString(),
model.toString(),
modelMap.toString(),
map.toString()
);
return "内置类型";
}
}
九、日期类型处理
1、说明
日期的处理一般分两种普通的请求日期参数转化,另外还有json数据的日期格式,这里说的是普通的日期参数的转化,
推荐使用注解方式 @DateTimeFormat
2、栗子
自定义的converter
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateConverter implements Converter<String, Date> {
@Override
public Date convert(String date) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
// 是否开启严格模式解析
dateFormat.setLenient(false);
try {
return dateFormat.parse(date);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
配置文件注册FormattingConversionServiceFactoryBean
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="com.xxx.xxx.DateConverter" />
</list>
</property>
</bean>
配置文件中的annotation-driven标签中注册
<mvc:annotation-driven conversion-service="conversionService" />
控制层
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
/**
* @author zhangwei
*/
@RestController
@RequestMapping("/converter")
@Slf4j
public class DateConverterController {
@RequestMapping("/date")
public String testDateConverter(Date joinDate) {
log.debug(joinDate.getClass().getTypeName());
return "自定义转化器";
}
}
测试
image
网友评论