参数绑定

数据类型的绑定

什么叫做数据类型的绑定?
类似于struts的参数注入,从客户端请求key/value数据,通过参数绑定,把key/value绑定在Controller方法的形参上。
springmvc中,接受页面提交的数据是通过方法行形参来接收,而不是在controller类定义成员变量接受!!!!
执行流程:
客户端请求key/value --->处理器适配器提供参数绑定组件将key/value数据转化成controller方法的形参。参数绑定组件:在springmvc早起版本使用PropertyEditor(只能将字符串转化为java对象),后期使用converter(进行任意类型的转换),springmvc提供了很多controller,在特殊情况下需要自定义controller,例如日期数据绑定

默认支持绑定的类型:
直接在controller方法形参上定义下边2类型的对象,就可以使用这些对象。在参数绑定过程中,如果玉带下边类型直接绑定。
1、HttpServletRequest
2、HttpServletResponse
3、HttpSession
4、Model/ModelMap
为什么上面的可以直接绑定呢?我们知道springmvc是基于Servlet的,所以servletDispatcher中直接能得到的request、response、session就可以直接绑定了。我们查看源码发现,model的作用是将数据填充到request域,也就是说类似于一个缓存区一样,modelMap是model接口的实现类,所以model和modelMap可以直接绑定。

简单类型的绑定
1、直接绑定
要求controller形参名和request中的传入参数名一致。
2、使用@RequestParam注解
不需要形参名和request传入参数名一致
作用于参数,三个属性:value(必选),defaultValue(可选),required(可选)
value的值为request中的传入参数名,绑定注解作用的那个变量
required的值为true的时候框架会给我们加一个validate验证,如果该参数没有传入报错400不能没有指定参数
defaultValue都懂
小例子:
@ResultMapping(value="/editItems",method={RequestMethod.POST,RequestMethod.GET})
public String editItems(Model model,@RequestParam(value="id",required=true) Integer items_id) throws Exception{
//...
}

POJO类型的绑定
只有表单元素的name和pojo类型属性名一致才能注入。

 

数组的绑定:

  要求:前台传递的数据类型和后台数组的类型相同

  前端页面的name属性与后台数组名相同即可。

  <c:forEach items="${users}" var="us">

    <tr>

    <td><input type="checkbox" name="id_items" value="${us.id}" ></td>

    <td>...</td>

    </tr>  

  </c:forEach>

  public deleteBatch(Integer[] id_items){

  }

 

list的参数绑定

list参数绑定的是pojo类型,也就是实现List<pojo>的参数注入。

需要借助pojo对象,然后在pojo对象中的list集合属性为List<pojo>。有点绕,就是list参数绑定实现的是绑定pojo中的list集合,实现集合中的pojo注入。

要求:

public Class UserVo{
  private List<user> userItems;  
    ...
}

@RequestMapping("/...")
public String AddUserBatch(UserVo uservo){
...
}

...
<tr>

  <td><input name="userItems[${status.index}].name" value="${item.name}"></td>
  <td>
<input name="userItems[${status.index}].pwd" value="${item.pwd}"></td> 
  <td>
<input name="userItems[${status.index}].createTime" value="${item.createTime}"></td>

</tr>

页面中的userItems为UserVo中list属性名,[${status.index}]因为list内部是数组结构代表数组的下标,.name表示集合内pojo的属性名

 

map的参数绑定

和list参数绑定类似,借助pojo。就是实现在pojo的map属性中值的注入。

例子:

public class userVo{
  private Map mp;
  ...    
}

@RequestMapping("/...")
public String test(UserVo uservo){
  ...
}

...
<tr>
  <td>姓名:</td>
  <td><input type="text" name="mp['name']"/></td>
  <td>年龄</td>
  <td><input type="text" name="mp['price']"/></td>
</tr>

说明:mp表示vo类中的map属性的属性名,['name']里面的name表示map的key

 

posted @ 2016-11-24 23:43  guodaxia  阅读(155)  评论(0编辑  收藏  举报