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数据,我们怎么能够对比同一区域不同时间的数据情况,采用 ...
随机推荐
- JS冒号的作用
JS中冒号的作用1.声明对象的成员2.switch语句分支3.三元表达式 1.声明对象的成员 var Book = { Name: '法', Price: 100, Discount : functi ...
- Python dir()/help()
dir() dir()用来查询一个类或者对象所有属性.你可以尝试一下 print dir(list) 返回的结果: ['__add__', '__class__', '__contains__', ' ...
- 如何用Visual Studio 2008 写汇编程序?
如何用Visual Studio 2008写汇编程序? 最近在上夏季小学期,在学汇编语言,关于用什么编辑环境一直很纠结.很想找到一个比较好的IDE,但是试了几个像RadASM之类的,发现还不是很满意. ...
- 剑指offer编程题Java实现——替换空格
题目描述 请实现一个函数,将一个字符串中的空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. package ...
- Spring+SpringMVC+MyBatis+easyUI整合基础篇(二)牛刀小试
承接上文,该篇即为项目整合的介绍了. 废话不多说,先把源码和项目地址放上来,重点要写在前面. github地址为ssm-demo 你也可以先体验一下实际效果,点击这里就行啦 账号:admin 密码:1 ...
- 数据库读写分离Amoeba
1.理解读写分离的原理 Amoeba(变形虫)项目,该开源框架于2008发布一款Amoeba for mysql软件,该软件致力于mysql的分布式数据库前端代理层,主要的作用是应用服务访问mysql ...
- 每天一个Linux命令(19)--find命令
linux 下 find 命令在目录结构中搜索文件,并执行指定的操作.Linux 下 find 命令提供了相当多的查找条件,功能很强大.由于 find 具有强大的功能,所以它的选项也很多,其中大部分选 ...
- 第20篇 js高级知识---深入原型链
前面把js作用域和词法分析都说了下,今天把原型链说下,写这个文章费了点时间,因为这个东西有点抽象,想用语言表达出来不是很容易,我想写的文章不是简单的是官方的API的copy,而是对自己的知识探索和总结 ...
- 第十二篇 C# 将HTML 直接转成Excel
前些天写项目的时候,客户要求用HTML表格把信息展示出来,后面还要用展示的内容要导出Excel.本来想想在后台操作的话估计是要做死了,但是经过细想,Excel能够发布成HTML,一定也可以由HTML转 ...
- Java日常总结之LinkedList、ArrayList的效率分析
前言: 在我们平常开发中难免会用到List集合来存储数据,一般都会选择ArrayList和LinkedList,以前只是大致知道ArrayList查询效率高LinkedList插入删除效率高,今天来实 ...