Spring MVC 请求参数绑定及实现原理浅析

在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>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值