在之前我们通过实例简单讲解过jsp页面到后台Controller的传值,其实也就是SpringMVC的出纳书绑定,今天我们对SpringMVC的几种常用参数绑定做一下介绍。
参数绑定在我们的开发中是很常用也很重要的东西,在开发中我们经常需要进行一些参数的传递,这就需要用到SpringMVC的参数绑定,参数绑定主要有简单java类型参数绑定。pojo类型、集合类型参数绑定几种,我们一一做介绍。
简单类型参数绑定
SpringMVC支持简单数据类型的参数绑定,即可将简单类型作为Controller的参数将数据进行传递,如下:
//通过@RequestParam接收request传递过来的参数
@RequestMapping(value="/editDatas",method={RequestMethod.POST,RequestMethod.GET})
public String editDatas(Model model,@RequestParam(value="num",required=true)Integer num)throws Exception{
//根据num查询数据信息
DataCustom dataCustom = (DataCustom) dataService.findDataByNum(num);
//通过形参中的model将数据传送到页面
model.addAttribute("dataCustom", dataCustom);
return "/data/editDatas";
}
在上面的代码中,我们将num作为参数传递给了controller,在这里我们使用@RequestParam进行了指定,如果jsp页面与参数名称一致,则不需要此项指定,直接将参数放入即可,如果参数名称不一致,则需要我们使用注解进行指定方可解析。
@RequestParam:
使用@RequestParam常用于处理简单类型的绑定。
value:参数名字,即入参的请求参数名字,如value="num"表示请求的参数区中的名字为item_id的参数的值将传入;
required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报404错误;
在上面的代码中形参名称为num,这里使用value="num"限定请求的参数名为num,所以页面传递参数的名必须为num。
注意:如果请求参数中没有num将报异常:
HTTP Status 500 - Required Integerparameter 'item_id' is not present
这里通过required="true"限定num参数为必需传递,如果不传递则报400错误,可以使用defaultvalue设置默认值,即使required=true也可以不传item_id参数值
pojo类型参数绑定
简单pojo参数绑定
简单的pojo参数绑定顾名思义,就是简单的一个pojo对象,并没有进行相关的包装,在开发中将pojo对象中的属性名与传递进来的属性名对应,
如果传进来的参数名称和对象中的属性名称一致则将参数值设置在pojo对象中。
例如,我们需要将jsp页面的数据提交,通过controller进行相关操作。
页面代码如下:
<input type="text" name="temp"/>
<input type="text" name="hum"/>
如上代码所示,jsp页面提交了两个值,分别为temp与hum,我们在后台将其封装在pojo对象中(Data),那么在Controller中我们就可以将pojo当做参数进行数据的接收。
如下:
@RequestMapping("/editDataSubmit")
public String editItemSubmit(Data data)throws Exception{
System.out.println(data);
}
如上代码所示,将pojo对象当做参数传递,当请求的参数名称和pojo的属性名称一致,会自动将请求参数赋值给pojo的属性。
包装pojo参数绑定
在开发中,往往一个简单的pojo对象并不能满足我们的需求,我们需要对齐进行包装,封装众多的条件以及pojo类。在SpringMVC中,其实简单的pojo参数绑定与简单pojo的参数绑定并没有太大区别。如下为包装对象:
Public class QueryVo {
private Data data;
}
在包装对象中,将简单pojo作为一个变量在包装对象中进行引用,可对简单pojo进行相关的同等操作。
在jsp页面中请求如下:
<input type="text" name="data.temp" />
<input type="text" name="data.hum" />
如上代码所示,在页面请求中通过pojo得到将值进行传递,在Controller中,我们则通过包装对象来获取其值:
public String useraddsubmit(Model model,QueryVo queryVo)throws Exception{}
自定义参数绑定
在开发中,有的类型SpringMVC是并不支持的,比如Date类型,我们需要自己进行转换,在请求时,仅仅只是一个String,我们需要将其转换为相应格式的日期类型。
需要开发相应的转换类,如下:
public class CustomDateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
try {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return simpleDateFormat.parse(source);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
接下来需要在springmvc.xml中进行转换器的配置:
<!-- 自定义参数绑定 -->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<!-- 转换器 -->
<property name="converters">
<list>
<!-- 日期类型转换 -->
<bean class="com.sw.ssm.controller.converter.CustomDateConverter"/>
</list>
</property>
</bean>
我们还学在适配器以及映射器中进行引用:
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
如上,我们的自定义参数绑定就完成了。其实在实际开发中,我们需要进行自定义参数转换的地方并不多,但是对于日期类型的转换我们还是必须要掌握的。
集合类型参数绑定
在开发中,很多时候我们也会用到集合类型的参数绑定,例如我们需要查询多个记录(传入多个id,通过id查询),或者我们需要在页面提交多条数据,所以这时候就需要我们用到集合类型的参数绑定。
字符串数组
在页面中,通过复选框选择多条数据,将数据id传递到Conyroller进行处理,Jsp页面如下:
<input type="checkbox" name="id" value="1"/>
<input type="checkbox" name="id" value="2"/>
<input type="checkbox" name="id" value="3"/>
页面通过请求将数据传送到后台进行处理,传送到后台以后,其数据格式为1,2,3
在Controller中我们就可以通过字符串数组String[]进行数据的接收,如下:
public String deleteitem(String[] id)throws Exception{
System.out.println(id);
}
List类型
在SpringMVC中,我们可以通过List传送数据,在Jsp页面封装后通过请求传送至Controller,例如将需要提交的多条数据封装为一个List。
首先我们需要将List封装在pojo的List封装在对象中,如下所示:
Public class QueryVo {
Private List<Data> dataList;//数据列表
/*get/set方法*/
}
页面编写如下所示:
<c:forEach items="${dataList }" var="data" varStatus="s">
<tr>
<td><input type="text" name="dataList[${s.index }].name" value="${data.tempo }"/></td>
<td><input type="text" name="dataList[${s.index }].price" value="${data.hum }"/></td>
</tr>
</c:forEach>
如上所示,页面通过List将多条数据提交。
在Controller中,通过包装类即可获取到List:
public String useraddsubmit(Model model,QueryVo queryVo)throws Exception{
System.out.println(queryVo.getDataList());
}
Map类型
在包装类中定义Map对象,并添加get/set方法,action(Controller)使用包装对象接收。
包装类中定义Map对象如下:
Public class QueryVo {
private Map<String, Object> dataInfo = new HashMap<String, Object>();
/*get/set方法..*/
}
页面则编写如下:
<tr>
<td>数据信息:</td>
<td>
Temp:<inputtype="text"name="dataInfo['temp']"/>
Hum:<inputtype="text"name="dataInfo['hum']"/>
</td>
</tr>
如上代码所示,dataInfo即为定义的Map,而temp、hum则为map的key,进而对数据进行提交。