Openlaszlo调用JavaRPC和JAVA类通信
2006-04-20 10:31
169 查看
Openlaszlo调用JavaRPC和JAVA类通信
JavaRPC允许Laszlo客户端远程调用服务端的JAVA类和方法。在laszlo中使用<javarpc>标签来声明一个JavaRPC对象:
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>
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>
相关文章推荐
- 【转】Java RPC通信机制之Apache XML-RPC 3.0开发简介
- 03_Java通信_JNDI_demo2远程调用weblogic的数据源
- Java调用本地接口jni与C通信----------------JNI
- JavaScript中远程级联调用(RPC)java对象中的方法并返回结果
- 基于XML-RPC的远程调用(Python,Java)
- Jmeter自定义编写Java代码调用socket通信
- Java RPC通信机制之RMI
- JNI 之二 :java & c/c++ 相互通信及调用
- java RPC方式调用axis2 webservice
- 11.3.1 基于消息通信的RPC调用之 AMQP简介
- Java____Servlet(调用servlet初始化request、response与webclient进行通信服务)学习整理
- Java实现简单的RPC调用(基于TCP协议)
- Java RPC通信机制之XML-RPC:Apache XML-RPC 3.0开发简介
- Java RPC通信机制之RMI
- VS2003调用java下的webservice(rpc-literal)
- WebService通信调用天气预报,Java
- RPC通信之HTTPService(Java-flex)
- bugzilla4的xmlrpc接口api调用实现分享: xmlrpc + https + cookies + httpclient +bugzilla + java实现加密通信下的xmlrpc接口调用并解决登陆保持会话功能
- java RPC方式调用axis2 webservice
- JNI 之二 :java & c/c++ 相互通信及调用