`
fw2003
  • 浏览: 80326 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

轻量级SOAP---PHPPRC实践(三)--自定义类型集合作为参数和返回类型

    博客分类:
  • J2EE
阅读更多

    紧接着前2篇关于PHPRPC的实践,最近试了下服务器端返回带泛型的的集合以及作为参数传递,特总结如下:

 

    首先是需要注意的是:不管是在服务器端定义发布方法时,还是在客户端定义代理接口时,都不建议用接口类型来声明返回值和参数类型。因为接口是抽象的不能被实例化,因此对于容器类型的参数和返回结果来说,接口并不能表明究竟该转换为何种具体类型。不过对于自定义类型可以用接口,只要传递的类型实现了该接口即可。

不过在 3.0.2 版之后,对 ListMapSetCollection 这四个容器接口也提供了支持,如果使用这四个接口类型来接收数据,那么 ListCollection 会被转换成 ArrayList 类型,Set 会被转换成 HashSet 类型,Map 会被转成 HashMap 类型。

 

    以上说明均来自于文档,那么我们可以得知,一旦PHPRPC在进行反序列化而又无法获得类型时,就会将类型当作HashMapArrayList 来处理,其中的数据则用byte[]形式传递.这个时候要么自己来将byte[]转为想要的类型,要么直接使用org.phprpc.util.Cast将HashMap/ArrayList转化为自己想要的类型.如果不想这么麻烦的话,就需要遵循一些规则,即当服务器端的自定义类型JAVA对象想要和其他语言的对象做转换时,需要注意:

   1.对于有包机制的语言,例如FLEX,要注意包名和类名都完全和JAVA对象的一样,具体请参看之前FLEX作为客户端的例子;

   2.对于没有包机制的语言,例如JS,则要注意用_代替.,同样实现类似包名点类名的形式.

例如如果你的服务器端的User类的全名为:

model.User,那么你客户端应该这样定义:

var User = function model_User(name,password){
          this.name = name;
          this.password = password;
}

 

===============================我是分割线==========================

    OK.接下来我们用实际例子来演示JAVA自定义集合类型作为参数以及返回类型的RMI:

    首先服务器类不变,在之前的TestService以及TestServiceImpl中添加代码

public List<User> getUsers();
public void showUsers(List<User> list);

public List<User> getUsers(){
    List<User> list = new ArrayList<User>();
    list.add(new User("fw"));
    list.add(new User("jr"));
    return list;
}

public void showUsers(List<User> list) {
    for(User u:list){
        System.out.println(u.getName()+" "+u.getPassword());
    }
}

 

   这2个方法分别为测试List<User>作为参数和返回类型的情况

   接下来在发布服务的时候将这2个方法也一起发布

   然后JS作为客户调用:

  

 var rpc_client = new PHPRPC_Client(URL,["showUsers","getUsers"]);
        
        //调用getUsers
        rpc_client.getUsers(function(result, args, output, warning){
           var str="";
           for(var i=0;i<result.length;i++){
             var user = result[i];
             str+=user.name+" ";
           }
           alert(str);
        });
       
        var User = function model_User(name,password){ 
          this.name = name; 
          this.password = password; 
        }
        
        var users=[new User("fw","123"),new User("jr","123")];
        rpc_client.showUsers(users);//调用showUsers

 

    最终得到结果:

    1.调用getUsers方法后得到服务器端返回的List<User>类型,客户端是转换为json数组接收的;

    2.如果根据1的结论想当然地在调用showUsers时以json数组的形式传递数据的话,则会因为泛型中的User类型不能在运行时被获取从而导致服务器端得到的实际上是List<HashMap>或者List<AssocArray>,需要手动转换(话说Hessian也不支持泛型,真的是觉得这个东东越来越没实际意义了);

    3.如果想要让JS这边自定义对象能够和JAVA的User对象进行转换,则不能够以工厂方式创建JS对象(JSON实际上就是工厂方式的一种快捷表示方法),而必须采用构造函数的方式创建.并且还需要注意服务器端的User类在包model下,即model.User,那么按照前面所提到的几点注意,需要在创建JS对象时用_代替.来表示包名点类名,因此是model_User.

 

    打完收工,基本上PHPRPC针对JAVA的支持除了泛型这个鸡助之外还是非常好的.

 

 

0
0
分享到:
评论

相关推荐

    轻量级SOAP---PHPPRC

    **轻量级SOAP---PHPPRC详解** 在IT行业中,远程过程调用(Remote Procedure Call,简称RPC)是一种常用于分布式系统的技术,它允许程序在不同的网络节点间调用彼此的功能,就像是本地调用一样。PHP作为广泛使用的...

    cxf-rt-bindings-soap-3.0.1-API文档-中文版.zip

    赠送jar包:cxf-rt-bindings-soap-3.0.1.jar; 赠送原API文档:cxf-rt-bindings-soap-3.0.1-javadoc.jar; 赠送源代码:cxf-rt-bindings-soap-3.0.1-sources.jar; 赠送Maven依赖信息文件:cxf-rt-bindings-soap-...

    soap-build生成Soap接口请求报文

    与soap-ui相比,虽然soap-ui是一款强大的SOAP测试工具,它允许用户图形化地创建、编辑和发送SOAP请求,同时提供详尽的响应分析和测试套件管理功能。然而,“soap-build”更专注于代码生成,特别是在持续集成(CI)和...

    jakarta.xml.soap-api-1.4.2.zip

    jakarta.xml.soap-api-1.4.2.jar jakarta.xml.soap-api-1.4.2-javadoc.jar jakarta.xml.soap-api-1.4.2-sources.jar

    soap-2_3_1

    SOAP(Simple Object Access Protocol)是一种基于XML的协议,用于在Web服务中交换结构化和类型化的信息。SOAP-2_3_1是一个特定版本的SOAP开发包,它为开发者提供了便利,使他们能够轻松地创建、部署和使用SOAP Web...

    unity 插件 Soap - ScriptableObject Architecture Pattern v2.7.0

    Soap - ScriptableObject 架构模式 Soap提供了一套工具,使您能够以简单、模块化和可重用的方式构建您的游戏。 厌倦了意大利面代码吗? Soap提供了无代码解决方案来解决常见的意大利面代码问题,让您可以: 在场景和...

    qtsoap-2.7_1

    QtSOAP-2.7_1 是一个开源的库,它为Qt框架提供了SOAP(Simple Object Access Protocol)的支持。SOAP是一种基于XML的协议,用于在Web服务中交换结构化和类型化的信息。QtSOAP使得Qt开发者能够轻松地创建客户端和...

    soap-bin-2.0.zip

    SOAP(Simple Object Access Protocol)是一种基于XML的协议,用于在Web服务中交换结构化和类型化的信息。SOAP 2.0版本是这个协议的一个迭代,它改进了之前版本的功能和性能,以更好地适应互联网环境的需求。 SOAP...

    ksoap2调用webService服务 包含自定义参数 自定义参数集合等

    - 自定义类型参数集合:可以使用List或Array SoapObject来表示集合,每个元素都是自定义类型的SoapObject。 6. 示例代码片段 ```java // 创建SoapObject表示请求 SoapObject request = new SoapObject...

    javax.xml.soap-api-1.4.0.jar

    安卓sdk找不到的api,因此需要引入额外的jar包1

    javax-xml-soap-1.6.0.jar

    1. **SOAP协议**:SOAP是一种轻量级的、基于XML的协议,用于在Web上交换结构化和类型化的信息。它允许应用程序通过HTTP等传输协议发送和接收数据,使其成为Web服务通信的理想选择。 2. **javax.xml.soap** 包:这是...

    SOAP-MTOM_Canon.pdf

    "SOAP-MTOM_Canon.pdf" SOAP(Simple Object Access Protocol)是一种基于 XML 的轻量级协议,用于在网络上交换结构化的信息。SOAP 使用 HTTP 或 SMTP 等协议作为传输协议,将 XML 数据封装在 SOAP 消息中,以实现...

    qtsoap-2.6-opensource

    该源码包"qtsoap-2.6-opensource"包含了完整的源代码,使得开发者可以深入理解其工作原理,并根据需要进行定制和扩展。在源码包中,我们可以找到以下关键组成部分: 1. **头文件**:这些文件(通常以 `.h` 结尾)...

    qt-soap-webservice

    在"qt-soap-webservice"中,这些工具可能被用来解析服务器返回的SOAP响应,提取所需的信息。 标签"qt5"表明这个示例是基于Qt 5版本的,这意味着它利用了Qt 5引入的一些新特性和改进,比如更好的性能、更现代的API...

    soap-bin-2.3.1.zip

    SOAP(Simple Object Access Protocol)是一种基于XML的协议,用于在Web服务中交换结构化和类型化的信息。...通过深入学习和实践,开发者可以掌握如何创建、调用和维护SOAP服务,从而提升其在分布式系统中的编程能力。

    cxf-rt-bindings-soap-2.7.6.zip

    总结来说,"cxf-rt-bindings-soap-2.7.6.zip"是一个用于构建和使用SOAP Web服务的开源工具,而"text.zip,分隔标记/注释文本模型"则可能涉及到数据处理和文本分析的特定方法。这些资源结合了现代Web服务开发的关键...

    soap-api.jar和activation.jar

    在Java开发领域,`soap-api.jar` 和 `activation.jar` 是两个非常重要的库文件,尤其在处理Web服务和数据交换时。这两个JAR文件分别对应于SOAP(简单对象访问协议)API和Java Activation Framework(JAF)。以下是这...

    soap 所需全部jar包

    5. **SOAP-2**: soap-bin-2.3.1.zip包含的是SOAP库的实现,它提供了处理SOAP消息的API。这个版本的SOAP库可以帮助开发者创建、解析和处理SOAP请求和响应,支持SOAP 1.1协议。 6. **Java Management Extensions (JMX...

    easy-soap-request:小型Node.js库可简化SOAP请求

    npm install easy-soap-request 要求 Node.js&gt; = 7.6.0(异步/等待支持) 用法 Node.js const soapRequest = require ( 'easy-soap-request' ) ; const fs = require ( 'fs' ) ; // example data const url = '...

Global site tag (gtag.js) - Google Analytics