昨日用了Ext Tree组件做一个东西,需要用到ajax对节点逐级加载,开始数据用的静态数据data.txt,一切程序都测好了然后放到系统中测试,将data.txt换成了servlet,发现什么都不显示,单独访问servlet也能正常返回json数据,猜想应该是出现ajax调用错误了,检查了传递的参数与服务端需要的参数名也丝毫没有问题,Loader的代码大致是这样的:
loader: new Tree.TreeLoader({
dataUrl:'data.servlet',
baseAttrs:{leaf:true},
listeners:{
beforeload:function(treeLoader, node){
this.baseParams={ //传递两个参数
nodeid:node.attributes.nodeid,
orgid:node.attributes.orgid
};
node.on("append",function(tree,node,cnode){
var icon=cnode.attributes.type.toLowerCase();
if(icon=="p"){cnode.attributes.iconCls='c3'} //人员
if(icon=="m"){cnode.attributes.iconCls='c2'} //机构
if(icon=="d"){cnode.attributes.iconCls='c2'} //部门
});
}
}
})
接着为loader加了一个异常监听:
loadexception:function(tree,node,res){
alert(res.status);
}
运行弹出“405”,查了一下这个状态码的意义,原来是资源禁止访问,在java里也就是参数传递方式不对,Servlet用GET接受数据,但请求用POST传递数据,因此就会出现这个问题,知道原因就好办了,在treeLoader里加一个requestMethod:'GET'就ok了。
=======================================
还有一个问题要注意:tree ajax第一次请求数据时传递的的参数的值在rootNode里面设定,如
var root = new Tree.AsyncTreeNode({text: '根节点',nodeid:'',orgid:''});
里面的nodeid和orgid就是要发送到服务端的参数,注意与baseParams照应即可,这个值最好在rootNode里应该设定一下,否则服务端接收到的nodeid和orgid值就是undefined,如果服务端用null和''来检测空参数值就可能出现问题。如果初始访问不需要参数,则将参数都设为空,否则设定为特定的值即可。