一:参数绑定
1.基础类型的参数绑定
要求:
页面上字段的name属性的值要和方法中参数的名称相同
@RequestParam标签的使用
当页面传递的字段name值和controller中方法中的参数名称不相同时,使用@RequestParam将页面上的字段值绑定到方法中的参数上,但是使用该注解时要求参数一定有值,如果想让其没有值时也可以,需加上:required=false,此时也可以设置传递的值为null时的默认值,使用defaultValue属性
@RequestMapping(value="editItems.do")
//@RequestParam注解将页面上name值为 pid 的字段的值绑定到id参数上
public String edit(@RequestParam(value="pid",required=false,defaultValue="1") Integer id){
return "toEdit";
}
2.Boolean类型的参数绑定
后台传递 0 或者 false 则自动转为 false
后台传递 1 或者 true 则自动转为 true
3.参数类型为包装类
如果参数类型为包装类,即类A中有另一个类B为该类A的属性,则在页面中传递值时的写法为name="B.属性"
例如:
POJO
public class QueryVo {
private User user;
private Boolean isDel;
private Items items;
Controller
@RequestMapping(value="/items/toEdit.do")
public String toEdit(QueryVo vo, Model model){
return "toEdit";
}
jsp页面
<tr>
<td width="20%" class="pn-flabel pn-flabel-h">
商品生产日期:</td><td width="80%" class="pn-fcontent">
<input type="text" class="required" name="items.createtime"
value="<fmt:formatDate value="${items.createtime }" pattern="yyyy-MM-dd HH:mm:ss"/>" maxlength="80"/>
</td>
</tr>
<tr>
<td width="20%" class="pn-flabel pn-flabel-h">
商品描述:</td><td width="80%" class="pn-fcontent">
<input type="text" class="required" name="items.detail" maxlength="80" value="${items.detail }" size="60"/>
</td>
</tr>
<tr>
<td width="20%" class="pn-flabel pn-flabel-h">
是否可用:</td><td width="80%" class="pn-fcontent">
<input type="text" class="required" name="isDel" maxlength="80" size="60"/>
</td>
</tr>
4.参数类型为集合时
参数为list时不能直接放在controller方法中的参数上,而时应该放在包装类中进行接收
a、参数为Map
POJO
public class QueryVo {
private Map<String , String> map;
JSP
<tr>
<td width="20%" class="pn-flabel pn-flabel-h">
数组:</td><td width="80%" class="pn-fcontent">
<input type="text" class="required" name="map['color']" maxlength="80" size="60"/>
<input type="text" class="required" name="map['size']" maxlength="80" size="60"/>
</td>
</tr>
b、参数为List,泛型为String
POJO
public class QueryVo {
private List<String> list;
JSP
<tr>
<td width="20%" class="pn-flabel pn-flabel-h">
list:</td><td width="80%" class="pn-fcontent">
<input type="text" class="required" name="list" maxlength="80" size="60"/>
<input type="text" class="required" name="list" maxlength="80" size="60"/>
</td>
</tr>
c、参数为List,泛型为类
POJO
public class QueryVo {
private List<User> users;
JSP
<tr>
<td width="20%" class="pn-flabel pn-flabel-h">
list==User1:</td><td width="80%" class="pn-fcontent">
<input type="text" class="required" name="users[0].username" maxlength="80" size="60"/>
<input type="text" class="required" name="users[0].address" maxlength="80" size="60"/>
</td>
</tr>
<tr>
<td width="20%" class="pn-flabel pn-flabel-h">
list==User2:</td><td width="80%" class="pn-fcontent">
<input type="text" class="required" name="users[1].username" maxlength="80" size="60"/>
<input type="text" class="required" name="users[1].address" maxlength="80" size="60"/>
</td>
</tr>
d、参数类型为日期
由于日期类型的格式不确定,因此在进行参数绑定之前需要使用转换器对日期的格式进行转换
(1)、编写转换器类
package com.ssm.common.convertion;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.core.convert.converter.Converter;
/**
* 自定义日期转换类,实现Converter接口
* Converter<S, T> 其中:S 是页面传递的参数类型 T 是需要转换为的类型
* @author Administrator
*
*/
public class DateConvertor implements Converter<String, Date> {
@Override
public Date convert(String source) {
try {
if(source != null){
return new SimpleDateFormat("yyyy-MM-dd HH-mm-ss").parse(source);
}
} catch (Exception e) {
// TODO: handle exception
}
return null;
}
}
(2)、在springmvc核心配置文件中添加转换器
<!-- 处理器映射器,处理器适配器
使用该配置可以替代处理器适配器和处理器映射器的配置-->
<mvc:annotation-driven conversion-service="conversionService" />
<!-- 配置自定义转换器 -->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="com.ssm.common.convertion.DateConvertor"></bean>
</list>
</property>
</bean>
e、接收的参数类型为数组
springmvc默认会将具有同名框的一组值使用", "隔开,即使用逗号+空格进行分割放入数组中
(1)、页面的写法
<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" varStatus="status">
<tr>
<td>
<input type="checkbox" name="ids" value="${item.id }">
<input type="hidden" name="itemList[${status.index }].id" value="${item.id }">
</td>
<td><input type="text" name="itemList[${status.index }].name" value="${item.name }"></td>
<td><input type="text" name="itemList[${status.index }].price" value="${item.price }"></td>
<td><input type="text" name="itemList[${status.index }].createtime" value="<fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/>"></td>
<td><input type="text" name="itemList[${status.index }].detail" value="${item.detail }"></td>
<td><a href="${pageContext.request.contextPath }/items/itemEdit.action?id=${item.id}">修改</a></td>
</tr>
</c:forEach>
</table>
(2)、controller中接收的参数形式
@RequestMapping("/queryitem")
public String queryItem(QueryVo queryVo, int[] ids, ArrayList<Items> itemList) {
//ids的内容为[1, 2, 3, 4, 5]
System.out.println(ids);
System.out.println(queryVo);
return "success";
}