您的位置:首页 > 编程语言 > Java开发

SpringMVC-参数绑定

2017-05-23 23:28 211 查看
在之前我们通过实例简单讲解过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,进而对数据进行提交。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring mvc 参数绑定