SmartGWT学习整理 2、理解核心中的核心DataSource

st97 发布于 2010/11/16 22:51
阅读 2K+
收藏 3

Linux基金会开源软件大学开源技术公开课即将上线,Kubernetes1.19实战讲解!>>>

SmartGWT学习整理 2、理解核心中的核心DataSource


DataSource之所以重要,是因为它负责所有的与服务器的数据交互,几乎所有的控件都离不开它。
可以这样说,理解了DataSource就掌握了SmartGWT的70%

DataSource支持的数据格式有xml、json、webservise等。他可以将数据按照指定的格式解析为可供控件使用的数据(Record对象),每一条数据就想数据库中的一行记录一样。
举个记录列表的例子来说,http://www.smartclient.com/smartgwt/showcase/#grid_databinding_xml_datasource
showcase中的这个例子就是将xml文件作为数据源,格式为
<List>

<country>
    <continent>North America</continent>
    <countryName>United States</countryName>
    <countryCode>US</countryCode>
    <area>9631420</area>
    <population>298444215</population>
    <gdp>12360000</gdp>
    <independence>1776-07-04</independence>
    <government>federal republic</government>
    <government_desc>2</government_desc>
    <capital>Washington, DC</capital>
    <member_g8>true</member_g8>
    <article>http://en.wikipedia.org/wiki/United_states</article>
</country>
...
...
...
</List>

每条country记录包括了continent、countryName等字段,那么对应的DataSource就是

private static class CountryDS extends DataSource {  
        // The DataSource would normally be defined external to any classes that use it.  
 
        private static CountryDS instance = null;  
          
        public static CountryDS getInstance() {  
            if (instance == null) {  
              instance = new CountryDS("countryDS_XML");  
            }  
            return instance;  
        }  
 
        public CountryDS(String id) {  
            setID(id);  
            setDataFormat(DSDataFormat.XML);  
            setRecordXPath("/List/country");  
            DataSourceField countryCodeField = new DataSourceField("countryCode", FieldType.TEXT,  
                                                                   "Code");  
            DataSourceField countryNameField = new DataSourceField("countryName", FieldType.TEXT,  
                                                                   "Country");  
            DataSourceField capitalField = new DataSourceField("capital", FieldType.TEXT,  
                                                               "Capital");  
            setFields(countryCodeField, countryNameField, capitalField);  
            setDataURL("ds/test_data/country.data.xml");  
        }  
 
    }  

showcase里的这个例子是通过继承DataSource来创建实例,一般也可以直接new DataSource()来创建。
这里用到了DataSource中的几个重要方法,
setDataFormat(DSDataFormat.XML);//这个方法声明了要调用的数据源是xml格式的
setRecordXPath("/List/country"); //声明了解析xml的数据路径,这里就是指在<List>标签下的<country>标签就是需要的数据
然后定义了3个字段DataSourceField
setFields方法设定DataSource中所有的字段。
setDataURL("ds/test_data/country.data.xml"); 这个方法指定了数据源的url地址,DataSource将从这个地址获取数据

数据字段DataSourceField的构造函数DataSourceField(String name, FieldType type, String title)
name是数据内部使用的名字,FieldType是指定数据的类型,title是供控件显示给用户的名字

一般不直接使用DataSourceField,而是使用它的子类,都在com.smartgwt.client.data.fields包下,
例如字符型字段就用DataSourceTextField,布尔型用DataSourceBooleanField等等。

接下来定义一个列表控件(ListGrid)用来展示数据

final ListGrid countryGrid = new ListGrid();  
countryGrid.setWidth(400);  
countryGrid.setHeight(224);  
countryGrid.setShowAllRecords(true);  
countryGrid.setDataSource(CountryDS.getInstance());//将定义好的DataSource传递给列表控件
countryGrid.setAutoFetchData(true); //设定控件在显示的时候自动通过DataSource获取数据,如果设为false的话,那么需要手动通过countryGrid.fetch();方法来获取数据
countryGrid.draw();

这样一个显示国家数据的列表页面就完成了。

接下来再看一个json数据格式的例子
http://www.smartclient.com/smartgwt/showcase/#grid_databinding_json_datasource
里边的差别就是建立DataSource的时候通过setDataFormat(DSDataFormat.JSON);  
将数据源的格式指定为json格式,没有指定setRecordXPath是因为这个json数据里根节点的数据就是需要的数据。

可以看到用SmartGWT可以很方便的来展示数据,在MVC框架中可以用SmartGWT来画前台界面,后台只需要生成指定格式(xml或json,个人比较偏向使用json)的数据就可以了。

建了个smartGWT的qq群,有兴趣的可以进来一起学习讨论

117824970

加载中
0
s
sg_lt
您好,如果用json格式,是否需要在后台生成json文件,然后用 setDataURL指定json文件的地址?还是有其它方法呢  
0
l
liuchunli

怎么实现Service dao方式返回 List<Emp>,然后设置到DataSource中呢,前提是不想使用servlet生成服务端xml,然后再使用DataSoutce.setDataUrl(emp.xml)这种方式,不使用这种,怎么能直接调用呢?另外关于DSRequest和DSResponse的含义还是不太懂!

返回顶部
顶部