smartGWT DataSource数据动态加载
昨天和今天早上,用DataSource从数据库后台动态加载数据,我的业务是这样的:
我有两个SelectItem选择框,第一个选择框里面的数据是单位,第二个选择框中的数据是对应单位的人,因为人可能有重名,所以还需要加载对应的人的其他信息(如身份证等等),来个图:

(选择好之后的样子)
第一个选择框中的单位变了,第二的选择框中只加载对应单位的人的数据,但是关键问题出来了,我加载的数据每一次都不会改变,不管第一个选择框的选择的是什么,第二个选择框只能加载一次数据,就是初始化那一次,我尝试了将对应的DataSource重新初始化,甚至写一个匿名的DataSource,问题都没有解决,最后在各种查文档、各种实践之后,我才发现,原来问题在于DataSource内的一个方法:setID(String id),只要id不变,不管你怎么折腾,数据还是那些数据,所以我果断将DataSource的id换了,奇迹就出现了,数据重新加载了,下面附上关键代码:
DataSource类:
public class TobaLeafGridFarmerInfoXmlDs extends DataSource {
private String townId=null;
private String villageId=null;
private static TobaLeafGridFarmerInfoXmlDs instance=null;
public static TobaLeafGridFarmerInfoXmlDs getInstance(String townId,String villageId){
if(instance==null){
instance=new TobaLeafGridFarmerInfoXmlDs("TobaLeafGridFarmerData",townId,villageId);
}
return instance;
}
public TobaLeafGridFarmerInfoXmlDs(String id,String townId,String villageId){
setTownId(townId);
setVillageId(villageId);
setID(id);//此处的id很重要的,相同的id返回的数据是一样的
setTitleField("farmerName");
setRecordXPath("/List/TobaLeafGridFarmerData");
DataSourceTextField townNameField = new DataSourceTextField("townName","乡镇",70,true);
DataSourceTextField villageIdField = new DataSourceTextField("villageId","村委会Id",30,true);
villageIdField.setHidden(true);
DataSourceTextField villageField = new DataSourceTextField("village","村委会",100,true);
DataSourceTextField farmerNameField = new DataSourceTextField("farmerName","烟农",50,true);
DataSourceTextField computerCodeField = new DataSourceTextField("computerCode","合同号",80,true);
DataSourceTextField IdCardField = new DataSourceTextField("idCard","身份证",80,true);
setFields(townNameField,villageIdField,villageField,farmerNameField,computerCodeField,IdCardField);
setDataFormat(DSDataFormat.XML);
//下面这个URL是一个Servlet的URL,数据来源是从数据库中取数的
setDataURL(HOST + "analyse/farmerDataServlet"+"?townId="+townId+"&villageId="+(villageId==null?"":villageId));
setClientOnly(true);
setCacheAllData(false);
}
public String getTownId() {
return townId;
}
public void setTownId(String townId) {
this.townId = townId;
}
public String getVillageId() {
return villageId;
}
public void setVillageId(String villageId) {
this.villageId = villageId;
}
}
选择框部分代码(selectVillage为第一个选择框,selectFarmer为第二个选择框,都是SelectItem实例):
DataSource farmerXmlDS=new TobaLeafGridFarmerInfoXmlDs(townId,townId,"");
final ListGrid pickListProperties = new ListGrid();
pickListProperties.setShowFilterEditor(true);
ListGridField townName = new ListGridField("townName",70);
ListGridField villageId = new ListGridField("villageId",30);
villageId.setHidden(true);
ListGridField village = new ListGridField("village",120);
ListGridField farmerName = new ListGridField("farmerName",50);
ListGridField computerCode = new ListGridField("computerCode",90);
ListGridField idCard = new ListGridField("idCard",120);
selectFarmer.setPickListFields(townName,villageId,village,farmerName,computerCode,idCard);
selectFarmer.setOptionDataSource(farmerXmlDS);
selectFarmer.setDisplayField("farmerName");
selectFarmer.setValueField("computerCode");
selectFarmer.setPickListWidth(460);
selectFarmer.setPickListProperties(pickListProperties);
selectVillage.addChangeHandler(new ChangeHandler() {
public void onChange(ChangeEvent event) {
String selectedVillageId = (String) event.getValue();
DataSource farmerXmlDS=new TobaLeafGridFarmerInfoXmlDs(
selectedVillageId==null?townId:selectedVillageId,townId,selectedVillageId);
selectFarmer.setOptionDataSource(farmerXmlDS);
selectFarmer.redraw();
}
});
servlet关键代码:
@Override
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String xmlstring = "";
User user = WebRalasafe.getCurrentUser(request);
String townId=request.getParameter("townId");
String villageId=request.getParameter("villageId");
try {
xmlstring = getFarmerInfoXml(townId,villageId);
} catch (Exception e) {
e.printStackTrace();
}
response.setContentType("text/xml;charset=utf-8");
response.getWriter().write(xmlstring.toString());
}
public String getFarmerInfoXml(String townId,String villageId) throws Exception{
String farmerInfoXml="";
String sql="select …"; //sql略
List<String[]> result = xxx.QuerySql(sql); //自己写的执行sql的方法
/*TobaLeafGridFarmerData是一个模型类(继承com.google.gwt.user.client.rpc.IsSerializable接口,可序列化),有一堆属性和对应getter和setter方法,没有其他多余的内容*/
List<TobaLeafGridFarmerData> datas=new ArrayList<TobaLeafGridFarmerData>();
for(int i=0;i<result.size();i++){
String tmp[]=result.get(i);
TobaLeafGridFarmerData data=new TobaLeafGridFarmerData();
data.setTownName(tmp[0]);
data.setVillageId(tmp[1]);
data.setVillage(tmp[2]);
data.setFarmerName(tmp[3]);
data.setComputerCode(tmp[4]);
data.setIdCard(tmp[5]);
datas.add(data);
}
String rootElement = "List";
boolean isOutputToFile = false;
String outFilePath = "";
farmerInfoXml = Xmloutput.object2Xml(rootElement, datas, isOutputToFile,
outFilePath);
return farmerInfoXml;
}
/*大概思路:首先DataSource(通过servlet)加载数据,同时要定义对应元数据(上面的是TobaLeafGridFarmerData),然后SelectItem再调用这个DataSource,就这样*/
smartGWT DataSource数据动态加载的更多相关文章
- Echarts使用及动态加载图表数据 折线图X轴数据动态加载
Echarts简介 echarts,缩写来自Enterprise Charts,商业级数据图表,一个纯JavaScript的图表库,来自百度...我想应该够简洁了 使用Echarts 目前,就官网的文 ...
- 将数据动态加载到Echarts饼图中
需求描述 Echarts中的官方示例是将数据的设定写好在页面的配置项中的,但在实际的开发展示中,我们需要按照需求通过调用后台的接口获取数据,再将数据加载到特定的Echarts饼图中. 实现效果 实现步 ...
- [安卓] 9、线程、VIEW、消息实现从TCP服务器获取数据动态加载显示
一.前言: 一般情况下从TCP服务器读取数据是放在一个线程里读的,但是刷新界面又不得不放在线程外面,所以需要用消息传递把线程里从TCP里获得的数据传送出来,然后根据数据对页面进行相应的刷新. 二.业务 ...
- Echarts动态加载后台数据
注意:1.用Ajax请求获取后台数据 2.Echarts只能处理Json数据 后台Controller:根据业务需求不同而返回不同数据,我前台要循环遍历Echarts的series进行数据添加,所以后 ...
- 动态加载DataGrid表头及数据
初始化表头 js生成前端 /*初始化表头*/ function initDataGridTitle(id) { $.ajax({ url: '/${appName}/report/***/***', ...
- AJAX 动态加载后台数据 绑定select
<select id="select"> <!--下拉框数据动态加载--> </select> js:(使用jquery) $(document ...
- OpenLayers学习笔记(十)— 动态加载JSON数据模拟航迹线
在openlayers 3 上,加载本地json数据,动态绘制航迹线,以飞机当前位置为地图中心,此例子是模拟DEMO 本文链接:动态加载JSON数据模拟航迹线 作者:狐狸家的鱼 GitHub:八至 前 ...
- 在aspx页动态加载ascx页面内容,给GridView控件绑定数据
在aspx页动态加载ascx页面内容 //加载ascx页面内容Control c1 = this.Page.LoadControl("WebUserControl1.ascx"); ...
- geotrellis使用(二十三)动态加载时间序列数据
目录 前言 实现方法 总结 一.前言 今天要介绍的绝对是华丽的干货.比如我们从互联网上下载到了一系列(每天或者月平均等)的MODIS数据,我们怎么能够对比同一区域不同时间的数据情况,采用 ...
随机推荐
- webForm系列 前端框架快速引用
Html的确定就是不能重用,MVC可以在_Layout.cshtml中将每个页面都需要的js和css文件(如jq,bootstrap等)都引用进去,webform就麻烦一点. webForm需要给所以 ...
- 爬虫:把廖雪峰的教程转换成 PDF 电子书
写爬虫似乎没有比用 Python 更合适了,Python 社区提供的爬虫工具多得让你眼花缭乱,各种拿来就可以直接用的 library 分分钟就可以写出一个爬虫出来,今天就琢磨着写一个爬虫,将廖雪峰的 ...
- JAVA集合一之集合简介(Collection,List,Set)
在编写JAVA程序中,我们经常会遇到需要保存一组数据对象,此时,我们可以采用对象数组来进行多个对象的保存,但对象数组存在一个最大的问题即在于长度上的限制,如果说我们现在要保存一组对象,但是我们并知道数 ...
- p1221网络布线(最小生成树 Prim(普里母)算法) p1222 Watering Hole
描述 Description 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当然,他需要你的帮助.约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路 ...
- mfc---单文档工程添加消息响应
写消息映射:.h中些函数头文件afx_mag … .cpp中写函数体 .cpp中写消息映射 给toolbar添加消息: .h中添加头文件afx_msg …. .cpp中添加函数体,消息映射ON_COM ...
- KoaHub.js:使用ES6/7特性开发Node.js框架
KoaHub.js -- 基于 Koa.js 平台的 Node.js web 快速开发框架.可以直接在项目里使用 ES6/7(Generator Function, Class, Async & ...
- 当前最上层的视图控制器vc 和 当前最上层的导航控制器nav
在处理 URL Router 跳转的时候,我们经常需要得到 当前最上层的视图控制器 和 当前最上层的导航控制器 来进行视图跳转或者方法调用.- (UIViewController *)currentV ...
- 使用IDEA的gradle整合spring+ mybatis 采用javaconfig配置
1.新建一个工程 2.工程目录 3.添加gradle.propertes文件 activeMQVersion=5.7.0 aspectJVersion=1.7.2 commonsLangVersion ...
- ST HW1 An Error
曾经使用ThinkPHP完成一个网上电子银行的项目,凡是涉及到金钱的,需要注意的问题很多,比如使用float类型,比如金钱的数额不能为负数等等.最初没有考虑到剩余金额不能为负数或者消费的金额不能为负, ...
- ubuntu桌面不显示菜单
为什么?我也不知道,只记得之前在搜狐看了行尸走肉,然后第二次开机就看不到菜单了. 参照百度结果然后去尝试了一下,记过ok了,我的ubuntu是13.10. 图说: 看到这里就应该大概怎么做了. 1 ...