springmvc可以单例开发,Handler中一个方法为一个请求的servlet
@controller:标识注解类为一个Handler
@RequestMapping:将url进行映射具体Handler和Handler中具体方法
springmvc中注解开发的参数绑定
绑定过程:将request请求中存储的key/value的数据,通过内置的转换机制,将key/value串转成形参需要的结果并传给形参。
绑定所支持的类型:
1)默认支持很多类型:request,response,session,model/modelMap(模型数据会存储requset域中)
2)支持简单数据类型,整形,字符串,日期类型
需保证request请求的参数名和形参名称一致,会自动绑定
如果requset请求参数名与形参名不一致,可以使用@RequestParam注解指定request请求的参数名称,注解在形参前进行绑定。
3)支持pojo类型
需保证request请求的参数与pojo类的属性名称一致,自动将request请求的参数值转换成对应属性类型,并将值设置到该属性。
形参中同时又pojo类型和简单数据类型,通过名称设置值,参数绑定互不影响
4)自定义参数绑定
举例日期类型自定义绑定
设置Converter<源类型,目标类型>接口实现类
将request参数类型String转为java.util.Date类型,实现接口Converter<String,Date>
转换目标类型与pojo中需求转换属性的数据类型一致。
参数绑定的实现:
基本数据类型实现自动绑定:
提交表单
<form action="${pageContext.request.contextPath }/login" method="post">
<input type="text" name="username">
<input type="password" name="password">
<button type="submit" value="submit"/>
</form>
@RequestMapping("/")Controller 内方法形参
@RequestMapping("/login")
public String login(String username,String password) {}
pojo类属性与request参数自动绑定:
表单
<form action="${pageContext.request.contextPath }/item/query" method="post">
<input type="submit" value="GO" />
<input type="text"name="name"/>
</form>
@RequestMapping("/item") 方法中pojo作为形参
public ModelAndView queryByParam(Item item) {}
数组类型的绑定:
提交数组表单:
<form action="${pageContext.request.contextPath }/item/delete" name="deleteForm" method="post" >
<c:forEach items="${items }" var="item" varStatus="itemStatus">
<input type="checkbox" name="ids" value="${item.id }" />
</c:forEach>
</form>
@RequestMapping("/item") Controller 数组形参方法:
@RequestMapping("/delete")
public String deleteByIds(Integer[] ids) {}
List类型的绑定:
直接使用参数List绑定报错 public String editByList(List<Item> items) {}
Request processing failed; nested exception is java.lang.IllegalStateException: No primary or default constructor found for interface java.util.List] with root cause
使用包装pojo类型将请求参数传递到成员变量list<T> 中T的相应成员变量
包装的pojo类:
public class ItemQueryVo {
private List<Item> items;
public List<Item> getItems() {
return items;
}
public void setItems(List<Item> items) {
this.items = items;
}
}
@RequestMapping("/item") Controller 包装pojo类型参数方法:
public String editByList(ItemQueryVo itemQueryVo) {}
请求表单的参数命名:
<form action="${pageContext.request.contextPath }/item/edit" method="post" name="testEditFrom">
<c:forEach begin="0" end="5" var="i">
<input type="text" name="items[${i }].name" />
</c:forEach>
</form>
Set类型的绑定:
也需为包装pojo类型中成员变量进行数据绑定,绑定与List绑定相同。在此不举例
Map类型的绑定:
Map类型数据绑定需作为包装pojo类型中成员变量,所以方法参数类型为包装的pojo类型
包装pojo类:
public class ItemQueryVo {
private Map<String,Item> itemMap;
public Map<String, Item> getItemMap() {
return itemMap;
}
public void setItemMap(Map<String, Item> itemMap) {
this.itemMap = itemMap;
}
}
@RequestMapping("/item") Controller的方法体:
@RequestMapping("/edit")
public String editByList(ItemQueryVo itemQuerVo) { return "item/success"; }
reuqest请求表单参数名设计
<form action="${pageContext.request.contextPath }/item/edit" method="post" name="testEditFrom">
<input type="text" name="itemMap['a'].name" />
<input type="text" name="itemMap['b'].name" />
<input type="text" name="itemMap['c'].name" />
</form>