在项目中遇到逻辑上有几个关联关系的对象需要一次展现给客户端,一种实现方法是前台获取数据后将数据分别保存到不同的表中,这种方式的弊端就是取得时候需要关联很多数据,展现的逻辑比较复杂。另一种方式就是下面的方式,转换成对象保存元数据,展现的时候只需要取一个字段的值就可以了。
json 数据 :
{"success": true, "results":[{"code":"HOMEPAGE","models":[
{"id":"COMPONENT_1","name":"cmp.txtTabNameTodo","sn":1,"xtype":"portaltodolistbrief","zoneId":"homepage_z1"},
{"id":"COMPONENT_2","name":"cmp.txtTabNameAgent","sn":2,"xtype":"agenttodolistbrief","zoneId":"homepage_z1"},
{"id":"COMPONENT_3","name":"cmp.txtTabNameTrace","sn":3,"xtype":"tracelistbrief","zoneId":"homepage_z2"},
{"id":"COMPONENT_5","name":"cmp.txtTabNameMostUsed","sn":5,"xtype":"docfolderlistpanel","zoneId":"homepage_z2"}],
"name":"2区域模板","tabWidth":"200","title":"main.txtTabHomepage","zoneNum":2}]}
前台数据提交定义(采用Extjs MVC框架):
saveZone :function(button){
var win=Ext.ComponentQuery.query('customconfigwindow')[0];
var template=win.down('field[name=template]').getValue();
var models=[];
var tabPanel=Ext.ComponentQuery.query('portalcomponentabs')[0];
for(var i=0;i<template;i++){
var tab=tabPanel.setActiveTab(i);
tab.down('portalzonelist').store.each(function(record){
record.set('zoneId',tab.id);
models.push(record.data);
});
}
var url='model/Model_saveModel.action?template='+template;
Ext.Ajax.request( {
url : url,
waitMsg : message.wait,
method : 'post',
params : {models : "{\"viewModel\":"+Ext.encode(models)+"}"},封装成json对象
success : function(response, action) {
var responseJson = Ext.JSON.decode(response.responseText);
success = responseJson.success;
if (!success)
showException(responseJson.failedMessage);
else{
Ez.msg('数据保存成功!');
Ext.suspendLayouts();
Ext.resumeLayouts(true);
}
},
failure : function(form, action) {
showAjaxError(action);
}
});
}
后台创建封装对象的实体类,json数据映射为对象保存:
1、action 层代码
public void saveModel(){
String modelJosn= Struts2Utils.getParameter("models");
String template = Struts2Utils.getParameter("template");
ObjectMapper objectMapper =new ObjectMapper(); //这里使用ObjectMapper来实现json与
try {
ViewModelList models=objectMapper.readValue(modelJosn, ViewModelList.class);
portalService.saveModel(models,Integer.parseInt(template));
CommonRender.renderSucessJsonMsg();
} catch (JsonParseException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
2、service层代码
public void saveModel(ViewModelList models,int zoneNum){
Timestamp now = new Timestamp(System.currentTimeMillis());
PortalPageTemplate template = portalTemplateDao.getTemplate(zoneNum);
ViewPage page = new ViewPage();
page.setCode(template.getCode());
page.setName(template.getName());
page.setTabWidth(template.getTabWidth());
page.setTitle(template.getTitle());
page.setModels(models.getViewModel());
page.setZoneNum(zoneNum);
JSONObject jsonObject=JSONObject.fromObject(page); //将对象转换为json
PortalPage portalPage = new PortalPage();
portalPage.setId(null);
portalPage.setMetaData(jsonObject.toString());
portalPage.setPortalPageTemplate(template);
portalPage.setDeleteFlag(false);
portalPageDao.save(portalPage);
}