您的位置:首页 > 编程语言 > Java开发

Openlaszlo调用JavaRPC和JAVA类通信

2006-04-20 10:31 169 查看
Openlaszlo调用JavaRPC和JAVA类通信

JavaRPC允许Laszlo客户端远程调用服务端的JAVA类和方法。在laszlo中使用<javarpc>标签来声明一个JavaRPC对象:
<javarpcclassname="..."

attributename="..."

scope="[session|webapp|none]"

loadoption="[loadcreate|loadonly|create]"

createargs="..."

objectreturntype="[pojo|javabean]"

autoload="[true|false]"

secure="[true|false]"

secureport="...">


classname(String):必需。指定需要访问的JAVA类名
attributename(String):使用服务端对象时的关键词。当scope为session或webapp时
使用。
Scope(String):必需。在session,webapp和none三个中选一个。
Loadoption(String):loadcreate,loadonly和create三个中任选一个。Loadcreate:如果服务器上存在该对象时加载,如果不存在,则在加载前自动创建该对象。Loadonly:只负责加载对象,如果该对象不存在,则返回一个错误。Create:在加载对象时总是在服务器端创建该对象。默认为loadcreate。
Createargs(Array):只有当loadoption为loadcreate或create时才有效。Createargs
数组包含一些变量,这些变量用来在服务端创建对象时使用。默认为
null。
Objectreturntype(String):pojo和javabean中任选一个。如果从服务端返回一个对象,使用pojo只返回该对象中所有声明为public的成员变量。使用javabean
将返回含有getXXX()方法的成员变量。
Autoload(Boolean):true或false。True:在初始化时自动加载指定的对象。False:需要在使用对象前调用load()方法。默认为true。
Secure(Boolean):true或false。如果选择true的话,会在服务端和客户端之间建立一个安全的连接。
Secureport(Number):只有才secure为true时才有效。

如:
<javarpcname=”returnsun”scope=”none”class=”RetuenSum”>通过returnsun来建立javarpc和java之间的桥梁。其中name就是指定一个rpc的属性(attributename)。
再通过remotecall调用java类的方法:
<remotecallname=”getSun”funcname="getSun">
<paramid=”a”name=”a”value=”’’”/>
<paramid=”b”name=”b”value=”’’”/>
<methodevent="ondata"args="sum"/>
</remotecall>
说明:在使用javarpc前,首先要将JAVA类定义为安全的,如下:
<security>
<allow>
<pattern>^com.sum.ReturnSum</pattern>
</allow>
</security>
funcname对应java类的方法名称。
如果调用的方法带有参数,remotecall需用<param>来传递参数,这个参数对应JAVA方法中的形参。在传递时,remotecall会根据param的位置和JAVA方法形参的位置匹配。
<methodevent="ondata"args="sum"/>,使用args来接收JAVA方法的返回值,无需定义数据类型。

下面通过一个小DEMO来演示一下使用JavaRPC和JAVA进行通信。

TypesExample类:

packageexamples;

importjava.util.Vector;
importjava.util.Hashtable;

publicclassTypesExample{

publicstaticStringpassInteger(inti){
return"gotintegerparameter:"+i;
}

publicstaticStringpassDouble(doubled){
return"gotdoubleparameter:"+d;
}

publicstaticStringpassBoolean(booleanb){
return"gotbooleanparameter:"+b;
}

publicstaticStringpassClientArray(Vectorv){
return"gotvectorparameter:"+v;
}

publicstaticStringpassClientObject(Hashtablet){
return"gothashtableparameter:"+t;
}

}

LZX文件demo.lzx


<canvasdebug="true"height="300"width="800">


<debugx="250"y="10"width="500"height="275"/>


<security>


<allow>


<pattern>^examples.TypesExample</pattern>


</allow>


</security>


<!--SeeWEB-INF/classes/TypesExample.javaforjavasource.-->


<javarpcname="types_example_rpc"scope="none"


classname="examples.TypesExample">


<methodevent="onload">


<!--SetbuttonsvisibleonlyafterJavaRPCobjectloads-->


canvas.buttons.setAttribute('visible',true);


</method>


<methodevent="ondata"args="res">


Debug.write('(typesondata)responseis:',res);


</method>


<methodevent="onerror"args="errmsg">


Debug.write('(typesonerror)error:',errmsg);


</method>


<!--Declarativelypassaninteger.-->


<remotecallfuncname="passInteger">


<paramvalue="42"/>


</remotecall>


<!--Declarativelypassadouble.Notethatwenamethisfunctionpd1


becausewehavemultipleremotecalldeclarationsthatcall


passDoublebutwithdifferentparameters.-->


<remotecallname="pd1"funcname="passDouble">


<paramvalue="42.1"/>


</remotecall>


<!--Declarativelypassadoublewith0decimal.The0decimalwill


truncateandthenumberwillbecomeanintegertypewhenitreaches


theserver.Thiscallwillfail.-->


<remotecallname="pd2"funcname="passDouble">


<paramvalue="42.0"/>


</remotecall>


<!--Declarativelypassadoublewith0decimal.Wrappingthedoublein


DoubleWrapperwillensurethevaluewillremainadoublewhen


reachingtheserver.-->


<remotecallname="pd3"funcname="passDouble">


<param>


<methodname="getValue">


returnnewLzRPC.DoubleWrapper(42.0);


</method>


</param>


</remotecall>


</javarpc>


<viewname="buttons"visible="false"layout="spacing:10">


<buttontext="passinteger"


onclick="types_example_rpc.passInteger.invoke()"/>


<buttontext="passdouble"


onclick="types_example_rpc.pd1.invoke()"/>


<buttontext="passdouble(willfail)"


onclick="types_example_rpc.pd2.invoke()"/>


<buttontext="passdoublew/LzRPC.DoubleWrapper"


onclick="types_example_rpc.pd3.invoke()"/>


<buttontext="passboolean"


onclick="this.passBoolean.invoke()">


<!--Thisisawaytodeclarearemotecallclosertowhereit'sbeing


used.Theremotecontextmustbeset.-->


<remotecallfuncname="passBoolean"


remotecontext="$once{types_example_rpc}">


<paramvalue="true"/>


</remotecall>


</button>


<buttontext="passarray"onclick="this.passArray.invoke()">


<remotecallname="passArray"funcname="passClientArray"


remotecontext="$once{types_example_rpc}">


<paramvalue="[1,'astring',4.5,false]"/>


</remotecall>


</button>


<buttontext="passhash"onclick="this.passObject.invoke()">


<remotecallname="passObject"funcname="passClientObject"


remotecontext="$once{types_example_rpc}">


<param


value="{a:1,b:3.14159,c:'astringvalue',d:true}">


</param>


</remotecall>


</button>


</view>



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: