DWR是Ajax的一个开源框架,可以很方便是实现调用远程Java类。但是,DWR只能采用回调函数的方法,在回调函数中获取返回值,然后进行处理。那么,到底有没有办法直接获取一个方法的放回值呢?
下面我写一个简单的Java类,如下:
public class Test()
{
public String getString()
{
return "test";
}
}
上面这个类很简单,里面的getString就直接返回一个字符串。
我们假设在DWR中配置了Test在DWR中所对应的类未JTest,那么我们要调用getString方法,可以这样写:
function Test()
{
//调用Java类Test的getString方法,callBackFun为回调函数
JTest.getString(callBackFun);
//回调函数
function callBackFun(data)
{
alert(data);
}
}
这里处理很简单,就是调用java类的方法,然后在回调函数中处理,上面那段话执行后会显示test,也就是java方法的返回值。但是,采用回家函数不符合我们的习惯,有些时候我们就想直接获取返回值进行处理,这时候就无能为力了。
我们知道,DWR是Ajax的框架,那么必然拥有了Ajax的特性了。
先来说说Ajax的运行原理吧,其实它的原理很简单,就是调用远端地址,获取页面返回数据,然后进行分析处理。而这个过程是异步的,就就是为什么DWR采用回调函数的原因了,而你不知道,我们调用了Java类后,回调函数不知道什么时候执行。
再来看看Ajax的方法,其中,XMLHttpRequest的open函数是有一个是否同步参数,如下:
XMLHttpRequest.open(String method, String URL, boolean asynchronous)
其中的asynchronous就是是否同步的参数了。
现在,让我们打开DWR的engine.js文件,搜索一个asyn,马上,就发现了一个setAsync方法,原来,DWR是这个方法设置成属性封装起来了。这样,我们就可以实现获取返回值的功能了。
下面,我在DWR中封装出Java类,如下:
function Test()
{
var _data = "";
this.getString = function()
{
//设置成同步
DWREngine.setAsync(false);
//调用Java类Test的getString方法,callBackFun为回调函数
JTest.getString(callBackFun);
//重新设置为异步方式
DWREngine.setAsync(true);
return _data;
}
//回调函数
function callBackFun(data)
{
_data = data;
}
}
上面这个方法,在调用java方法之前先设置为同步方式,那么调用java方法后,执行了回调函数后,才接着执行下面的语句,这样子,返回_data就已经赋值了,所以可以正常获取值。
上面这些写法比较麻烦,可以写成下面方式:
function Test()
{
var _data = "";
this.getString = function()
{
//设置成同步
DWREngine.setAsync(false);
//调用Java类Test的getString方法,callBackFun为回调函数
JTest.getString(function(data){_data = data;});
//重新设置为异步方式
DWREngine.setAsync(true);
return _data;
}
}
来源:
http://hilijx.blog.163.com/blog/static/110223782201131293831483/
自己代码使用:
function checkAirport(){
var cityArr = [];
var apArr = [];
jQuery("input[id^='airportcode']").each(function() {
var citycode = jQuery(this).parent().prev().html();
var code = jQuery(this).val();
cityArr[cityArr.length] = citycode;
apArr[apArr.length] = code;
})
var res = "";
DWREngine.setAsync(false);
ZonesEvent.checkAirportCode(cityArr,apArr, function(obj){
if (obj != null) {
if(obj == ""){
res = true;
}else{
alert(obj);
res = false;
}
} else {
alert("@TW出錯了.請再來一次@@CN出错了.请再来一次@@ENError.Please try again@.");
}
});
DWREngine.setAsync(true);
//alert("res:"+res);
return res;
}
。。。
程序中 异步和同步是啥意思?
异步调用是通过使用单独的线程执行的。原始线程启动异步调用,异步调用使用另一个线程执行请求,而与此同时原始的线程继续处理。
同步调用则在继续之前必须等待响应或返回值。如果不允许调用继续即无响应或返回值,就说调用被阻塞了,不能继续执行。
就好比说,向服务器端发送请求,如果不需要服务器响应就是异步,如果需要服务器返回信息就是同步
同步,
主机A发送数据的时候,主机B必须等待接收,处于阻塞状态,这就好比别人给你打电话,你必须当场听话,否则则【错失良机】
异步
主机A发送数据的时候,主机B无须等待接收,主机B要获得数据就从缓存里取,就好比别人给你发邮件一样
分享到:
相关推荐
### DWR取得回调函数返回值案例详解 #### 一、DWR简介 DWR (Direct Web Remoting) 是一种简化Ajax应用开发的技术框架。...通过以上内容的学习,相信读者对DWR中如何获取回调函数返回值有了更深入的理解。
4. **回调函数**:在DWR中,回调函数用于处理Java方法返回的数据,通常在异步调用中使用。 5. **DWREngine.setAsync**:这个函数用于设置DWR引擎的工作模式,`true`表示异步,`false`表示同步。 6. **DWR方法调用**...
配置与无参数情况相同,但需要在JavaScript中定义接收返回值的回调函数。例如,`callTestMethod2`调用`testMethod2`并传递`callBackFortestMethod2`作为回调函数,此函数将接收到`testMethod2`的返回值。 3. **有...
**8.3 传递额外的数据到回调函数**:除了基本的返回结果外,还可以传递其他数据到回调函数,增强应用程序的功能性和灵活性。 **8.4 从其他URL读取数据**:DWR不仅支持从本地服务器获取数据,还可以跨域调用其他...
对于具有简单返回值的Java方法的调用,可以使用回调函数来处理返回结果。例如,调用`testMethod2`并在`callBackFortestMethod2`中处理返回的数据。 DWR的优势在于简化了AJAX开发,提供了一种接近RPC(Remote ...
调用`testClass.testMethod2()`时,传递一个函数作为参数,如`callBackFortestMethod2`,DWR会自动调用这个回调函数并将返回值传入。 3. **调用有简单参数的JAVA方法** 调用Java方法时可以传递参数。在JavaScript...
例如,服务器端有一个方法`getString()`返回一个字符串,DWR会自动将这个字符串传递给JavaScript回调函数。这在显示消息、错误信息或者简单的数据交换中非常有用。 2. **返回对象**: DWR支持将Java对象转换为JSON...
为了保持异步特性,DWR采用回调函数(callback())的方式:如果远程调用成功,则回调函数自动执行;若失败则不执行。 **示例:** 如图22-1所示,通过DWR改变下拉列表框的过程。这一过程展示了DWR如何简化JavaScript与...
一种情况是因为DWR1.0的解析器中有个Bug,在有些场合会无法处理返回值的类型.所以应该要避免这种情况的发生. 一种情况是因为解析器是一个语法宽松的解析器,他不象编译器一样对语法有非常严格的要求,所有有时可能一些...
如果Java方法有返回值,如`testMethod2`,你同样在`dwr.xml`中配置,然后在JavaScript中提供一个回调函数来处理返回值: ```javascript function callTestMethod2() { testClass.testMethod2...