JS 代码,通过saveArrayList函数提交多层嵌套对象 
====================================================
var arr2 = new Array(); 
arr2[0] = new LayoutData(1, "arr2", 1); 
arr2[1] = new LayoutData(1, "arr2", 1); 
arr2[0].Node = new Array(); 
arr2[0].Node[0]=new DrawObjPro(1, 2, "Test1", 1, "OKS"); 
arr2[0].Node[1]=new DrawObjPro(1, 2, "Test2", 1, "OKS"); 
arr2[1].Node = new Array(); 
arr2[1].Node[0]=new DrawObjPro(1, 2, "11111Test2", 1, "OKS"); 
arr2[1].Node[1]=new DrawObjPro(1, 2, "11111Test2", 1, "OKS"); ActEditBean.saveArrayList(arr2, testfun); 
服务器端JAVA代码,接受数据 
====================================================
public String saveArrayList(ArrayList <Hashtable> al){ 
    System.out.println("al.size()="+al.size()); 
    for (int i=0; i <al.size(); i++){ 
        System.out.println(al.get(i)); 
        
        Hashtable ht = (Hashtable) al.get(i); 
        for(Iterator it = ht.keySet().iterator();it.hasNext();){  
            String key= (String)it.next();  
            Object value = ht.get(key); 
            System.out.println(key+"---"+value); 
        } 
        //ArrayList test_al = (ArrayList)ht.get("Node"); 
    } 
    return "OK"; 

服务器端打印结果 
====================================================
al.size()=2 
{Node=[reference:c0-e6,reference:c0-e12], layname=arr2, layid=1, laytype=1} 
Node---[reference:c0-e6,reference:c0-e12] 
layname---arr2 
layid---1 
laytype---1 
{Node=[reference:c0-e23,reference:c0-e29], layname=arr2, layid=1, laytype=1} 
Node---[reference:c0-e23,reference:c0-e29] 
layname---arr2 
layid---1 
laytype---1 ===============================================================
问题是 如果将 //ArrayList test_al = (ArrayList)ht.get("Node"); 的注释符去掉,将提示 
警告: --Erroring: batchId[2] message[java.lang.ClassCastException: java.lang.String cannot be cast to java.util.ArrayList] 我已经在dwr.xml中加入了如下 
<signatures> 
    <![CDATA[ 
        import java.util.ArrayList; 
        import java.util.Hashtable; 
        ActEditBean.saveArrayList(ArrayList(Hashtable)); 
    ]]> 
</signatures> 实现了一层嵌套,如果我需要多层嵌套;有没人碰到过这种问题吗? 
我因为提交是一个图形,图形面板可嵌套N层; 
暂不先考虑其它自定义格式提交数据;就采用DWR实现,有人知道其它解决方法吗?

解决方案 »

  1.   

    JS 对象类
    =============================
    function LayoutData(layid,layname,laytype, Node) {
    this.layid = layid;
    this.layname = layname;
    this.laytype = laytype;
    this.Node = Node;
    this.getString = getString;

    function getString(){
    var str = 
    "layid:"+this.layid+";"+
    "layname:"+this.layname+";"+
    "laytype:"+this.laytype+";"+
    "Node:"+this.Node;
    return str;
    }
    };function DrawObjPro(prolid,proid,prolname,prolvaltype,provalue){
    this.prolid = prolid;
    this.proid = proid;
    this.prolname = prolname;
    this.prolvaltype = prolvaltype;
    this.provalue = provalue;
    this.getString = getString;

    function getString(){
    var str = 
    "prolid:"+this.prolid+";"+
    "proid:"+this.proid+";"+
    "prolname:"+this.prolname+";"+
    "prolvaltype:"+this.prolvaltype+";"+
    "provalue:"+this.provalue;
    return str;
    }
    };
      

  2.   

    运行时,还有部分警告;
    ============================
    2009-4-29 11:32:52 org.directwebremoting.util.CommonsLoggingOutput warn
    警告: Missing type info for saveArrayList(0<0<0>>). Assuming this is a map with String keys. Please add to <signatures> in dwr.xml
    2009-4-29 11:32:52 org.directwebremoting.util.CommonsLoggingOutput warn
    警告: Missing type info for saveArrayList(0<0<1>>). Assuming this is a map with String keys. Please add to <signatures> in dwr.xml
    2009-4-29 11:32:52 org.directwebremoting.util.CommonsLoggingOutput warn
    警告: Missing type info for saveArrayList(0<0<0>>). Assuming this is a map with String keys. Please add to <signatures> in dwr.xml
    2009-4-29 11:32:52 org.directwebremoting.util.CommonsLoggingOutput warn
    警告: Missing type info for saveArrayList(0<0<1>>). Assuming this is a map with String keys. Please add to <signatures> in dwr.xml
    2009-4-29 11:32:52 org.directwebremoting.util.CommonsLoggingOutput info看样子DWR已经知道有两层嵌套了,saveArrayList(0<0<0>>);那如何配置 signatures呢?
      

  3.   

    代码应该足够能看出所在的问题
    JS的 LayoutData,DrawObjPro 两个类结构也贴出来了
    上面的ActEditBean.saveArrayList(arr2, testfun); 中的arr2是写的是测试数据,一个三层嵌套的结构
    主要问题还是DWR将这个复杂类型转换成在服务端JAVA程序能识别的集合格式
    而这种格式能描述给DWR进行识别的地方似乎只是设置signatures
    一层嵌套通过上面的signatures设置已经解决,多层怎么办呢?
      

  4.   

    这是我写一个段可读性极差的对象嵌套 的字符串拼接方式,把对象序列化;
    下面只是写了三层,多层可改成递归的方式实现;
    =====================================================
    请问:大家有没有更好的方式提交这种数据
    比如 可读性强,更容易贴近面向对象
    提供思路者有分,欢迎大家分享自己的智慧。
    =====================================================
        var ld = st.getEditorData();
        retval = "";
        retval+=ld.getString()+"∮";            
        var pdarr = st.getEditorData().Node;
        for (var i=0; pdarr!=null && i<pdarr.length; i++){
    retval+=pdarr[i].getString()+"⊥";
    var ddarr = pdarr[i].Node;
    for (var j=0; ddarr!=null && j<ddarr.length; j++){
        retval+=ddarr[j].getString()+"∏";
        var prarr = ddarr[j].Node;
        for (var n=0; prarr!=null && n<prarr.length; n++){
    retval+=prarr[n].getString()+"∩";
        }
        retval+="∪";
    }
    retval+="∫";
        }
        alert(retval);
      

  5.   

    上面问题还是没有描述清楚
    ==============================================
    请问:
    大家有没有更好的方式提交这种数据(对象类多层嵌套的结构或者说 集合数据多层嵌套)
    比如 可读性强,更容易贴近面向对象 
    提供思路者有分,欢迎大家分享自己的智慧。
    ==============================================
    比如结构:
    {
    a: test1,
    b: {
            a: test1,
            b: {
                    a: test1,
                    b: test2,
                    c: test3
               },
            c: test3
       },
    c: test3
    }
      

  6.   

    刚截取了DWR 提交数据时使用字符串拼接的数据结构
    ====================================================
    c0-id=0
    c0-e1=string:2
    c0-e2=string:%E6%96%B0%E8%8A%82%E7%9B%AE
    c0-e3=string:2
    c0-e6=string:10
    c0-e7=string:1
    c0-e8=string:0
    c0-e9=string:0
    c0-e10=string:281
    c0-e11=string:151
    c0-e14=string:23
    c0-e15=string:10
    c0-e16=string:drawobj
    c0-e17=string:image
    c0-e18=null:null
    c0-e21=string:1
    c0-e22=string:31
    c0-e23=string:%E5%9B%BE%E5%83%8F
    c0-e24=string:1
    c0-e25=string:timage.gif
    c0-e20=Object_DrawObjPro:{prolid:reference:c0-e21, proid:reference:c0-e22, prolname:reference:c0-e23, prolvaltype:reference:c0-e24, provalue:reference:c0-e25}
    c0-e27=string:9
    c0-e28=string:32
    c0-e29=string:%E5%AE%BD%E5%BA%A6
    c0-e30=string:2
    c0-e31=string:
    c0-e26=Object_DrawObjPro:{prolid:reference:c0-e27, proid:reference:c0-e28, prolname:reference:c0-e29, prolvaltype:reference:c0-e30, provalue:reference:c0-e31}
    c0-e33=string:10
    c0-e34=string:33
    c0-e35=string:%E9%AB%98%E5%BA%A6
    c0-e36=string:2
    c0-e37=string:
    c0-e32=Object_DrawObjPro:{prolid:reference:c0-e33, proid:reference:c0-e34, prolname:reference:c0-e35, prolvaltype:reference:c0-e36, provalue:reference:c0-e37}
    c0-e19=Array:[reference:c0-e20,reference:c0-e26,reference:c0-e32]
    c0-e13=Object_DrawObjData:{objid:reference:c0-e14, panid:reference:c0-e15, objname:reference:c0-e16, objtype:reference:c0-e17, objresname:reference:c0-e18, Node:reference:c0-e19}
    c0-e39=string:24
    c0-e40=string:10
    c0-e41=string:drawobj
    c0-e42=string:image
    c0-e43=null:null
    c0-e46=string:1
    c0-e47=string:34
    c0-e48=string:%E5%9B%BE%E5%83%8F
    c0-e49=string:1
    c0-e50=string:combined_v6.gif
    c0-e45=Object_DrawObjPro:{prolid:reference:c0-e46, proid:reference:c0-e47, prolname:reference:c0-e48, prolvaltype:reference:c0-e49, provalue:reference:c0-e50}
    c0-e52=string:9
    c0-e53=string:35
    c0-e54=string:%E5%AE%BD%E5%BA%A6
    c0-e55=string:2
    c0-e56=string:
    c0-e51=Object_DrawObjPro:{prolid:reference:c0-e52, proid:reference:c0-e53, prolname:reference:c0-e54, prolvaltype:reference:c0-e55, provalue:reference:c0-e56}
    c0-e58=string:10
    c0-e59=string:36
    c0-e60=string:%E9%AB%98%E5%BA%A6
    c0-e61=string:2
    c0-e62=string:
    c0-e57=Object_DrawObjPro:{prolid:reference:c0-e58, proid:reference:c0-e59, prolname:reference:c0-e60, prolvaltype:reference:c0-e61, provalue:reference:c0-e62}
    c0-e44=Array:[reference:c0-e45,reference:c0-e51,reference:c0-e57]
    c0-e38=Object_DrawObjData:{objid:reference:c0-e39, panid:reference:c0-e40, objname:reference:c0-e41, objtype:reference:c0-e42, objresname:reference:c0-e43, Node:reference:c0-e44}
    c0-e12=Array:[reference:c0-e13,reference:c0-e38]
    c0-e5=Object_PanelData:{panid:reference:c0-e6, panname:reference:c0-e7, pantop:reference:c0-e8, panleft:reference:c0-e9, panwidth:reference:c0-e10, panheight:reference:c0-e11, Node:reference:c0-e12}
    c0-e64=string:11
    c0-e65=string:2
    c0-e66=string:0
    c0-e67=string:280
    c0-e68=string:120
    c0-e69=string:151
    c0-e72=string:25
    c0-e73=string:11
    c0-e74=string:drawobj
    c0-e75=string:html
    c0-e76=null:null
    c0-e79=string:4
    c0-e80=string:37
    c0-e81=string:%E6%92%AD%E6%94%BE%E6%96%87%E4%BB%B6
    c0-e82=string:1
    c0-e83=string:thtml.htm
    c0-e78=Object_DrawObjPro:{prolid:reference:c0-e79, proid:reference:c0-e80, prolname:reference:c0-e81, prolvaltype:reference:c0-e82, provalue:reference:c0-e83}
    c0-e77=Array:[reference:c0-e78]
    c0-e71=Object_DrawObjData:{objid:reference:c0-e72, panid:reference:c0-e73, objname:reference:c0-e74, objtype:reference:c0-e75, objresname:reference:c0-e76, Node:reference:c0-e77}
    c0-e70=Array:[reference:c0-e71]
    c0-e63=Object_PanelData:{panid:reference:c0-e64, panname:reference:c0-e65, pantop:reference:c0-e66, panleft:reference:c0-e67, panwidth:reference:c0-e68, panheight:reference:c0-e69, Node:reference:c0-e70}
    c0-e85=string:12
    c0-e86=string:3
    c0-e87=string:150
    c0-e88=string:0
    c0-e89=string:400
    c0-e90=string:80
    c0-e93=string:26
    c0-e94=string:12
    c0-e95=string:drawobj
    c0-e96=string:falsh
    c0-e97=null:null
    c0-e100=string:2
    c0-e101=string:38
    c0-e102=string:%E6%92%AD%E6%94%BE%E6%96%87%E4%BB%B6
    c0-e103=string:1
    c0-e104=string:tfalsh.swf
    c0-e99=Object_DrawObjPro:{prolid:reference:c0-e100, proid:reference:c0-e101, prolname:reference:c0-e102, prolvaltype:reference:c0-e103, provalue:reference:c0-e104}
    c0-e98=Array:[reference:c0-e99]
    c0-e92=Object_DrawObjData:{objid:reference:c0-e93, panid:reference:c0-e94, objname:reference:c0-e95, objtype:reference:c0-e96, objresname:reference:c0-e97, Node:reference:c0-e98}
    c0-e106=string:27
    c0-e107=string:12
    c0-e108=string:drawobj
    c0-e109=string:falsh
    c0-e110=null:null
    c0-e113=string:1
    c0-e114=string:
    c0-e115=string:%E5%9B%BE%E5%83%8F
    c0-e116=string:1
    c0-e117=null:null
    c0-e112=Object_DrawObjPro:{prolid:reference:c0-e113, proid:reference:c0-e114, prolname:reference:c0-e115, prolvaltype:reference:c0-e116, provalue:reference:c0-e117}
    c0-e119=string:9
    c0-e120=string:
    c0-e121=string:%E5%AE%BD%E5%BA%A6
    c0-e122=string:2
    c0-e123=string:
    c0-e118=Object_DrawObjPro:{prolid:reference:c0-e119, proid:reference:c0-e120, prolname:reference:c0-e121, prolvaltype:reference:c0-e122, provalue:reference:c0-e123}
    c0-e125=string:10
    c0-e126=string:
    c0-e127=string:%E9%AB%98%E5%BA%A6
    c0-e128=string:2
    c0-e129=string:
    c0-e124=Object_DrawObjPro:{prolid:reference:c0-e125, proid:reference:c0-e126, prolname:reference:c0-e127, prolvaltype:reference:c0-e128, provalue:reference:c0-e129}
    c0-e111=Array:[reference:c0-e112,reference:c0-e118,reference:c0-e124]
    c0-e105=Object_DrawObjData:{objid:reference:c0-e106, panid:reference:c0-e107, objname:reference:c0-e108, objtype:reference:c0-e109, objresname:reference:c0-e110, Node:reference:c0-e111}
    c0-e91=Array:[reference:c0-e92,reference:c0-e105]
    c0-e84=Object_PanelData:{panid:reference:c0-e85, panname:reference:c0-e86, pantop:reference:c0-e87, panleft:reference:c0-e88, panwidth:reference:c0-e89, panheight:reference:c0-e90, Node:reference:c0-e91}
    c0-e4=Array:[reference:c0-e5,reference:c0-e63,reference:c0-e84]
    c0-param0=Object_LayoutData:{layid:reference:c0-e1, layname:reference:c0-e2, laytype:reference:c0-e3, Node:reference:c0-e4}
    batchId=7
      

  7.   

    DWR从服务端返回嵌套的对象数据结构,
    有意思的是返回的是JS代码,可直接通过eval函数直接整出这个嵌套对象;
    下面我贴出截取回应的HTTP头及数据  如下
    ============================================================
    HTTP/1.1 200 OK
    Server: Apache-Coyote/1.1
    Content-Type: text/javascript
    Content-Length: 3132
    Date: Sun, 31 May 2009 02:36:58 GMTthrow 'allowScriptTagRemoting is false.';
    //#DWR-INSERT
    //#DWR-REPLY
    var s0 = {};
    var s1 = [];
    var s2 = {};
    var s5 = [];
    var s6 = {};
    var s8 = [];
    var s9 = {};
    var s10 = {};
    var s11 = {};
    var s7 = {};
    var s12 = [];
    var s13 = {};
    var s14 = {};
    var s15 = {};
    var s3 = {};
    var s16 = [];
    var s17 = {};
    var s18 = [];
    var s19 = {};
    var s4 = {};
    var s20 = [];
    var s21 = {};
    var s23 = [];
    var s24 = {};
    var s22 = {};
    var s25 = [];
    var s26 = {};
    s0.node = s1;
    s0.laymoditime = "2009-05-27 17:51:39";
    s0.laytype = "2";
    s0.laybgimg = "";
    s0.laywidth = "0";
    s0.uid = "0";
    s0.laycreatetime = "2009-05-27 17:51:39";
    s0.laybgcolor = "0";
    s0.layid = "2";
    s0.layname = "\u65B0\u8282\u76EE";
    s0.laytop = "0";
    s0.layheight = "0";
    s0.layleft = "0";
    s1[0] = s2;
    s1[1] = s3;
    s1[2] = s4;
    s2.panscoop = "0";
    s2.panleft = "0";
    s2.node = s5;
    s2.panbgimg = "";
    s2.panbgcolor = "0";
    s2.panwidth = "281";
    s2.panscoopmask = "";
    s2.panheight = "151";
    s2.layid = "2";
    s2.pantop = "0";
    s2.panid = "10";
    s2.panname = "1";
    s5[0] = s6;
    s5[1] = s7;
    s6.objorder = "0";
    s6.objtype = "image";
    s6.objid = "23";
    s6.objtypid = "0";
    s6.node = s8;
    s6.panid = "10";
    s6.objname = "drawobj";
    s8[0] = s9;
    s8[1] = s10;
    s8[2] = s11;
    s9.objtype = "image";
    s9.provalue = "timage.gif";
    s9.proid = "31";
    s9.prolid = "1";
    s9.prolname = "\u56FE\u50CF";
    s9.prolvaltype = "1";
    s10.objtype = "image";
    s10.provalue = "";
    s10.proid = "32";
    s10.prolid = "9";
    s10.prolname = "\u5BBD\u5EA6";
    s10.prolvaltype = "2";
    s11.objtype = "image";
    s11.provalue = "";
    s11.proid = "33";
    s11.prolid = "10";
    s11.prolname = "\u9AD8\u5EA6";
    s11.prolvaltype = "2";
    s7.objorder = "0";
    s7.objtype = "image";
    s7.objid = "24";
    s7.objtypid = "0";
    s7.node = s12;
    s7.panid = "10";
    s7.objname = "drawobj";
    s12[0] = s13;
    s12[1] = s14;
    s12[2] = s15;
    s13.objtype = "image";
    s13.provalue = "combined_v6.gif";
    s13.proid = "34";
    s13.prolid = "1";
    s13.prolname = "\u56FE\u50CF";
    s13.prolvaltype = "1";
    s14.objtype = "image";
    s14.provalue = "";
    s14.proid = "35";
    s14.prolid = "9";
    s14.prolname = "\u5BBD\u5EA6";
    s14.prolvaltype = "2";
    s15.objtype = "image";
    s15.provalue = "";
    s15.proid = "36";
    s15.prolid = "10";
    s15.prolname = "\u9AD8\u5EA6";
    s15.prolvaltype = "2";
    s3.panscoop = "0";
    s3.panleft = "280";
    s3.node = s16;
    s3.panbgimg = "";
    s3.panbgcolor = "0";
    s3.panwidth = "120";
    s3.panscoopmask = "";
    s3.panheight = "151";
    s3.layid = "2";
    s3.pantop = "0";
    s3.panid = "11";
    s3.panname = "2";
    s16[0] = s17;
    s17.objorder = "0";
    s17.objtype = "html";
    s17.objid = "25";
    s17.objtypid = "0";
    s17.node = s18;
    s17.panid = "11";
    s17.objname = "drawobj";
    s18[0] = s19;
    s19.objtype = "html";
    s19.provalue = "thtml.htm";
    s19.proid = "37";
    s19.prolid = "4";
    s19.prolname = "\u64AD\u653E\u6587\u4EF6";
    s19.prolvaltype = "1";
    s4.panscoop = "0";
    s4.panleft = "0";
    s4.node = s20;
    s4.panbgimg = "";
    s4.panbgcolor = "0";
    s4.panwidth = "400";
    s4.panscoopmask = "";
    s4.panheight = "80";
    s4.layid = "2";
    s4.pantop = "150";
    s4.panid = "12";
    s4.panname = "3";
    s20[0] = s21;
    s20[1] = s22;
    s21.objorder = "0";
    s21.objtype = "falsh";
    s21.objid = "26";
    s21.objtypid = "0";
    s21.node = s23;
    s21.panid = "12";
    s21.objname = "drawobj";
    s23[0] = s24;
    s24.objtype = "falsh";
    s24.provalue = "tfalsh.swf";
    s24.proid = "38";
    s24.prolid = "2";
    s24.prolname = "\u64AD\u653E\u6587\u4EF6";
    s24.prolvaltype = "1";
    s22.objorder = "0";
    s22.objtype = "falsh";
    s22.objid = "27";
    s22.objtypid = "0";
    s22.node = s25;
    s22.panid = "12";
    s22.objname = "drawobj";
    s25[0] = s26;
    s26.objtype = "falsh";
    s26.provalue = "";
    s26.proid = "";
    s26.prolid = "2";
    s26.prolname = "\u64AD\u653E\u6587\u4EF6";
    s26.prolvaltype = "1";
    dwr.engine._remoteHandleCallback('8', '0', [s0]);
      

  8.   

    哎,我的问题也是这样。我的要五层嵌套map。