说在前言:在公司搞了半年多的jsp,最近要转向flex,搞富客户端。
关于flex优缺点、如何与java通讯本人也是一知半解,刚接触两周左右,没有很深的理解。声明,在帖子中描述的问题,也许根本就不是问题,只是个人了解还甚少的结果,如果是这样,还烦请大家指出。
本文是有这样一个对话引起发的。
a:我勒个去,真是让人郁闷啊!
b:什么个情况?如实道来,让大家开心下。
a:是这样的,我在flex中的vo中定义了一个arraycollection集合,并将该vo与服务器端(java)的dto绑定,但是dto无论如何也接收不到这个集合。我抑郁啊。
b:额,这算哪儿门子问题啊。
a:哎。。。
b:也就是说,前端的arraycollection,服务器端木有接收到呗。(新手是不是也总遇到啊!)我帮你解决吧。
于是乎就有了下文。
签于前端传值后端接不到的状况,我测试的思路如下:在flex中创建一个testvo,里面就放一个arraycollection类型的变量,并与java中创建的testdto绑定,testdto中放置一个list集合接收前端的arraycollection。
代码如下:
testvo:
package net.greatsoft.communication.organization.vo
{
import mx.collections.arraycollection;
[bindable]
[remoteclass(alias="net.greatsoft.communication.organization.flex.dto.testdto")]
public class testvo
{
public function testvo()
{
}
public var _tests:arraycollection;
public function get tests():arraycollection
{
return _tests;
}
public function set tests(value:arraycollection):void
{
_tests = value;
}
}
}
testdto:
package net.greatsoft.communication.organization.flex.dto;
import java.util.arraylist;
import java.util.list;
public class testdto {
private listagencytreedto> trees;
public listagencytreedto> gettrees() {
return trees;
}
public void settrees(listagencytreedto> trees) {
this.trees = trees;
}
}
java的ro中定义一个为前端提供服务的方法,test(testdto dto):
public void test(testdto dto){
system.out.println(dto.gettests().size() + "-----------------------------");
}
省略一些无用代码。
看mxml中的调用,在页面中放置一个button,侦听button的click事件,在事件的回调函数中,构造两个testvo,并传递给java的testdto,在ro中获取到testdto,输入它的长度。继续对调用的返回结果添加侦听事件,如果成功则输出:传输成功,失败则输出:失败啦。
代码如下:
1、button的click事件处理
protected function btntest_clickhandler(event:mouseevent):void
{
var testvo:testvo = new testvo();
var trees:arraycollection = new arraycollection();
var tree1:agencytreevo = new agencytreevo();
tree1.id = "1";
tree1.name = "sfdfsdfdsfdffsdfds";
var tree2:agencytreevo = new agencytreevo();
tree2.id = "2";
tree2.name = "sfdfsdfdsfdffsdfds";
trees.additem(tree1);
trees.additem(tree2);
testvo.tests = trees;
agencyproxy.test1(testvo).addresultlistener(result_handler).addfaultlistener(fault_handler);
}
2、成功返回结果处理事件
private function result_handler(envet:resultevent):void{
alert.show(" 传值成功");
}
3、失败处理事件
private function fault_handler(event:faultevent):void{
alert.show("失败啦");
}
其实明眼人一下就能看出接收不到值得原因,但它不是本文的重点。重点是调试这个低级错误时无意中的收获。
1、运行项目,运行结果如下图:
后台无任何反应。不知问题出在哪。也没有输出size,奇了怪了。
2、修改test(testdto testdto)方法,如下:
public void test(testdto dto){
try {
system.out.println(dto.gettrees().size() + "-----------------------------");
} catch (exception e) {
e.printstacktrace();
}
}
也就是加上捕获异常。
运行结果如下:
哈哈,传值成功,但是看一眼后台,心灰意冷啊。
java.lang.nullpointerexception at
net.greatsoft.communication.organization.flex.organizationro.test(organizationro.java:150)
空指针异常啊,万恶的java的空指针异常啊。
更让我纳闷儿的是,在后台将异常捕获后,flex中将返回结果视为正常结果,在跟踪了flex的代码后发现,此处flex亦是捕获异常,如有异常则跳转到返回结果失败处理回调函数中(fault_handler),如无异常则跳转到返回结果成功回调函数处理。由于时间已经有点晚了,没有一步步去跟踪,将flex捕获异常的确切位置贴出来,但是它确实是那样处理的。感情去的朋友,可以自己去跟踪下。
这里得出一条经验:在flex结合java的应用程序中,不要在服务器端也就是java代码中捕获异常,这样会影响前端对结果的处理。
2、既然得知哪里抛出空指针异常,那把它改掉。
其实是在这里:private list trees,好吧,死马当活马医了。new一个list出来。
package net.greatsoft.communication.organization.flex.dto;
import java.util.arraylist;
import java.util.list;
public class testdto {
private listagencytreedto> trees = new arraylistagencytreedto>();
public listagencytreedto> gettrees() {
return trees;
}
public void settrees(listagencytreedto> trees) {
this.trees = trees;
}
}
继续运行程序。
嘿嘿,传值成功喽,后台打印:0-----------------------------。额,怎么可能,明明arraylist的size应该是2啊。继续找原因。
在这里其实依然有一条经验:private list trees = new arraylist(),它依旧会造成灰常隐晦的问题。这里解决了空指针异常问题,但是无论flex传递给java的参数时候传递成功,给flex的反馈都是成功的反馈,即没有发生异常。感兴趣的朋友可以将java的ro中的捕获异常去掉。结果依旧。
2、好啦,不卖关子了,其实flex传arraycollection,java端接收不到是因为vo中属性名称和dto中属性名称不一致造成的。细心啊,粗心搞死人啊。
将dto中trees改为tests。
运行程序。
后台输出:2-----------------------------。
到此flex传递arraycollection到java成功。废了不少力气。
b一定也看到怎么解决的了吧,赶紧去a那里炫耀一下吧。可别告诉他你废了多少力气啊。哈哈。
总结一下:
1、在flex与java结合的应用中,切忌vo与dto(或者实体)的属性名称要对应,blazeds在做flex转java类型的反序列化的需要吧,猜测。初学者很可能忽略这一点。
2、在处理结果集回调函数时,flex是捕获运行时异常,如发生异常则回调函数采用侦听结果集失败是件,否则采用侦听结果集成功事件处理。
1、在java的dto(或者实体)中的属性,尽量不要去new,可能会影响侦听结果集成功、失败事件的判定。如:private list trees = new arraylist()。
时间不早了,头脑有些不太清醒,语言描述可能不清晰,烦请各位见谅。其实有些饿了。。。
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/