在DWR中实现直接获取一个JAVA类的返回值

在DWR中实现直接获取一个JAVA类的返回值

    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;

    }

}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏C#

解析.NET对象的跨应用程序域访问(上篇)

   在目前的项目开发中,分布式开发已经逐渐成为主流。一个项目要是没有采用分布式架构,都不好意思跟别人说这是一个完整的项目。这句话虽然有些过激,但是随着人们对效...

2185
来自专栏小勇DW3

类加载过程中几个重点执行顺序整理

1、 JVM会先去方法区中找有没有相应类的.class存在。如果有,就直接使用;如果没有,则把相关类的.class加载到方法区

3252
来自专栏申龙斌的程序人生

零基础学编程007:FOR循环

在上篇文章《赋值语句》之后,已经可以输出这个枯燥的《复利数据表》的任意一行数据了,例如用这两条语句: i = 100 print( "(1+0.01) ^", ...

3037
来自专栏白驹过隙

Redis - set类型操作

38113
来自专栏用户3030674的专栏

java线程控制安全

在线程运行的时候,有时会出现线程安全问题 例如:买票程序,有可能会出现不同窗口买同一张编号的票

770
来自专栏nnngu

015 反射中的 Class.forName() 与 ClassLoader.loadClass() 的区别

Class.forName() 与 ClassLoader.loadClass() 大家都知道是反射用来构造类的方法,但是他们的用法还是有一定区别的。 在讲区别...

2633
来自专栏有趣的Python和你

Python数据分析之groupby语法糖对分组进行迭代语法糖一:选取一个或多个列

1344
来自专栏一个会写诗的程序员的博客

Shell 极简教程Hello World变量函数运算符字符串数组for 循环if elseShell test 命令

注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:

1001
来自专栏L宝宝聊IT

Shell脚本应用(if语句的结构)

1435
来自专栏coding for love

JS入门难点解析5-变量对象

(注1:如果有问题欢迎留言探讨,一起学习!转载请注明出处,喜欢可以点个赞哦!) (注2:更多内容请查看我的目录。)

1144

扫码关注云+社区

领取腾讯云代金券