Servlet使用对象接收jsp传递过来的数据的方法

本文介绍了一种在Servlet中使用对象接收和处理从JSP传递过来的数据的方法。通过自定义的requestBean方法,结合Apache Commons BeanUtils库,可以方便地将请求参数映射到对象的属性上。在处理数组数据时,需要注意键值的特殊形式(如"data[0][sellid]"),以确保正确赋值。

  前言:C#中视图请求控制器的方法时传递了一系列数据,控制器中的方法是以键值对的形式来接收这些数据的。你可以直接用键的名字来接收这些数据,当然数据类型一定要对应上。如果传递的数据很多,以键的名字这种方式需要写很多参数来接收那些数据,这时就可以直接用一个包含有那些键的名字的成员字段的对象来进行接收,这样就可以不用写那么多参数来接收数据了。在Java中这样则不行,如果你没有使用特殊的传递数据的方式或接收数据的方式,它会将你传递过来的数据通通转成字符串类型,如果你传递一个object数据对象到servlet后使用getParameter(string arg0)获取数据,打印出来的结果可能就是一个字符串object或者null。网上已经有jar包已经实现了可以用对象接收数据,我这里是自己根据某一个工具方法改编出来,下面介绍一下我的方法。
  下面是传递给Servlet的数组数据,包含两条数据的内容:我这里使用的是post提交:传参直接使用键值对的形式传过去,如:{ data : okData }。okData就是下图的数组。
在这里插入图片描述
  Servlet中使用写好的方法(requestBean)处理数据并直接使用一个集合接收:

List<SellDetail> details = WebDataUtils.requestBean(request,SellDetail.class);

  这个方法的代码很简单,思路主要就是通过键来找值然后把值赋给对象中的某个成员。这里还用到了一个jar包,主要是使用这个jar包的一个方法给对象的某个成员赋值,这个方法需要接受三个参数,第一个参数就是你用来接收数据的对象,第二个参数是这个对象中的某个成员的名称,第三个参数就是要给成员赋的值了。当然你要是不想用jar包也可以自己去写一个反射给它赋值。Jar包的名称:commons-beanutils-1.9.2.jar,
设置值的方法:BeanUtils.setProperty(Object bean, String name,Object value);
  下面数贴出具体的代码:

public static <T> List<T> requestBean(HttpServletRequest request,Class<T> clazz) {
	List<T> beanList = new ArrayList<T>();// 创建对象集合
	try {
		// 使用枚举获取 参数(键)-->key
		// 返回所有参数名的String对象列表,如果没有输入参数,该方法返回一个空值
		Enumeration<String> e = request.getParameterNames();
		Field[] fieldArr = clazz.getDeclaredFields();// 拿到对象的所有成员字段
		T bean = clazz.newInstance();// 创建对象
		int cloumn = 0;// 定义次数,用来标识已赋值了多少次
		while (e.hasMoreElements()) {// 测试此枚举是否包含更多的元素检测
			String key = (String) e.nextElement();// 拿到键
			for (int j = 0; j < fieldArr.length; j++) {// 循环对象的所有成员字段
// 在键的名称中检索成员字段的名称是否存在
				if (key.indexOf(fieldArr[j].getName()) > 0) { 
					String value = request.getParameter(key);// 使用键去获取值
					BeanUtils.setProperty(bean, fieldArr[j].getName(),
							value);// 调用jar包中的方法给对象的成员字段赋值
					cloumn++;// 赋值成功次数自增
					break;// 已找到字段并赋值了就跳出循环,没有必要继续循环了
				}
			}
			if (cloumn == fieldArr.length) {// 判断已赋值的次数是否和成员字段数量相等
				beanList.add(bean);// 数量相等就把对象添加到对象集合中
				bean = clazz.newInstance();// 重新定义空对象
				cloumn = 0;// 重新设置次数
			}
		}
		return beanList;// 最后返回对象集合
	} catch (Exception e) {
		throw new RuntimeException(e);
	}
}

  你们也许会疑惑,上面为什么要在键的名称中检索成员字段的名称是否存在,它的作用是什么,不是应该直接用键去找值然后赋值么?为什么却要用indexOf的方式去检索,而且后来使用jar包给对象设置的第二个参数传的也不是键。不要急,下面我给你们看看这里拿到的键是什么你们就会清楚我为什么要这样写了。
  下面就是打印出来的所有的键,它拿到的键并不是后面中括号内的名称,而是把传递过来的参数名称以及每条数据的索引和数据对应的每个字段拼接起来得出的键。所以需要像上面我那样写才能准确的给每一个字段设置正确的值。
data[0][sellid]
data[0][remark]
data[0][selldetailid]
data[0][sellamount]
data[0][selldiscount]
data[0][sellstates]
data[0][commoditydetailid]
data[1][sellid]
data[1][remark]
data[1][selldetailid]
data[1][sellamount]
data[1][selldiscount]
data[1][sellstates]
data[1][commoditydetailid]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值