最近在项目中使用到了zTree插件,需要在选中某些节点之后传送给后台处理。
起初的处理是,将选中的节点的值使用间隔符进行字符串拼接,拼接后post到后台,然后再使用间隔符进行拆分,然后在循环处理等等。
这样的字符串在后台处理起来非常麻烦:
1、字符串拆分就存在隐患(因为传送到后台的数据可能存在特殊字符啥的)
2、循环来循环去,搞了半天写的逻辑可能最后自己看起来都一塌糊涂的
所以决定重写整个数据采集和传送以及后台处理的过程。
1、在前端根据zTree的API重新获取需要的数据:
根据业务需求,我其实是字需要叶子节点的数据的,代码如下:
var zTree = $.fn.zTree.getZTreeObj("treeTrs"); var checkNodes = zTree.getCheckedNodes(true); var uncheckNodes = zTree.getCheckedNodes(false); //搜集选中的标准问法信息 var checkInfo = []; for(var i=0; i<checkNodes.length; i++){ var node = checkNodes[i]; //直接找叶子节点 if(!node.children){ checkInfo.push(node.name); } } //搜集未选中的标准问法信息 var unCheckInfo = []; for(var i=0; i<uncheckNodes.length; i++){ var node = uncheckNodes[i]; //直接找叶子节点 if(!node.children){ unCheckInfo.push(node.name); } }
2、再构造一个Object对象,主要是为了构造json字符串用的
//封装数据 var reqObj = new Object(); reqObj.currPro = currPro; reqObj.provinceBizId = provinceBizId; reqObj.provinceBizName = provinceBizName; reqObj.checkInfo = checkInfo; reqObj.unCheckInfo = unCheckInfo;
3、ajax请求
这里使用JSON.stringify函数将Object对象转换成json字符串 传递后java后台中
// 发送请求 $.ajax({ type : "post", url : "saveProRecOp", contentType: 'application/json; charset=utf-8', data : JSON.stringify(reqObj), success : function(data) { if (data.success) { alert("操作成功!"); } else { alert("操作失败"); } }, error : function(result) { alert(result); } });
4、java后台接收json数据
@RequestMapping(value = "/saveProRecOp", method = RequestMethod.POST)
public @ResponseBody
Map<String, Object> saveProRecOp(
@RequestBody ProvinceTRSEditCommand trsEditCommand,
HttpServletRequest request)
只需要看下方法声明就行了,注意其中有个 @RequestBody ProvinceTRSEditCommand trsEditCommand
项目中在xml中配置了一个MessageConverter,它会根据http请求中的contentType属性来判断,如果请求数据格式为json,则会使用jsonConverter来解析post数据。
至于为什么会解析成ProvinceTRSEditCommand类的对象,是因为该类的属性名称和js中构造的对象var reqObj = new Object(); 的属性是一模一样的,所以jsonConverter能够使用反射的方式来反序列化为一个类对象。
经过机上几个步骤之后,后台就只需要调用ProvinceTRSEditCommand对象的属性就行了,而不需要一直在间隔符中纠结了。
欢迎大家给出宝贵意见哇~~~