从客户端除了传递字符串以外还可以传递复杂对象(对象必须序列化了),List,Map,数组和文件。

(1)定义一个对象实现了serializable 接口package cn.com.chenlly.ssh.webservice.axis;

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

public class Address implements Serializable { //复杂类型的类要序列化  private Integer identifier;  private String address;  private String city;  private String province;  private String country;  private String []array;   //javabean里的复杂类型  private List list;(基本类型)  private boolean isExst;   //constructor public Address(){   list = new ArrayList();   list.add(1);   list.add(2);   list.add(3); } public Integer getIdentifier() {  return identifier; }

public void setIdentifier(Integer identifier) {  this.identifier = identifier; }

public String getAddress() {  return address; }

public void setAddress(String address) {  this.address = address; }

public String getCity() {  return city; }

public void setCity(String city) {  this.city = city; }

public String getProvince() {  return province; }

public void setProvince(String province) {  this.province = province; }

public String getCountry() {  return country; }

public void setCountry(String country) {  this.country = country; }

public String[] getArray() {  return array; }

public void setArray(String[] array) {  this.array = array; }

public List getList() {  return list; }

public void setList(List list) {  this.list = list; }

public boolean isExst() {  return isExst; }

public void setExst(boolean isExst) {  this.isExst = isExst; }}

(2)定义server-config.wsdd文件

//响应时使用上面的handler     //请求时使用上面的handler

//主要是标签中名字空间和qname写法第一个你自定义的命名空间和第二个节点本地部分会组成一个新的QName。

生成的WSDL有如下一段- -                       这个新的schema就是把对象序列化以后生成了xml流文件。

(3) webService 服务方法public Address dealAddress(Address address) {   System.out.println("service exst:"+address.isExst());   //客户端对象传递过来设置标志为true   address.setExst(true);   return address;}

(4) 客户端package cn.com.chenlly.ssh.webservice.axis;

import java.util.ArrayList;import java.util.List;

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.ser.BeanDeserializerFactory;import org.apache.axis.encoding.ser.BeanSerializerFactory;

public class WSTestServiceClient { public static void main(String[] args) {  Service service = new Service();  try {   Call call = (Call) service.createCall();   String url = "   call.setTargetEndpointAddress(new java.net.URL(url));                        //定义对象   Address address = new Address();   address.setIdentifier(1);   address.setProvince("湖南");   address.setCity("长沙");   address.setExst(false);

QName qn = new QName("urn:AddressManager", "Address");//第一个参数名字空间URI,第二个参数本地部分,注意这两部分在server-config.wsdd文件中标签beanMapping配置   call.registerTypeMapping(Address.class, qn,     new BeanSerializerFactory(Address.class, qn),//序列化     new BeanDeserializerFactory(Address.class, qn));     call.setOperationName(new QName(url,"dealAddress"));     call.addParameter("arg0", qn, ParameterMode.IN);//定义一个参数类型,如果是String类型的参数可以不需要这句话   call.setReturnClass(Address.class);//指定返回类型     Address result = (Address) call.invoke(new Object[]{address});//这里传递给service的是一个对象   System.out.println(result.isExst());  } catch (Exception e) {   e.printStackTrace();  } }}//在服务器端打印的isExst()方法是false;然后设置address的exst为true;最后又传送到客户端打印的result结果为true

需要说明的是:

1 如果服务中不需要传递对象,是不需要对的.而且這里面的对象必须要是符合javaBean模式的对象,最起码要符合get/set方法對.

2 qname xmlns:xx languageSpecificType分別用于指定参数对象的命名空间.用于在客戶端调用.

二、开发service服务器端的service为普通的java类:com.hnisi.axis.BookOrder

public class BookOrder {public String getName(String name) {System.out.println("start execute ...");return "book name: " + name;}

public Book setPrice(Book book){book.setPrice(10);return book;}}

com.hnisi.axis.Book为简单的值对象,包含两个属性name,price。

三、发布service(将会错误)1、手工修改server-config.wsdd文件(在已有server-config.wsdd文件的情况下)添加service:

原因:

由于SOAP中值的类型就是XML Schema中的基本类型,默认只支持简单类型和数组。所以在进行对象传递的过程中,需要进行序列化和反序列化。

Axis为提供了大量的序列化/反序列化器,能够基本满足大部分应用:1、基本类型,如int、double等,转换成基本对象类型java.lang.Integer、java.lang.Double。2、常用集合对象的转换java.util.List ==> java.lang.Object[]java.util.Vector  ==> java.util.Vector3、普通JavaBean(简单值对象)的序列化和反序列化首先,在web service部署端,修改server-config.wsdd文件,在具体的service配置,增加如下代码:languageSpecificType属性指定JavaBean类文件位置,qname属性指定JavaBean类的名字。当然,一个service可以绑定多个bean对象。

其次,在客户端,完成对象的注册。对于调用方法一中,需要新增如下代码以完成注册:QName qn = new QName("urn:BeanService","Book");call.registerTypeMapping(Book.class, qn,new BeanSerializerFactory(Book.class, qn),                    new BeanDeserializerFactory(Book.class, qn));而对于调用方法二,重新根据wsdl生成java代码,已完成必要的对象注册过程,CallService中可以直接传递Book对象了。

1)axis1.2内在支持的几种对象类型。          这几种内在支持的对象包括:          java基本类型 : int, float,,,,          基本类型包装类 : Integer, Float, Long...          还有String, Date, Calendar, BigDecimal, BigInteger, List, Map.     凡是这些内在支持的对象, 不管他们作为某个Service的input 还是 output, 我们在服务端的axis1.2的WEB-INF/server-config.wsdd的该Service的定义中都不需要加入 或者是的声明。

2)简单的javabean对象类型。所有的field都是上面提到的基本类型

由于MyBean是一个自定义的JavaBean对象, 所以在server-config.wsdd中就必须加上的声明, 让axis知道怎么把request中xml数据deserialize为MyBean对象,又如何把MyBean对象serialize为xml数据作为response.用wtp自动为JavaInputService生成的wsdl中, MyBean是作为一个complexType在wsdl中定义的。

3)复杂一点的JavaBean对象。        比如JavaBean对象中的一些field又是自定义的JavaBean,  这种情况下, wsdl中生成的complextype会有多个(webservice接口最好不用定义多层的结构),而在wsdd定义的也会有多个, axis1.2支持起来都是易如反掌。

4)java中的数组

在webservice中把List, Map作为service的input, output的做法都是不可行的。至少在jdk1.4的版本中是这样的。

要注意的是,数组参数在server-config.wsdd中需要配置

似乎List, Map的问题用数组就可以解决了。事实上就是如此。但是还得注意的是:   javabean里边也不能含有List?. 如果MyBean跟其它某个对象是1:n的关系,那么也只能写成数组的形式,而不能是List的形式

例子:

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

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

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

中说明对于这个JavaBean的传输需要如何对它进行serializing和de-serializing,说明的目的在于绑定JavaBean的对象类别。注意标签中说明的名字空间。这个标签其实是如下标签的一个简写:

Java代码

1

2                      languageSpecificType="java: com.kevinGQ.service.axis.model.Student "

3                      serializer="org.apache.axis.encoding.ser.BeanSerializerFactory "

4                      deserializer=" org.apache.axis.encoding.ser.BeanDeserializerFactory "

5                      encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>

特别说明:

A、 如果你调用的方法有返回值,一定要设置返回值的类型。call.setReturnClass

B、 如果你调用的方法有参数,一定要设置参数的类型call.addParameter

C、 记得添加wsdl4j.jar,序列化转换的时候需要用到,否则会出现找不到类型异常

如:

call.addParameter("i", XMLType.XSD_INT, ParameterMode.IN); call.setReturnClass(User[].class);

java webservice 常用_复杂对象类型的WebService高级部分相关推荐

  1. Java操作Redis存储HashMap对象类型数据

    背景描述 关于JAVA去操作Redis时,如何存储一个对象的数据,这是大家非常关心的问题,虽然官方提供了存储String,List,Set等等类型,但并不满足我们现在实际应用.存储一个对象是非常常见的 ...

  2. 怎样才算高级Java开发工程师_怎样才能成为一名高级java软件工程师?

    从低级java程序员专注java技术路线发展,可以成为一个令人敬仰的高级java工程师,当然java高级工程师也不是那么容易练就的,java程序员该朝哪些方向努力向高级java工程师发展?怎样成为一个 ...

  3. lambda表达式java项目常用_一文带你彻底搞懂Lambda表达式

    1. 为什么使用Lambda表达式 Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风 ...

  4. java 映射类_将数据库类型映射到具体的Java类

    解 答案比使用getMetaData方法更复杂,因为getMetaData方法返回的整数类型和完整的类名没有直接映射.此解决方案需要两段代码: >实现一个方法来获取java.sql.Types常 ...

  5. java cxf 工具_利用CXF工具开发WebService接口

    简单记录一下webservice接口开发以便供以后参考: 一.根据需求编写wsdl文件 WSDL的文件格式和语法我就不多说了,到网上百度一下,或者到W3CSchool去学习都可以,语法很简单,下面是我 ...

  6. 三、 复杂对象类型的WebService

    1.这次我们编写复杂点的WebService方法,返回的数据是我们定义属性带getter.setter方法JavaBean,一维数组.二维数组等. 看代码: 代码 上面的WebService服务分别是 ...

  7. java perl 正则表达式_来自Perl类型正则表达式的Java正则表达式

    我正在尝试从日志文件中的字符串时间戳中提取小时,分钟,秒和纳秒.这是我正在测试的输入字符串: SOME_TEXT,+09:30:01.040910105,SOME_TEXT,SOME_TEXT,SOM ...

  8. 易语言webservice接口_易语言语音通知webservice接口

    JAVA代码示例 import java.io.IOException; import org.apache.commons.httpclient.HttpClient; import org.apa ...

  9. java框架核心技术_你必须掌握的 21 个 Java 核心技术!(干货)

    点击上方"java进阶架构师",选择右上角"置顶公众号" 20大进阶架构专题每日送达 51闲来无事,师长一向不(没)喜(有)欢(钱)凑热闹,倒不如趁着这时候复盘 ...

最新文章

  1. python windows编程_在Windows下配置Python编程学习环境
  2. sklearn.inspection.permutation_importance 衡量特征重要性的方法比随机森林自带的rf.feature_importance 如何
  3. WINCE编译类型DEBUG/RELEASE的问题
  4. 【人物】互联网教父KK:对未来要有自信,未来是我们的
  5. linux运行core控制台程序,VisualStudioCode创建的asp.net core控制台程序部署到linux
  6. java错误1601解决方法,求助解决错误
  7. client mac addr不能开机进不去系统_用asp.net core结合fastdfs打造分布式文件存储系统
  8. java中 下列不合法的语句_在Java中,下列( )是不合法的赋值语句。_学小易找答案...
  9. 字符的用意_北辰的符号意义 阅读答案
  10. qt布局调用自定义函数_QT 自定义函数 自定义信号和槽
  11. 土豆视频ipad 5.0 客户端
  12. html如何设置自动点击事件,html 如何设置打开网页时自动触发按钮的单击事件
  13. C++银行账户管理程序1
  14. ViPER4Android FX 2.5,利用ViPER4Android FX音效驱动提升耳机音质
  15. win10下装python
  16. R语言-回归系数的极大似然估计
  17. OpenCV总结6——stitcher
  18. # Ubuntu执行sudo apt-get update提示:E: 仓库 “https://mirrors.ustc.edu.cn/ubuntu focal Release” 没有 Release
  19. 网易面试一面【游戏测试工程师】
  20. ARChon 分析之七:启动流程分析

热门文章

  1. 编码压缩新思路:面向QoE的感知视频编码
  2. 《Hadoop权威指南》第二章 关于MapReduce
  3. 10个程序员才懂的灯谜,你能猜对几个?
  4. ngx_http_discard_request_body
  5. OpenShift安装
  6. RunJar是什么进程?
  7. 【echart数组数据】echarts两条或两条以上x轴不同的线合并x轴 含有不连续数据
  8. Jquery中的$(document).ready()详解
  9. 【PAT甲级 删除字符串中的指定字符】1050 String Subtraction (20 分) C++
  10. CentOS 6使用rpm方式安装JDK8