数据类型的绑定
什么叫做数据类型的绑定?
类似于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