SpringMVC-参数绑定

在之前我们通过实例简单讲解过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,进而对数据进行提交。









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章