springmvc(7) springmvc参数绑定

17 篇文章 0 订阅

目录

spring参数绑定过程

默认支持参数绑定的类型

简单类型的参数绑定

简单pojo绑定

自定义参数绑定(重点)

配置方式1(推荐)

配置方式2

包装类型的参数绑定

集合类型绑定

1.数组绑定

list绑定

map绑定



spring参数绑定过程

从客户端请求key/value数据,经过参数绑定,将key/value数据绑定到controller方法的形参上。

springmvc中,接收页面提交的数据是通过方法形参来接收。而不是在controller类定义成员变更接收!!!!

默认支持参数绑定的类型


直接在controller方法形参上定义下边类型的对象,就可以使用这些对象。在参数绑定过程中,如果遇到下边类型直接进行绑定。
1、HttpServletRequest
通过request对象获取请求信息
2、HttpServletResponse
通过response处理响应信息
3、HttpSession
通过session对象得到session中存放的对象
4、Model/ModelMap
model是一个接口,modelMap是一个接口实现 。
作用:将model数据填充到request域。

简单类型的参数绑定

通过@RequestParam对简单类型的参数进行绑定。

如果不使用@RequestParam,要求request传入参数名称和controller方法的形参名称一致,方可绑定成功。

如果使用@RequestParam,不用限制request传入参数名称和controller方法的形参名称一致。

通过required属性指定参数是否必须要传入,如果设置为true,没有传入参数,报下边错误:

 

 

 

参考教案 对其它简单类型绑定进行测试。

 

简单pojo绑定

页面中input的name和controller的pojo形参中的属性名称一致,将页面中数据绑定到pojo。

可以是简单的pojo也可以是包装的pojo

页面定义:

 

controller的pojo形参的定义:

Controller方法定义如下:

自定义参数绑定(重点)

需求

根据业务需求自定义日期格式进行参数绑定。

配置方式在springmvc.xml

<mvc:annotation-driven conversion-service="conversionService">

</mvc:annotation-driven>

<!-- conversionService -->

    <bean id="conversionService"

        class="org.springframework.format.support.FormattingConversionServiceFactoryBean">

       <!-- 转换器 -->

       <property name="converters">

           <list>

              <bean class="cn.itcast.ssm.controller.converter.CustomDateConverter"/>

           </list>

       </property>

    </bean>

自定义converter

需要实现convert接口 (org.springframework.core.convert.converter.Converter)

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;
	}

}

两种配置方式

配置方式1(推荐)

<mvc:annotation-driven conversion-service="conversionService">
</mvc:annotation-driven>
<!-- conversionService -->
	<bean id="conversionService"
		class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
		<!-- 转换器 -->
		<property name="converters">
			<list>
				<bean class="cn.itcast.ssm.controller.converter.CustomDateConverter"/>
			</list>
		</property>
	</bean>

配置方式2

<!--注解适配器 -->
	<bean
		class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
		 <property name="webBindingInitializer" ref="customBinder"></property> 
	</bean>
	
	<!-- 自定义webBinder -->
	<bean id="customBinder"
		class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
		<property name="conversionService" ref="conversionService" />
	</bean>
	<!-- conversionService -->
	<bean id="conversionService"
		class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
		<!-- 转换器 -->
		<property name="converters">
			<list>
				<bean class="cn.itcast.ssm.controller.converter.CustomDateConverter"/>
			</list>
		</property>
	</bean>

包装类型的参数绑定

一般在综合查询中使用(表查询中),在包装pojo中添加简单pojo,一般不使用继承,继承的类不方便以后扩展,直接在包类型的pojo中添加

需求

商品查询controller方法中实现商品查询条件传入。

实现方法

第一种方法:在形参中 添加HttpServletRequest request参数,通过request接收查询条件参数。

第二种方法:在形参中让包装类型的pojo接收查询条件参数。

         分析:

         页面传参数的特点:复杂,多样性。条件包括 :用户账号、商品编号、订单信息。。。

         如果将用户账号、商品编号、订单信息等放在简单pojo(属性是简单类型)中,pojo类属性比较多,比较乱。

         建议使用包装类型的pojo,pojo中属性是pojo。

页面参数和controller方法形参定义

表单中的定义

         商品名称:<input name="itemsCustom.name" />

         注意:itemsCustom和包装pojo中的属性一致即可。

controller方法形参:传入了包装类型的pojo

         public ModelAndView queryItems(HttpServletRequest request,ItemsQueryVo itemsQueryVo) throws Exception

包装类型的pojo

注意表单中的name属性要与包装类型中的pojo的变量名一致  采用 变量名..(可以由多层).属性

采用断点观察 

可以观察到表单中的数据已经传入了pojo类中 

集合类型绑定

1.数组绑定

需求

商品批量删除,用户在页面选择多个商品,批量删除。

表现层实现 

关键:将页面选择(多选)的商品id,传到controller方法的形参,方法形参使用数组接收页面请求的多个商品id

controller方法定义:

页面定义:

list绑定

需求

通常在需要批量提交数据时,将提交的数据绑定到list<pojo>中,比如:成绩录入(录入多门课成绩,批量提交),

本例子需求:批量商品修改,在页面输入多个商品信息,将多个商品信息提交到controller方法中。

表现层实现

controller方法定义:

         1、进入批量商品修改页面(页面样式参考商品列表实现)

         2、批量修改商品提交

         使用List接收页面提交的批量数据,通过包装pojo接收,在包装pojo中定义list<pojo>属性并添加get,set方法 

        

 

 

页面定义:

 

表单

<c:forEach items="${itemsList }" var="item" varStatus="status" >添加varstatus属性 

<form name="itemsForm" action="${pageContext.request.contextPath }/items/editItemsAll.action" method="post">
<table width="100%" border=1>
<tr>
<td><input type="submit" value="批量修改"/></td>
</tr>
</table>
商品列表:
<table width="100%" border=1>
<tr>
	<td>商品名称</td>
	<td>商品价格</td>
	<td>生产日期</td>
	<td>商品描述</td>
	<td>操作</td>
</tr>
<c:forEach items="${itemsList }" var="item" varStatus="status" >
<tr>
	<td><input name="itemsList[${status.index}].name" type="text" value="${item.name }"/></td>
	<td><input name="itemsList[${status.index}].price" type="text" value="${item.price }"/></td>
	<td><input name="itemsList[${status.index}].createtime" type="text" value="<fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/>"/></td>
	<td><input name="itemsList[${status.index}].detail" type="text" value="${item.detail }"/></td>
</tr>
</c:forEach>

</table>

通过断点观察 

数据已经绑定到pojo类中的itemsList列表中。

 

map绑定

也通过在包装pojo中定义map类型属性。

在包装类中定义Map对象,并添加get/set方法,action使用包装对象接收。

包装类中定义Map对象如下:

Public class QueryVo {

private Map<String, Object> itemInfo = new HashMap<String, Object>();

  //get/set方法..

}

页面定义如下:

 

<tr>

<td>学生信息:</td>

<td>

姓名:<inputtype="text"name="itemInfo['name']"/>

年龄:<inputtype="text"name="itemInfo['price']"/>

.. .. ..

</td>

</tr>

Contrller方法定义如下:

 

public String useraddsubmit(Model model,QueryVo queryVo)throws Exception{

System.out.println(queryVo.getStudentinfo());

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值