在Servlet的时候,接收参数一般是下面这样:
String ageStr = request.getParameter("age");
Integer age = Integer.parseInt(ageStr);
这样操作比较麻烦,针对更复杂的请求体的情况更是,而Spring MVC在接收参数的时候,可以根据Handler方法中声明的形参进行参数绑定和类型转换。
针对请求体,比如JSON转实体时,Spring会在有JSON依赖的情况下进行自动转换,响应实体对象为JSON时进行相反的操作。
1)当Handler上面需要使用原生Servlet对象HttpServletRequest、HttpServletResponse和HttpSession时,直接在Handler方法的形参上面声明使用即可。
2)绑定简单参数类型
简单参数类型:byte、short、int、long、char、float、double、boolean
上面的char一般会使用String进行代替
在形参上绑定时推荐使用上面类型的包装类型,因为基础类型不能是null,对应布尔类型,请求参数值可以为true/1或者false/0
能保证请求参数名和形参列表顺序的情况下,依次在Handler上面声明形参即可,如不能保证则需要使用@RequestParam注解进行手动映射
@RequestMapping("/index") //?ids=666
public ModelAndView index(@RequestParam("ids") Integer id){
//...处理逻辑
}
3) 绑定Pojo类型参数
@RequestMapping("/index") //?id=666&name=zhangsan
public ModelAndView index(User user){
//...处理逻辑
}
传参参数名和pojo属性保持一致,如pojo属性类型是复杂数据类型,通过"属性名.子类型属性"的方式进一步来确定即可
如
class User{
private Integer id;
private String name;
private Address address;
//... getXXX setXXX
}
class Address{
private String city;
private String prov;
//... getXXX setXXX
}
此时url参数中使用诸如:?id=1&name=zhangsan&address.city=hangzhou&address.prov=zhejiang
4)绑定日期类型参数(需配置自定义类型转换器)
?birthday=2020-03-24
Handler为
@RequestMapping("/handler")
public ModelAndView handler(Date birthday){
//处理逻辑
}
因为日期时间格式可以有比较多的格式组合,所以需要自己在自定义转换器中指定接收的类型进行转换,自定义转换器需实现Converter接口,例子如下
public class DateConverter implements Converter<String,Date>{
@Override
public Date convert(String source){
//完成字符串向日期的转换
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
try{
Date parse = simpleDateFormat.parse(source);
return parse;
}catch(ParseException e){
e.printStackTrace();
}
return null;
}
}
然后在要被web.xml中servlet-class的DispatcherServlet设置初始化参数contextConfigLocation的值springmvc.xml文件中进行自定义类型转换器注册,示例如下:
<mvc:annotation-driven conversion-service="conversionServiceBean"/>
<!-- 注册自定义类型转换器 -->
<bean id="conversionServiceBean" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.example.study.converter.DateConverter"/>
</set>
</property>
</bean>