`
xzs603
  • 浏览: 32727 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

SOAP中复杂类型(JavaBean)调用实例实践

阅读更多

 

使用工具:axis-1_1

Tomcat 5.2.x

IDE: Eclipse 3.1

 

一、简单开始:

1、创建一个JavaBean     Student.java

package com.kevinGQ.service.axis.model;
 
import java.io.Serializable;
 
public class Student implements Serializable{
       private String _name;
       private String _id;
       private String _comment;
 
       public Student(){}
      
       public Student(String name, String id, String comment){
              _name = name;
              _id = id;
              _comment = comment;
       }
      
       public String getName(){
              return _name;
       }
      
       public void setName(String name){
              _name = name;
       }
      
       public String getId(){
              return _id;
       }
      
       public void setId(String id){
              _id = id;
       }
      
       public String getComment(){
              return _comment;
       }
      
       public void setComment(String comment){
              _comment = comment;
       }
}

 2、写Service程序

package com.kevinGQ.service.axis.service;
 
import com.kevinGQ.service.axis.model.Student;
 
public class GetStudentService {
       public Student getAStudent(String name){
              Student a = new Student("a","10001","I'm A");
              return a;
       }
}

 

3、部署axis及部署service

a. axis-1_1.zip中将axis-1_1/webapps/axis 文件夹拷贝到Tomcat 5.0.x/webapps/

b. 打开webapps/axis/WEB-INF/server-config.wsdd进行编辑,在<deployment>标签下插入如下片断

<service name="StudentInfoService" provider="java:RPC">
        <parameter name="className" value="com.kevinGQ.service.axis.service.GetStudentService"/>
        <parameter name="allowedMethods" value="*"/>
       <beanMapping qname="myNS:Student" xmlns:myNS="urn:StudentInfoService" languageSpecificType="java:com.kevinGQ.service.axis.model.Student"/>
 </service>

 

片断中StudentInfoService是这个web service的名字,在客户端编码的时候需要用到。

<parameter name="className" value="com.kevinGQ.service.axis.service.GetStudentService"/>

中说明了这个服务提供的类,包括package的完整类名。

<parameter name="allowedMethods" value="*"/>中说明这个服务中可供给外部调用的方法有哪些,*表示全部函数,现在也可以把*改成getAStudent.

<beanMapping qname="myNS:Student" xmlns:myNS="urn:StudentInfoService" languageSpecificType="java:com.kevinGQ.service.axis.model.Student"/>中说明对于这个JavaBean的传输需要如何对它进行serializingde-serializing,说明的目的在于绑定JavaBean的对象类别。注意标签中说明的名字空间。这个标签其实是如下标签的一个简写:

<typeMapping qname="myNs:Student" xmlns:ns="urn:StudentInfoService"
             languageSpecificType="java: com.kevinGQ.service.axis.model.Student "
             serializer="org.apache.axis.encoding.ser.BeanSerializerFactory "
             deserializer=" org.apache.axis.encoding.ser.BeanDeserializerFactory "
             encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>

 

 

c. 把编译好的Student.class  GetStudentService.class(在它们各自的包内) 放到axis/WEB-INF/classes/.

 

4、启动Tomcat, 访问http://localhost:8080/axis/admin.html,查看你部署的服务

 

5、编写客户端

我是在Eclipse里完成代码的编写,编译及运行需要把axis-1_1/lib/ 除了axis_ant.jar7jar文件导入到classpath.

package com.kevinGQ.service.axis.client;
 
import java.net.URL;
 
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
 
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
import org.apache.axis.encoding.ser.BeanSerializerFactory;
 
import com.kevinGQ.service.axis.model.Student;
 
public class GetAStudentClient {
       public static void main(String [] args) throws Exception
    {
              Service service = new Service();
        Call call = (Call) service.createCall();
        QName qn = new QName("urn:StudentInfoService","Student");
        call.registerTypeMapping(Student.class,qn,
                      new BeanSerializerFactory(Student.class, qn),
                            new BeanDeserializerFactory(Student.class, qn)
        );
        try{
               call.setTargetEndpointAddress(new URL("http://localhost:8080/axis/services/StudentService"));
               call.setOperationName(new QName("StudentInfoService","getAStudent"));
               call.addParameter("arg1",XMLType.XSD_STRING, ParameterMode.IN);
               call.setReturnClass(Student.class);
               Student a = (Student) call.invoke(new Object[]{"a"});
               System.out.println(a.getId());
        }catch(Exception e) {
            System.out.println( "Error : " + e.toString());
        }       
    }
}

 

红色代码部分表明任意的一个字符串,因为getAStudent方法的参数对返回的结果没有影响,这里只是象征性的传递一个参数。加粗的部分是需要在Client端说明要serializede-serializeJavaBean类别,参数的说明可参考axis api 文档。

要得到运行的结果,客户端这边需要得到Student.class文件,可是如果对于一个不在本机的服务,如何得到这个Student.class呢?——你需要阅读一下这个WebServicewsdl文档,里面有对这个JavaBean对象中各个域的说明,根据JavaBean的编码规范,你自己编写编译就得到了Student.class文件。

 

二、稍微深入

我想得到的是一个Student的数组怎么办呢?

你只有稍做修改:

1、服务端的一个新类 StudentLib.java

package com.kevinGQ.service.axis.model;
 
import java.util.ArrayList;
 
public class StudentLib {
       ArrayList studentLib = null;
      
       public StudentLib(){
              studentLib = new ArrayList();
       }
      
       public void addStudent(Student s){
              studentLib.add(s);
       }
      
       public ArrayList getStudents(String name, String id){
              ArrayList list = new ArrayList();
              for(int i = 0; i < studentLib.size(); i++){
                     if(this.get(i).getName().equals(name)
                            && this.get(i).getId().equals(id)){
                                   list.add(this.get(i));
                            }
              }
              return list;
       }
      
       public Student get(int index){
              return (Student)studentLib.get(index);
       }
}

 

这个类只不过是为了实现稍微复杂点的逻辑功能而写。注意getStudents方法返回的是ArrayList类型的引用。因为SOAP中支持的数据类型包含javaArrayList,所以用这个类型会方便很多。

 

2、扩展Service程序

package com.kevinGQ.service.axis.service;
 
import java.util.ArrayList;
 
import com.kevinGQ.service.axis.model.Student;
import com.kevinGQ.service.axis.model.StudentLib;
 
public class GetStudentService {
       public ArrayList getStudent(){
              ArrayList students = new ArrayList();
              Student a = new Student("a","10001","I'm A");
              Student b = new Student("a","10002","I'm B");
              Student c = new Student("a","10001","I'm A, I'm not C");
              StudentLib lib = new StudentLib();
              lib.addStudent(a);
              lib.addStudent(b);
              lib.addStudent(c);
             
              students = lib.getStudents("a","10001");
              return students;
       }
       public Student getAStudent(String name){
              Student a = new Student("a","10001","I'm A");
              return a;
       }
}

 

加粗的地方为添加的新的方法,我们接着要在服务端描述它

 

3、部署service

把刚才添加到server-config.wsdd的那个片断再拿出来看看,好像不用修改(只要你在allowedMethods的地方表明允许暴露的方法的是*

 

4、写个客户端看看

package com.kevinGQ.service.axis.client;
 
import java.net.URL;
import java.util.ArrayList;
 
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
import org.apache.axis.encoding.ser.BeanSerializerFactory;
 
import com.kevinGQ.service.axis.model.Student;
 
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
 
public class GetStudentClient {
      
       public static void main(String [] args) throws Exception
    {
              Service service = new Service();
        Call call = (Call) service.createCall();
        QName qn = new QName("urn:StudentInfoService","Student");
        call.registerTypeMapping(Student.class,qn,
                      new BeanSerializerFactory(Student.class, qn),
                            new BeanDeserializerFactory(Student.class, qn));
        try{
               call.setTargetEndpointAddress(new URL("http://localhost:8080/axis/services/StudentService"));
               call.setOperationName(new QName("StudentInfoService","getStudent"));
;
               call.setReturnClass(ArrayList.class);
               ArrayList result = (ArrayList) call.invoke(new Object[]{});
               for(int i = 0; i < result.size(); i++){
                      Student stu = (Student)result.get(i);
                      System.out.println(stu.getName()+" "+stu.getId()+" "+stu.getComment());
               }
        }catch(Exception e) {
            System.out.println( "Error : " + e.toString());
        }       
    }
}

 

和第一个客户端很相似吧。注意把Call返回的类型设为ArrayList,看代码中加粗部分!

结果输出了2条记录,和预期的一样。要不,你试试。

 

 

附:文中描述服务的wsdl.xml

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://localhost:8080/axis/services/StudentInfoService" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://localhost:8080/axis/services/StudentInfoService" xmlns:intf="http://localhost:8080/axis/services/StudentInfoService" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns1="urn:StudentInfoService" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <wsdl:types>
    <schema targetNamespace="urn:StudentInfoService" xmlns="http://www.w3.org/2001/XMLSchema">
      <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
      <complexType name="Student">
         <sequence>
           <element name="comment" nillable="true" type="xsd:string"/>
           <element name="name" nillable="true" type="xsd:string"/>
           <element name="id" nillable="true" type="xsd:string"/>
         </sequence>
      </complexType>
    </schema>
  </wsdl:types>
  <wsdl:message name="getAStudentRequest">
    <wsdl:part name="name" type="xsd:string"/>
  </wsdl:message>
  <wsdl:message name="getAStudentResponse">
    <wsdl:part name="getAStudentReturn" type="tns1:Student"/>
  </wsdl:message>
  <wsdl:message name="getStudentResponse">
    <wsdl:part name="getStudentReturn" type="soapenc:Array"/>
  </wsdl:message>
  <wsdl:message name="getStudentRequest">
  </wsdl:message>
  <wsdl:portType name="GetStudentService">
    <wsdl:operation name="getStudent">
      <wsdl:input message="impl:getStudentRequest" name="getStudentRequest"/>
      <wsdl:output message="impl:getStudentResponse" name="getStudentResponse"/>
    </wsdl:operation>
    <wsdl:operation name="getAStudent" parameterOrder="name">
      <wsdl:input message="impl:getAStudentRequest" name="getAStudentRequest"/>
      <wsdl:output message="impl:getAStudentResponse" name="getAStudentResponse"/>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="StudentInfoServiceSoapBinding" type="impl:GetStudentService">
    <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="getStudent">
      <wsdlsoap:operation soapAction=""/>
      <wsdl:input name="getStudentRequest">
        <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://service.axis.service.kevinGQ.com" use="encoded"/>
      </wsdl:input>
      <wsdl:output name="getStudentResponse">
        <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost:8080/axis/services/StudentInfoService" use="encoded"/>
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="getAStudent">
      <wsdlsoap:operation soapAction=""/>
      <wsdl:input name="getAStudentRequest">
        <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://service.axis.service.kevinGQ.com" use="encoded"/>
      </wsdl:input>
      <wsdl:output name="getAStudentResponse">
        <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost:8080/axis/services/StudentInfoService" use="encoded"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="GetStudentServiceService">
    <wsdl:port binding="impl:StudentInfoServiceSoapBinding" name="StudentInfoService">
      <wsdlsoap:address location="http://localhost:8080/axis/services/StudentInfoService"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

 

 

分享到:
评论

相关推荐

    04.使用CXF处理JavaBean式的复合类型和List集合类型的形参和返回值

    在本文中,我们将深入探讨如何使用Apache CXF框架来处理JavaBean式的复合类型以及List集合类型的参数和返回值。CXF是一个开源的、强大的Web服务框架,它支持多种Web服务标准,包括SOAP、RESTful等,并且允许开发者以...

    WebService之AXIS传递javabean.7z

    5. **调用Web服务**:在客户端,你可以创建javabean实例,设置其属性,然后通过生成的stub调用Web服务方法,将javabean作为参数传递。服务端接收到请求后,会解析XML并还原javabean,执行相应业务逻辑,最后将结果...

    Enterprise JavaBean 3.0 中文版

    通过JAX-WS,EJB可以直接转换为Web服务,同时也可以调用外部的SOAP或RESTful Web服务。 综上所述,Enterprise JavaBean 3.0 提供了一套全面的企业级应用开发框架,通过简化API、注解驱动和强大的服务支持,极大地...

    h_JAVA 2应用编程150例.rar

    很多很好的一些例子. 第1章 Java图形用户界面编程 1 实例1 布局管理 2 实例2 设计软件启动界面 9 实例3 实现多色窗口 11 实例4 切分窗口 13 实例5 丰富多彩的按钮 15 ...实例150 构造Jsp/javabean开发和发布环境 537

    用java调用webservices的三种方式

    - 定义了XML数据类型与Java数据类型之间的映射规则,包括简单的数据类型、复杂的结构体以及数组等。 - 规范了服务器端的编程模型及API,确保其与Web Services Interoperability organization (WS-I) Basic Profile...

    Java编程中使用动态代理实现AOP功能(附项目设计实例)

    在该项目中,需要在调用本地方法前后进行JavaBean的初始化和日志记录。由于SOAP服务端的代码是自动生成的,当增加新的功能需求时,需要对每个方法进行修改,这导致了大量的重复代码。为了解决这个问题,引入了动态...

    Axis2实用教程(入门教程包含实例)

    2. **复合类型数据的传递**: Axis2支持复杂的数据类型传输,如自定义对象,这在处理业务逻辑时非常有用。 3. **services.xml文件发布WebService**: 通过services.xml文件,可以方便地管理和配置服务,包括服务的...

    用java调用ebservices三种方式.doc

    JSR 109则是J2EE环境中的Web服务编程模型和架构标准,它建立在SOAP 1.1和WSDL 1.1之上,定义了J2EE应用服务器中的部署模型。JSR 109与JAX-RPC紧密配合,为J2EE环境下的Web服务客户端和服务器端提供了一致的框架。 ...

    WebService开发实例图解教程

    - 调用服务:客户端通过SOAP请求调用服务,解析返回的XML响应。 3. **WebLogic Server与WebService** - WebLogic是Oracle公司的一个企业级应用服务器,支持WebService的发布和消费。 - 在WebLogic中发布...

    用XFire开发Webservice简单实例

    在这个实例中,`MyEclipse下XFire开发Webservice实例.doc`文件应该包含了详细的步骤说明和源码示例,帮助读者更好地理解和实践这个过程。通过阅读文档和动手操作,开发者可以快速掌握XFire的使用技巧,从而在实际...

    axis2_webservice

    本文主要介绍如何使用Axis2.x进行Web服务的开发,包括基本的准备、实例、复杂类型处理、会话管理、发布与调用方法、多服务会话控制、Spring集成、异步调用以及使用SoapMonitor监控请求和响应。 一、开发准备 在...

    cxf开发实例

    通过JavaBean或JAXB(Java Architecture for XML Binding)来定义数据模型,然后在服务接口中使用这些类型作为参数或返回值。CXF会自动处理对象到XML和XML到对象的转换。 ### 五、CXF与Spring的整合 CXF可以轻松地...

    J2EE 全实例教程(CHM格式)

    教程可能会介绍如何创建、配置和使用JavaBean,以及在JSP中通过EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)调用Bean的方法。 4. **EJB(Enterprise JavaBeans)**:EJB是J2EE的核心...

    java-调用Webservice接口.pdf

    Java调用WebService接口是开发中常见的一种交互方式,主要用于不同系统间的通信。本文将详细介绍两种在Java中调用WebService的方法。 ### 方法一:使用JDK Web服务API JDK提供了基本的Web服务支持,可以创建和消费...

    java应用软件程序设计

    这里边包括:第1章 Java图形用户界面编程 1 实例1 布局管理 2 实例2 设计软件启动界面 9 实例3 实现多色窗口 11 实例4 切分窗口 13 实例5 丰富多彩的按钮 15 实例6 在窗口中显示背景图 16 实例...

    WebService大讲堂之Axis2,多个实例

    另外,Axis2还可以将Spring框架管理的JavaBean发布为WebService,这为Java开发者提供了更多的便利性和灵活性。在异步调用方面,Axis2提供了异步调用WebService的能力,允许客户端异步发送请求,提高系统效率和响应...

Global site tag (gtag.js) - Google Analytics