[关闭]
@MrXiao 2018-03-05T12:11:36.000000Z 字数 3414 阅读 797

Spring MVC(3)——参数绑定

SpringMVC


springmvc接收请求的key/value串(比如:id=2&type=101),经过类型转换,将转换后的值赋值给controller方法的形参,这个过程就叫参数绑定。

1、默认支持的类型

在controller方法形参中如下类型是可以直接绑定成功,springmvc框架给以下类型的参数直接赋值:

2、基本类型

基本类型类型:Integer、string、boolean、float。。。

绑定规则:

  1. 对于基本类型参数绑定,当请求的参数的名称和controller方法的形参名一致时可以绑定成功。
  2. 如果请求的参数的名称和controller方法的形参名不一致时,如何绑定?
    就要使用@RequestParam进行绑定:

    使用方法如下:
    @RequestParam(value="ids") Integer id,将请求的参数名为ids的值绑定方法形参的id上。
    required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报;TTP Status 400 - Required Integer parameter 'XXXX' is not present;
    defaultValue:默认值,表示如果请求中没有同名参数时的默认值

3、简单pojo

简单pojo:pojo中都基本类型,没有包括自定义pojo属性。

页面参数名称的定义:

  1. <tr>
  2. <td>名称</td>
  3. <td><input type="text" name="name" value="${item.name}"/></td>
  4. </tr>
  5. <tr>
  6. <td>价格</td>
  7. <td><input type="text" name="price" value="${item.price}"/></td>
  8. </tr>

controller方法的参数定义:

  1. @RequestMapping("editItem")
  2. public ModelAndView editItem(Item item) throws Exception {

当页面参数名称和controller方法的pojo的参数的属性名一致,可以将请求的参数绑定到pojo形参的属性中。

4、包装类pojo

包装类型pojo:pojo中属性也是一个pojo。

页面请求参数名称定义:

  1. <tr>
  2. <td>名称</td>
  3. <td><input type="text" name="item.name"/></td>
  4. </tr>
  5. <tr>
  6. <td><input type="submit" value="查询"/></td>
  7. </tr>

controller方法形参的定义:

  1. @RequestMapping(/queryItems)
  2. public ModelAndView queryItems(ItemsQueryVo itemsQueryVo) throws Exception {

包装类型的pojo绑定规则:
item是包装pojo(ItemsQueryVo)的属性名。
item.name中name就是包装pojo(ItemsQueryVo)中属性item的一个属性。

5、数组

需求: 在商品查询列表页面批量选择商品进行删除。

页面要提交多个商品id,controller方法使用数组接收页面提交的参数。
页面参数名称定义:

  1. <c:forEach var="item" items="${itemsList}">
  2. <tr>
  3. <td><input type="checkbox" name="delete_id" value="${item.id}"></td>
  4. <td><input type="checkbox" name="delete_id" value="${item.id}"></td>
  5. <td><input type="checkbox" name="delete_id" value="${item.id}"></td>
  6. <td><input type="checkbox" name="delete_id" value="${item.id}"></td>
  7. </tr>
  8. </c:forEach>

controller方法形参数定义:

  1. @RequestMapping(/deleteItems)
  2. public ModelAndView queryItems(Integer[] delete_id) throws Exception {

绑定规则:
如果请求多个参数且名称一致,可以绑定到和请求参数名一致的数组中。

6、List

需求:
实现商品信息批量修改功能,类似功能有成绩录入,一次录入好多门成绩,执行批量提交。

页面参数名称定义:

  1. <td><input type="text" name="itemsList[${status.index}].name"/></td>
  2. <td><input type="text" name="itemsList[${status.index}].prive"/></td>
  3. <td><input type="text" name="itemsList[${status.index}].createtime"/></td>

controller方法形参数定义:

  1. @RequestMapping(/queryItems)
  2. public ModelAndView queryItems(ItemsQueryVo itemsQueryVo) throws Exception {

itemsQueryVo定义:

  1. public class ItemsQueryVo {
  2. private List<Item> itemsList;

7、自定义参数绑定

问题:
页面输入 2020-12-12 12:12:12(年月日时分秒),springmvc默认提供年月日的绑定,没有对时分秒进行绑定。

解决问题:
需要自定义参数绑定器,实现将页面输入年月日 时分秒全部转成日期类型数据。

自定义参数绑定器方法:
自定义参数绑定器实现Conver,S表示源类型,T表示目标类型,S是页面请求的参数类型,即string,目标类型是要绑定到pojo的属性的类型,上边的例子T目标类型就是:Items中createtime属性类型即java.util.Date

开发自定义参数绑定器:

  1. public class DateConver implements Converter<String, Date> {
  2. @Override
  3. public Date convert(String paramS) {
  4. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  5. try {
  6. return sdf.parse(paramS);
  7. } catch (ParseException e) {
  8. e.printStackTrace();
  9. return null;
  10. }
  11. }
  12. }

在springmvc.xml中在处理器适配器上配置参数绑定器:

  1. <!-- 简写 -->
  2. <mvc:annotation-driven conversion-service="conversionService"/>
  3. <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
  4. <property name="converters">
  5. <list>
  6. <bean class="com.topvision.ssm.DateConver"></bean>
  7. </list>
  8. </property>
  9. </bean>
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注