前台将数据存入集合并封装为JSON格式,后台用list遍历输入

在开发项目时,在前台的数据获取时遇到了一个不大不小的问题。根据公司的业务需求,是要实现一个类似上级选中和下级选中要一一对应的一种效果。

   

就是如上的一种效果。起初打算用Map的键值对的操作实现,但发现这种方案在前台取值好获取,但后台用mybatis时foreach方法不好录入,比较麻烦后来请教了一些朋友之后,决定在前台取值用,将数据保存到数组中,然后封装为JSON类型,后台直接用List进行处理就可以了。很方便。

现将前后台代码摘录如下:

前台jsp代码:

<script>
$(function(){
	
	//表单提交
	$("#commit").click(function(){
		var slist = new Array();//这是在前台创建一个数组类型
		$("span[name='space']").each(function(){
			/* alert("空间名称为\t"+$(this).text()); *///获取所有的空间编号
			var space_fit = {};//这里为创建实体类,必须是java对应存在的实体类,且有相应的属性。将这个实体类封装到数组中,然后转换为JSON格式的数据
			space_fit.cus_code=$("#cus_code").val();
			space_fit.addr_code=$("#addr_code").val();
			space_fit.space_name= $(this).text();
			
			var product = "";
			$("input[name='product,"+$(this).attr("id")+"']:checked").each(function(){
				/* alert("选中的部件信息为\t"+$(this).val()); */ //在空间的循环下获取部件[上一个this为空间,下一个this为部件,二者范围不同,不干扰]
				product += $(this).val()+",";
			})
			
			product = product.substring(0, product.length-1);
			
			space_fit.advice = product;
			slist.push(space_fit);
		})
		var fitList = JSON.stringify(slist); //此处为调用前台方法,将数组转换为JSON格式,方便传值和后台接收
		/* alert(fitList); 
		
		return; */
		$.ajax({
			url:"MakeAdvisory_fit.action",
			type:"post",
			dataType:"json",
			data:{
				"fitList":fitList
			},
			success:function(data){
				if(data){
					alert("配置建议信息录入成功!");
					location.href="<%=request.getContextPath()%20%>/customer/toCustomer_addrZX.action?cus_code="+$("#cus_code").val()+"&cus_name="+encodeURI(encodeURI($("#cus_name").text()));
				}else{
					alert("填入信息有误,请重新核实");
					location.reload();
				}
			}
		})
	})
	
	//清空表单
	$("#clear").click(function(){
		$('#fit').form('clear');
	})
	
	//返回
	$("#back").click(function(){
		location.href="<%=request.getContextPath()%20%>/work/toWork.action?cus_code="+$("#cus_code").val();
	})
	
})
		
</script>
</head>
<body>
	<div class="easyui-panel" title="适老化改造部品配置建议表测试表" style="width:100%;" >
			<form id="fit" method="post">
				<div style="margin-bottom:20px">
					<div>客户姓名:<input type="hidden" value="${bs.cus_code }" id="cus_code" name="cus_code">
					<span id="cus_name">${cus_name}</span>
					</div>
				</div>
				<div style="margin-bottom:20px">
					<div>客户地址:<input type="hidden" value="${bs.addr_code }" id="addr_code" name="addr_code">
					<span id="address">${bs.address }</span>					
					</div>
				</div>
				<div style="margin-bottom:20px">
					<div>配置建议</div>
					<c:forEach var="space" items="${sList }">
						<div style="margin-left: 50px"><span id="${space.space_id }" name="space">${space.space_name }</span></div>
						<div style="margin-left: 100px">
							<c:forEach var="p" items="${pList }">
								${p.product_name }<input type="checkbox" value="${p.product_name }" name="product,${space.space_id}">
							</c:forEach>
						</div>
					</c:forEach>
				</div>
				<div style="margin-bottom:20px">
					<input type="button" value="保存" id="commit">
					<input type="button" value="返回" id="back">
					<input type="button" value="清空" id="clear">
				</div>
			</form>
	</div>
</body>
</html>


java后台接收代码:

@RequestMapping("MakeAdvisory_fit")
@ResponseBody
public boolean MakeAdvisory_fit(String fitList){//后台直接用字符串类型接收即可
	ObjectMapper objectMapper = new ObjectMapper();

	JavaType javaType = objectMapper.getTypeFactory().constructParametricType(List.class, Space_fit.class);
	List<Space_fit> list = null;
	try {
		list = objectMapper.readValue(fitList, javaType);//将传来的JSON数据转换为需要的集合数据
		int i = makeAdvisoryService.addFit(list);//传入后台时,只需要传入list集合即可
		if(i>0){
			return true;
		}else{
			return false;
		}
	} catch (IOException e) {
		
		e.printStackTrace();
		return false;
	}
}
java存储值的实体类:

public class Space_fit {

	private String cus_code;
	private String addr_code;
	
	private String space_name;
	private String advice;
	
	private String cus_name;
	private String address;
	
	
	//省略set/get方法
	
}

mybatis将数据录入数据库中:

<insert id="addFit" parameterType="java.util.List">
	insert into space_advice (cus_code,addr_code,space_name,advice) values
	<foreach collection="list" item="fit" separator="," index="index">
	 (	#{fit.cus_code},
		#{fit.addr_code},
		#{fit.space_name},
		#{fit.advice} )
	</foreach>
</insert>

在前台将数据封装进数组,后台用list处理。这种方法在我的那个项目中应用了很多次,也算是开阔的我的一种思路吧。今天将代码与解决方案分享处理,希望可以帮助到有类似困扰的朋友们,可以给一个解决思路。如果哪位朋友对类似问题有更好的解决办法,也请在博客下方留言,大家可以一起交流进步。






版权声明:本文为linux__xu原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。