SpringMVC参数接收
1 绑定简单类型
要根据id查询商品数据,需要从请求的参数中把请求的id取出来。Id应该包含在Request对象中。可以从Request对象中取id。
public ModelAndView itemEdit(HttpServletRequest request) {
//从Request中取id String strId = request.getParameter("id");
}
如果想获得Request对象只需要在Controller方法的形参中添加一个参数即可。Springmvc框架会自动把Request对象传递给方法。
处理器形参中添加如下类型的参数处理适配器会默认识别并进行赋值 绑定简单数据类型
当请求的参数名称和处理器形参名称一致时会将请求参数与形参进行绑定。从Request取参数的方法可以进一步简化。
@RequestMapping("/itemEdit") public String itemEdit(Integer id, Model model) { Items items = itemService.getItemById(id); //向jsp传递数据 model.addAttribute("item", items); //设置跳转的jsp页面 return "editItem"; }
mvc底层调用request 赋值
参数类型推荐使用包装数据类型,因为基础数据类型不可以为null 整形:Integer、int 字符串:String 单精度:Float、float 双精度:Double、double 布尔型:Boolean、boolean 说明:对于布尔类型的参数,请求的参数值为true或false。
方法形参中的名字跟页面传递过来的名字保持一致
2 使用pojo接收表单数据
如果提交的参数很多,或者提交的表单中的内容很多的时候可以使用pojo接收数据。要求pojo对象中的属性名和表单中input的name属性一致。 页面定义如下;
<input type="text" name="name"/>
<input type="text" name="price"/>
@RequestMapping("/queryitem") public String queryItem(Pojo pojo) { System.out.println(pojo.getName()); System.out.println(pojo.getPrice()); return null; }
请求的参数名称和pojo的属性名称一致,会自动将请求参数赋值给pojo的属性
提交的表单中不要有日期类型的数据,否则会报400错误。如果想提交日期类型的数据需要用到后面的自定义参数绑定的内容。
3 绑定包装pojo
页面定义:
<input type="text" name="items.name" /> <input type="text" name="items.price" /> @RequestMapping("/queryitem") public String queryItem(QueryVo queryVo) { System.out.println(queryVo.getItems().getName()); System.out.println(queryVo.getItems().getPrice()); return null; }
4 高级参数绑
绑定数组
Jsp中实现
<c:forEach items="${itemList }" var="item"> <tr> <td> <input name="ids" value="${item.id}" type="checkbox"> </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>
Controller中的接收 Controller方法中可以用String[]接收,或者pojo的String[]属性接收。两种方式任选其一即可
@RequestMapping("/queryitem") public String queryItem(QueryVo queryVo, String[] ids) { System.out.println(queryVo.getItems().getName()); System.out.println(queryVo.getItems().getPrice()); System.out.println(ids.toString()); return null; } public calss QueryVo{ private String[] ids; public String[] getIds(){ return ids; } public void setIds(String[] ids) { this.ids=ids; } }
将表单的数据绑定到List
需求分析
要想实现商品数据的批量修改,需要在商品列表中可以对商品信息进行修改,并且可以批量提交修改后的商品数据。
接收商品列表的pojo
List中存放对象,并将定义的List放在包装类中,使用包装pojo对象接收
public class QueryVo {
private Items items; private List<Items> itemsList; public List<Items> getItemsList() { return itemsList; } public void setItemsList(List<Items> itemsList) { this.itemsList = itemsList; } public Items getItems() { return items; } public void setItems(Items items) { this.items = items; } }
jsp页面的编写
<c:forEach items="${itemList }" var="item" varStatus="i">
<tr>
<td><input type="checkbox" value="${item.id}" name="ids" /></td>
<td><input type="text" value="${item.name }" name="itemsList[${i.index}].name" /></td>
<td><input type="text" value="${item.price }" name="itemsList[${i.index}].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>
varStatus属性常用参数总结下: ${status.index} 输出行号,从0开始。 ${status.count} 输出行号,从1开始。 ${status.current} 当前这次迭代的(集合中的)项 ${status.first} 判断当前项是否为集合中的第一项,返回值为true或false ${status.last} 判断当前项是否为集合中的最后一项,返回值为true或false begin、end、step分别表示:起始序号,结束序号,跳跃步伐。
Contrller层的编写 @RequestMapping("/queryitem") public String queryItem(QueryVo queryVo, String[] ids) { System.out.println(queryVo.getItems().getName()); System.out.println(queryVo.getItems().getPrice()); System.out.println(ids.toString()); return null; }
注意:接收List类型的数据必须是pojo的属性,方法的形参为List类型无法正确接收到数据。
5 自定义参数绑定
由于日期数据有很多种格式,所以springmvc没办法把字符串转换成日期类型。所以需要自定义参数绑定。前端控制器接收到请求后,找到注解形式的处理器适配器,对RequestMapping标记的方法进行适配,并对方法中的形参进行参数绑定。在springmvc这可以在处理器适配器上自定义Converter进行参数绑定。如果使用<mvc:annotation-driven/>可
自定义Converter
public class DateConverter implements Converter<String, Date> { @Override public Date convert(String source) { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { return simpleDateFormat.parse(source); } catch (ParseException e) { e.printStackTrace(); } return null; } }
配置Converter
在springmvc.xml中告mvc配置了转换器
<!-- 转换器配置 --> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="cn.itcast.springmvc.convert.DateConverter"/> </set> </property>
</bean>
然后再在springmvc.xml中配置
<!-- 加载注解驱动 --> <mvc:annotation-driven conversion-service="conversionService"/>