1. 功能介绍

    数据总线主要是约定数据结构,统一程序中的数据接口,提供各类数据的转换获取,多列数据采用IDataset,单列数据采用IData。

  2. IDataset(多列数据结构,实现了List接口的所有方法,并扩展以下方法)

    1. public Object get(int index);获取一行数据
    2. public Object get(int index, String name);获取一行数据(IData)中指定列名的数据值
    3. public Object get(int index, String name, Object defaultValue);获取一行数据(IData)中指定列名的数据值,如果值为空,取defaultValue默认值
    4. public IData getData(int index);获取一行IData结构的数据
    5. public String[] getNames();获取列名数组
    6. public int count();获取列表总数,如果分页中获取的为分页总记录,否则同size方法
    7. public IData toData();将IDataset转成IData,data的每个名字放置一个List,这种方式适用于传递多行数据给后台调用,如前台拼传获取IDataset,然后转成IData后callTuxedoSvc
    8. public IDataset filter(String filter);根据条件过滤并获取符合条件的数据集,如filter为"KEY1=VALUE1"或"KEY1=VALUE1,KEY2=VALUE2"的数据,多个提交用,号分隔
    9. public IDataset distinct(String fieldName);根据指定列获取排重(不重复)的数据集,比如传入fieldName为"USER_ID"时,将过滤后只获取数据集中USER_ID值不重复的数据
    10. 常用实现类,DatasetList(适用于自定义构造IDataset对象)、DataFmpMap、DatasetResult。
    11. DatasetList构造方式,new DatasetList():(构造一个空DatasetList)、new DatasetList(List list):构造一个List对象为DatasetList、new DatasetList(String str):根据一串文本构造DatasetList,文本格式和DatasetList.toString()生成的文本格式一样。
  3. IData(单列数据结构,实现了Map接口的所有方法,并扩展以下方法)

    1. public Object get(String name);获取指定列名的数据值
    2. public Object get(String name, Object defaultValue);获取指定列名的数据值,如果值为空,取defaultValue默认值
    3. public String[] getNames();获取列名数组
    4. public String getString(String name);获取指定列名的字符型数据值,如果值为空,返回空对象,不会自动转为空串
    5. public String getString(String name, String defaultValue);获取指定列名的字符型数据值,如果值为空,取defaultValue默认值
    6. public int getInt(String name);获取指定列名的整型数据值,如果值为空或为空串,取0
    7. public int getInt(String name, int defaultValue);获取指定列名的整型数据值,如果值为空或为空串,取defaultValue默认值
    8. public double getDouble(String name);获取指定列名的浮点型数据值,如果值为空或为空串,取0
    9. public double getDouble(String name, double defaultValue);获取指定列名的浮点数据值,如果值为空或为空串,取defaultValue默认值
    10. public boolean getBoolean(String name);获取指定列名的布尔型数据值,如果值为空或为空串,取false
    11. public boolean getBoolean(String name, boolean defaultValue);获取指定列名的布尔数据值,如果值为空或为空串,取defaultValue默认值
    12. public IData getData(String name);获取指定列名的IData数据值
    13. public IDataset getDataset(String name);获取指定列名的IDataset数据值
    14. public IDataset toDataset();将数据转换为IDataset形式,注:必须要保证data的每个元素都是一个IDataset或List接口的对象
    15. 常用实现类,DataMap(适用于自定义构造IData对象),DataOraMap
    16. DataMap构造方式,new DatasetList():(构造一个空DatasetList)、new DatasetList(List list):构造一个List对象为DatasetList、new DatasetList(String str):根据一串文本构造DatasetList,文本格式和DatasetList.toString()生成的文本格式一样。
    17. 注:获取值转换成原生数据类型时,如果获取的为空或空串,会自动赋默认值,如getInt获取的值为空或空串时会转为0
  4. IDataset接口提供的排序功能

    1. 使用方法:
      例1: (对NAME列进行升序排列)
      dataset.sort("NAME", IDataset.TYPE_STRING, IDataset.ORDER_ASCEND);
      例2: (在对NAME列进行升序排列的基础上再对AGE列进行降序排列)
      dataset.sort("NAME", IDataset.TYPE_STRING, IDataset.ORDER_ASCEND, "AGE", IDataset.TYPE_INTEGER, IDataset.ORDER_DESCEND);
    2. 备注:
      可以依据特定的数据类型进行排序,现有的数据类型有(字符串:IDataset.TYPE_STRING; 整数:IDataset.TYPE_INTEGER;浮点型:IDataset.TYPE_DOUBLE)。
  5. Javascript中对应的数据结构

    Wade.DatasetList 类似多列数据结构的Javascript实现,主要包括以下方法和属性

    1. length属性 得到所包含的数据行数长度
    2. get(index[int],key[string])方法 获取一行数据,如果设置了key,并且获取的数据是Wade.DataMap格式的数据,则返回其中名称为key的项
    3. each(fn[function],scope[object])方法 遍历数据
    4. add(o[object])方法 增加一行数据
    5. remove(o[object])方法 删除数据列中的一列
    6. removeAt(index[int])方法 删除数据列中的一列
    7. indexOf(o[object])方法 获取某列数据的行标
    8. getCount()方法 获取所包含的数据行记录数
    9. toString(false|true) 方法 生成字符串,当参数为true时生成旧的格式字符串,当参数为false或不填时生成json语义的字符串

    Wade.DataMap 类似单列数据结构的Javascript实现,主要包括以下方法和属性

    1. length属性 得到所包含的数据项长度
    2. get(name[string],defaultValue[string])方法 获取项数据,如果值为空并且设置了默认值则返回默认值
    3. each(fn[function],scope[object])方法 遍历所有数据项
    4. eachKey(fn[function],scope[object])方法 遍历所有数据项名称
    5. put(name[string],value[object])方法 增加一项数据
    6. remove(o[object])方法 删除数据中的一项
    7. removeKey(name[string])方法 根据项名称来删除数据中的一项
    8. getCount()方法 获取所包含的数据项总数
    9. contains(o[object])方法 判断是否包含指定的数据项
    10. containsKey(name[string])方法 判断是否包含指定名称的数据项
    11. clear()方法 清空所有数据项
    12. first()方法 获取第一项数据
    13. last()方法 获取最后一项数据
    14. fillFormElements(form[domelement])方法,将对象包含的值填充到和项名称匹配的表单元素中
    15. toString(false|true) 方法 生成字符串,当参数为true时生成旧的格式字符串,当参数为false或不填时生成json语义的字符串
  6. 数据转换方式

    1. IDataset转字符串

      1. 简单数据结构输出结果(IDataset每个元素为IData)

        代码片段:

        //定义IDataset
        IDataset s1 = new DatasetList();
        //定义IData
        IData d1 = new DataMap();
        //加入元素
        d1.put("KEY11", "value11");
        d1.put("KEY12", "value12");
        d1.put("KEY13", "value13");
        //添加到IDataset中
        s1.add(d1);
        IData d2 = new DataMap();
        d2.put("KEY21", "value21");
        d2.put("KEY22", null);
        d2.put("KEY23", "value23");
        s1.add(d2);
        System.out.println(s1);
        

        输出结果:

        [{KEY11=["value11"], KEY12=["value12"], KEY13=["value13"]}, {KEY22=[""], KEY23=["value23"], KEY21=["value21"]}]
        

        说明:若对应的值为空,会自动转为""空字符串,每个元素的值通过=[..]来表示,若为数组,通过,号分隔

      2. 复杂数据结构输出结果(IData和IDataset相互嵌套)

        代码片段:

        IDataset s1 = new DatasetList();
        IData d1 = new DataMap();
        d1.put("KEY11", "value11");
        d1.put("KEY12", "value12");
        d1.put("KEY13", "value13");
        s1.add(d1);
        IData d2 = new DataMap();
        d2.put("KEY21", "value21");
        d2.put("KEY22", null);
        d2.put("KEY23", "value23");
        s1.add(d2);
        IDataset s2 = new DatasetList();
        s2.add(d2);
        IData d3 = new DataMap();
        d3.put("KEY31", "value31");
        d3.put("KEY32", "value32");
        d3.put("KEY33", "value33");
        //加入一个IData
        d2.put("DATA", d3);
        //加入一个IDataset
        s1.add(s2);
        System.out.println(s1);
        

        输出结果:

        [{KEY11=["value11"], KEY12=["value12"], KEY13=["value13"]}, {KEY22=[""], DATA=[{KEY33=["value33"]
        , KEY32=["value32"], KEY31=["value31"]}], KEY23=["value23"],KEY21=["value21"]}, "[{KEY22=[""], 
        DATA=["{KEY33=["value33"], KEY32=["value32"], KEY31=["value31"]}"], KEY23=["value23"], KEY21=["value21"]}]"]
        

        说明:IDataset和Data之间可以互相嵌套使用

    2. IData转字符串

      1. 简单数据结构输出结果(IDatas每个元素为非集合对象)

        代码片段:

        //定义IData
        IData d3 = new DataMap();
        d3.put("KEY31", "value31");
        d3.put("KEY32", "value32");
        d3.put("KEY33", "value33");
        System.out.println(d3);
        

        输出结果:

        {KEY33=["value33"], KEY32=["value32"], KEY31=["value31"]}
        

        说明:每个值通过[""]表示,若为值为数组通过["",""]表示

      2. 复杂数据结构输出结果(IData和IDataset相互嵌套)

        代码片段:

        IData d3 = new DataMap();
        d3.put("KEY31", "value31");
        d3.put("KEY32", "value32");
        d3.put("KEY33", "value33");
        IDataset s1 = new DatasetList();
        IData d1 = new DataMap();
        d1.put("KEY11", "value11");
        d1.put("KEY12", "value12");
        d1.put("KEY13", "value13");
        s1.add(d1);
        IData d2 = new DataMap();
        d2.put("KEY21", "value21");
        d2.put("KEY22", null);
        d2.put("KEY23", "value23");
        s1.add(d2);
        //加入IDataset,元素为IData对象
        d3.put("DATASET", s1);
        IData d4 = new DataMap();
        d4.put("KEY41", "value41");
        d4.put("KEY42", "value42");
        d4.put("KEY43", "value43");
        d4.put("DATA", d4);
        //加入IDataset,元素为String对象
        IDataset s2 = new DatasetList();
        s2.add("VALUE1");
        s2.add("VALUE2");
        s2.add("VALUE3");
        s2.add("VALUE4");
        d3.put("LIST", s2);
        System.out.println(d3);
        

        输出结果:

        {KEY33=["value33"], DATASET=[{KEY11=["value11"], KEY12=["value12"], KEY13=["valu
        e13"]}, {KEY22=[""], KEY23=["value23"], KEY21=["value21"]}], KEY32=["value32"],
        LIST=["VALUE1", "VALUE2", "VALUE3", "VALUE4"], KEY31=["value31"]}
        
    3. 字符串转IDataset

      String str = "{KEY33=["value33"], KEY32=["value32"], KEY31=["value31"]}";
      IData data = new DatasetList(str);
      

      注:
      1. 1、字符串与IData、IDataset对象灵活转换。
      2. 2、转换时不依赖于IData、IDataset的结构、可以无限层次嵌套。
      3. 3、若从字符串转换为IData、IDataset结构时,子嵌套的对象直接通过data.get("key"),dataset.get(0)获取,如果要获取子对象,需要强制转换,如:((IData) data.get("key")).get(0)
    4. JavaScript数据结构的使用

      //根据字符串来创建 DataMap对象
      var d4=new Wade.DataMap('{KEY33=["value33"], KEY32=["value32"], KEY31=["value31"]}');
      
      //获取对象中的数据项
      var v=d4.get('KEY33','defaultValue');
      
      //增加对象的数据项
      d4.put('KEY34','value34');
      
      //根据项名删除对象中的数据项
      d4.removeKey('KEY34');
      
      //遍历对象中的数据项
      d4.each(function(item,index,totalcount){
      	alert('共' +totalcount +'项,这是第' + (index+1) + '项,值为:' + item);
      });
      
      //将对象输出成字符串格式
      d4.toString();
      
      //根据字符串来创建 DatasetList对象
      var ds4=new Wade.DatasetList('[{KEY11=["value11"], KEY12=["value12"], KEY13=["value13"]}, {KEY22=[""], KEY23=["value23"], KEY21=["value21"]}]');
      
      //在这个例子中,DatasetList对象里嵌套了DataMap对象
      //根据行标删除多列数据集中的一列 
      ds4.removeAt(0);
      
      //增加多列数据集的列
      var newd=new Wade.DataMap();
      newd.put('KEY33','value33');
      newd.put('KEY43','value43');
      ds4.add(newd);
      
      //获取多列数据集中的一列
      ds4.get(0);
      
      //获取列中的项值 ds4.get(0,'KEY33')
      //直接删除多列数据集中的列数据 
      d4.remove(newd);
      
      //遍历多列数据集中的数据列
      ds4.each(function(item,index,totalcount){
      	alert('共' +totalcount +'列,这是第' + (index+1) + '列,输出为字符串是:' + item);
      });
      
      //输出多列数据集成字符串格式
      ds4.toString();
      
    5. 推荐的服务器端与客户端数据交互方式

      1. 普通交互

        1. 服务器传递数据到页面
          pd.setTransfer("info", dataset.toString()); //在页面端会生成<input id="info" name="info" type="hidden" value="[{KEY1=["VALUE1"], KEY2=["VALUE2"]}]"/>这种数据.
          
        2. 客服端获取数据对象
          var dataset = new DatasetList(getElementValue("info")); //将串转成Dataset对象,getElementValue("info")表示获取name="info"的隐藏框的值
          
        3. 服务器获取数据对象
          IDataset info = new DatasetList(pd.getParameter("info")); //将串转成Dataset对象,pd.getParameter("info")表示获取name="info"的隐藏框的值
          
      2. ajax交互

        1. 客服端发起请求
          ajaxDirect(this, 'listener', params);
          
        2. 服务器传递数据到页面
          pd.setAjaxDataset(dataset);
          
        3. 客户端获取数据
          this.afterAction = "func1()"; //必须通过afterAction才能获取数据,this.afterAction写在ajaxDirect方法之后
          function func1() {
          	var dataset = this.ajaxDataset; //获取服务器端数据
          	...
          }