Springmvc入门基础(四) ---参数绑定
1.默认支持的参数类型
处理器形参中添加如下类型的参数处理适配器会默认识别并进行赋值。
除了ModelAndView以外,还可以使用Model来向页面传递数据,
Model是一个接口,在参数里直接声明model即可。
如果使用Model则可以不使用ModelAndView对象,Model对象可以向页面传递数据,View对象则可以使用String返回值替代。
不管是Model还是ModelAndView,其本质都是使用Request对象向jsp传递数据。
@RequestMapping(value = {"/itemlist.action","/samePage.action"})
public String itemList(Model model,
HttpServletRequest request,
HttpServletResponse response,
HttpSession session
) throws Exception{
//从Mysql中查询
List<Items> list = itemService.selectItemsList();
model.addAttribute("itemList", list);
return "itemList";
}
}
2.绑定简单类型
当请求的参数名称和处理器形参名称一致时会将请求参数与形参进行绑定。
这样,从Request取参数的方法就可以进一步简化。
<td><a href="${pageContext.request.contextPath }/itemEdit.action?id=${item.id}">修改</a></td>
@RequestMapping("/itemEdit")
public String queryItemById(int id, ModelMap model) {
// 根据id查询商品数据
Item item = this.itemService.queryItemById(id);
model.addAttribute("item", item);
return "itemEdit";}
以下数据类型都可以通过以上方式进行绑定:
参数类型推荐使用包装数据类型,因为基础数据类型不可以为null
整形:Integer、int
字符串:String
单精度:Float、float
双精度:Double、double
布尔型:Boolean、boolean
说明:对于布尔类型的参数,请求的参数值为true或false。或者1或0
请求url:
http://localhost:8080/xxx.action?id=2&status=false
处理器方法:
public String editItem(Model model,Integer id,Boolean status)
使用@RequestParam常用于处理简单类型的绑定。
@RequestParam使用
@RequestMapping("/itemEdit")//此处不加后缀.aciont也可
public String queryItemById(@RequestParam(value = "itemId", required = true, defaultValue = "1") Integer id,
ModelMap modelMap) {
// 根据id查询商品数据
Item item = this.itemService.queryItemById(id);
// 把商品数据放在模型中
modelMap.addAttribute("item", item);
return "itemEdit";}
value:参数名字,即入参的请求参数名字,如value=“itemId”表示请求的参数中的名字为itemId的参数的值将传入到id中来
required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报错
TTP Status 400 - Required Integer parameter 'XXXX' is not present
defaultValue:默认值,表示如果请求中没有同名参数时的默认值
主要用来处理前后端参数名不一致的问题。
3.绑定pojo类型
如果提交的参数很多,或者提交的表单中的内容很多的时候,可以使用简单类型接受数据,也可以使用pojo接收数据。
要求:pojo对象中的属性名和表单中input的name属性一致,会自动将请求参数赋值给pojo的属性。
jsp页面表单
<form id="itemForm" action="${pageContext.request.contextPath }/updateitem.action" method="post">
<input type="hidden" name="id" value="${item.id }" /> 修改商品信息:
<table width="100%" border=1>
<tr>
<td>商品名称</td>
<td><input type="text" name="name" value="${item.name }" /></td>
</tr>
<tr>
<td>商品价格</td>
<td><input type="text" name="price" value="${item.price }" /></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="提交" />
</tr>
</table>
</form>
pojo类
public class Items {
private Integer id;
private String name;
private Float price;
4.绑定包装pojo
包装类在jsp页面的name属性值需要以包装类中的属性值点出pojo类的属性值,比如item.id,然后在处理器中取值的时候,也是由包装类get到包装类的属性值,然后再get出pojo类的属性值,比如queryVo.getItem.getId()
jsp页面
查询条件:
<table width="100%" border=1>
<tr>
<td>商品id<input type="text" name="item.id"/></td>
<td>商品名称<input type="text" name="item.name"/></td>
</tr>
<tr>
<td><input type="submit" value="查询"/></td>
</tr>
</table>
pojo包装类
public class QueryVo {
private Item item;
//此处省略get,set方法
}
处理器:
// 绑定包装数据类型
@RequestMapping("/queryItem")
public String queryItem(QueryVo queryVo) {
System.out.println(queryVo.getItem().getId());
System.out.println(queryVo.getItem().getName());
return "itemList";
}
5.自定义参数绑定
由于日期数据有很多种格式,springmvc没办法把字符串转换成日期类型。所以需要自定义参数绑定。
前端控制器接收到请求后,找到注解形式的处理器适配器,对RequestMapping标记的方法进行适配,并对方法中的形参进行参数绑定。可以在springmvc处理器适配器上自定义转换器Converter进行参数绑定。
一般使用<mvc:annotation-driven/>注解驱动加载处理器适配器,可以在此标签上进行配置。
jsp页面时间字段:
在jsp中加入下面的标签库
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
时间字段
<td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
创建自定义转换器类
//Converter<S, T>
//S:source,需要转换的源的类型
//T:target,需要转换的目标类型
public class DateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
try {
// 把字符串转换为日期类型
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyy-MM-dd HH:mm:ss");
Date date = simpleDateFormat.parse(source);
return date;
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 如果转换异常则返回空
return null;
}
}
在web.xml配置自定义的转换器类
<!-- 配置注解驱动 -->
<mvc:annotation-driven conversion-service="conversionService" />
<!-- 转换器配置 -->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="cn.springmvc.converter.DateConverter" />
</set>
</property>
</bean>
6.绑定到数组-ids
jsp页面-<td><input type="checkbox" name="ids" value="${item.id}"/></td>
页面选中多个checkbox向controller方法传递
<table width="100%" border=1>
<tr>
<td>选择</td>
<td>商品名称</td>
<td>商品价格</td>
<td>生产日期</td>
<td>商品描述</td>
<td>操作</td>
</tr>
<c:forEach items="${itemList }" var="item">
<tr>
<td><input type="checkbox" name="ids" value="${item.id}"/></td>
<td>${item.name }</td>
<td>${item.price }</td>
<td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
<td>${item.detail }</td>
<td><a href="${pageContext.request.contextPath }/itemEdit.action?id=${item.id}">修改</a></td>
</tr>
</c:forEach>
</table>
绑定数组类型,可以使用两种方式,1.包装类的属性接收(在包装类中添加个数组属性值,用来接受ids数组),2.直接在处理器形参中接收
public class QueryVo {
private Item item;
private Interger[] ids;
//此处省略get,set方法
}
@RequestMapping("/queryItem.action")
public String queryItem(QueryVo queryVo, Integer[] ids) {
System.out.println(queryVo.getItem().getId());
System.out.println(queryVo.getItem().getName());
System.out.println(queryVo.getIds().length);//包装类属性接收
System.out.println(ids.length);//处理器中形参直接接收
return "success";
}
7.绑定到List
使用包装pojo类属性值接收list
注意:接收List类型的数据必须是pojo的属性,如果方法的形参为ArrayList类型无法正确接收到数据
public class QueryVo {
private Item item;
private Interger[] ids;
private List<Iteam> iteamList;
//此处省略get,set方法
}
jsp页面
name属性必须是list属性名+下标+元素属性
<form action="${pageContext.request.contextPath }/updates.action" method="post">
<table width="100%" border=1>
<c:forEach items="${itemList }" var="item" varStatus="s">
<tr>
<td><input type="checkbox" name="ids" value="${item.id }"></td>
<td><input type="text" name="itemsList[${s.index}].name" value="${item.name }"></td>
<td><input type="text" name="itemsList[${s.index }].price" value="${item.price }"></td>
<td>${item.detail }</td>
<td><a href="${pageContext.request.contextPath }/itemEdit.action?id=${item.id}">修改</a></td>
</tr>
</c:forEach>
</table>
<input type="submit" value="修改">
</form>
${current} 当前这次迭代的(集合中的)项
${status.first} 判断当前项是否为集合中的第一项,返回值为true或false
${status.last} 判断当前项是否为集合中的最
varStatus属性常用参数总结下:
${status.index} 输出行号,从0开始。
${status.count} 输出行号,从1开始。
${status.后一项,返回值为true或false
begin、end、step分别表示:起始序号,结束序号,跳跃步伐。
包装pojo类属性值接收List
@RequestMapping("/update.action")
public String queryItem(QueryVo queryVo) {
System.out.println(queryVo.getIteamList().size());//包装类属性接收
return "success";
}