WebService 传递复杂数据类型及开发步骤(示例)


1、CXF的获取
      ---WebService的开发框架
        --- 目前版本 2.x   jar的获取
        常用的开发模式
        ---创建一个自定义的users_lib
          1、使用简单的java项目
              1、编写服务列表---主要是编写接口,服务的具体实现
              2、将服务声明为WebService服务
              3、发布编写的服务---编写发布类的方式
          2、结合标准的web项目进行开发
            1、   在web.xml文件中,加入CXF的框架信息
            2、编写WebService的服务
            3、编写CXFws服务的配置文件cxf-servlet.xml(会自动被CXFServlet进行获取操作)
    <beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:simple="http://cxf.apache.org/simple"
      xmlns:soap="http://cxf.apache.org/bindings/soap"
      xmlns:jaxws="http://cxf.apache.org/jaxws"
      xmlns:jaxrs="http://cxf.apache.org/jaxrs"
      xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://cxf.apache.org/simple
        http://cxf.apache.org/schemas/simple.xsd
        http://cxf.apache.org/bindings/soap
        http://cxf.apache.org/schemas/configuration/soap.xsd
        http://cxf.apache.org/jaxws
        http://cxf.apache.org/schemas/jaxws.xsd
        http://cxf.apache.org/jaxrs
        http://cxf.apache.org/schemas/jaxrs.xsd">
        <!-- 配置CXF的服务 -->
        <simple:server id="testservice" serviceClass="com.knowology.service.TestService" address="/test">
            <simple:serviceBean>
            <!-- 配置CXF服务的实现类 -->
                  <bean class="com.knowology.service.TestServiceImpl"></bean>
            </simple:serviceBean>
        </simple:server>
      </beans>
          3、结合Spring进行开发
                1、在web.xml中添加Spring支持
                2、创建Spring配置文件bean.xml
                3、在Spring配置文件中描述CXF方式WebService服务
                <!-- 引入CXF的支持文件,来源是CXF的jar支持-->
        <import resource="classpath:META-INF/cxf/cxf.xml"/>
        <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
        <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
  4、在Spring支持文件中描述相关的WebService服务
   
   
  了解的操作
    顺序:
      1、编写服务的接口(定义WebService的标准:参数的数量、类型、返回值的类型)
      2、编写服务接口的实现(Spring+Hibernate)
      3、考虑WebService范围的需要使用的框架技术(Axia,xfire,CXF)
      4、确定WS的发布的方式(java项目的放肆(CXF),Web方式)
        *.是否使用Spring来管理WebService的服务
      5、编写客户端的代码(java的测试)
            ----编写web站点,完成远程的调用
      Xfire做客户端---------CXF编写的服务器端
            1、wsdl文件的结构

1、传递List、Map、数组、自定义对象
    前提: JavaBean的使用--- 必须是可序列化的。
Address.java
package com.knowology.object;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class Address implements Serializable{
private static final long serialVersionUID = 1L;
//需要向webservice传递的对象,其中属性也要支持序列化
private String address;
private String city;
private String country;
private String[] array;
private List<Integer> list;
private boolean isExit;
public Address(){
list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
}
setter、getter省略...
}

server-config.wsdd
<service name="AddressManager" provider="java:RPC">
<parameter name="allowedMethods" value="*" />
<parameter name="className" value="com.knowology.object.AddressManager"/>
<!-- 定义AddressManager中使用的JavaBean的数据类型 -->
<beanMapping qname="myNSD:Address" xmlns:myNSD="urn:AddressBeanManager" languageSpecificType="java:com.knowology.object.Address"/>
</service>


ObjectClient.java

package com.knowology.object;

import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceException;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
import org.apache.axis.encoding.ser.BeanSerializerFactory;

public class ObjectClient {

public static void main(String[] args) {
getWSList();
getWSMap();
}
public static void getWSList(){
String url = "http://localhost:8080/axis/services/AddressManager";
Service service = new Service();
try {
Call call = (Call)service.createCall();
QName qName = new QName("urn:AddressBeanManager","Address");//在ws中查找Address(JavaBean)类型
//找到JavaBean的描述,将此类型JavaBean在call中进行设置(序列化、反序列化)
call.registerTypeMapping(Address.class, qName, new BeanSerializerFactory(Address.class, qName), new BeanDeserializerFactory(Address.class,qName));
call.setTargetEndpointAddress (url);
call.setOperationName(new QName("AddressManager", "getAddressList"));
call.setReturnClass(ArrayList.class);
Object[] obj = null;
ArrayList<Address> list = (ArrayList<Address>)call.invoke(obj);
System.out.println(list.size()+"n");
for(Address address:list){
System.out.println(address.getAddress());
System.out.println(address.getCity());
System.out.println(address.getCountry());
System.out.println(address.getArray());
System.out.println(address.isExit());
System.out.println(address.getList()+"n");
}
} catch (ServiceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void getWSMap(){
String url = "http://localhost:8080/axis/services/AddressManager";
Service service = new Service();
try {
Call call = (Call)service.createCall();
QName qName = new QName("urn:AddressBeanManager","Address");//在ws中查找Address(JavaBean)类型
//找到JavaBean的描述,将此类型JavaBean在call中进行设置(序列化、反序列化)
call.registerTypeMapping(Address.class, qName, new BeanSerializerFactory(Address.class, qName), new BeanDeserializerFactory(Address.class,qName));
call.setTargetEndpointAddress (url);
call.setOperationName(new QName("AddressManager", "getAddressMap"));
call.setReturnClass(HashMap.class);
Object[] obj = null;
Map<Integer,Address> map = (HashMap<Integer,Address>)call.invoke(obj);
System.out.println("n"+map.size()+"n");
for(Iterator<Integer> it = map.keySet().iterator();it.hasNext();){
Integer integer = it.next();
Address address   =map.get(integer);
System.out.println("t"+address.getAddress());
System.out.println("t"+address.getCity());
System.out.println("t"+address.getCountry());
System.out.println("t"+address.getArray());
System.out.println("t"+address.isExit());
System.out.println("t"+address.getList()+"n");
}
} catch (ServiceException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值