JAVA调用webservice,当你刚开始接触的时候你会觉得它是一个恶梦,特别是没有一个统一的标准实现,比起.net的那些几步就可以完成的webservice实现,我们看着JAVA的实现真是伤心啊。但就算是伤心,我们也还是要完成的。JAVA也不乏比较好的实现,如xfire,jersey,CXF。 这里我们就一起来看一下xfire的实现。

1)首先,当然是要下包啦,这个普通人都知道。http://xfire.codehaus.org/Download可以到这里去下,可以下all也可以下distribution。但建议还是下all的,免得一堆奇怪的问题搞得你一点信心都没了。

包弄下来了那么怎么办呢?放进项目里啊。貌似废话,但很多人就是不知道下下来要干什么用。

建一个新项目,比较我的是xfireWebservice,这里当然是建web项目啦。

我这里是把它所有的包都放到这里面了,毕竟我们写例子,就没必要挑三拣四了,随便点吧,如果想看看异常信息的朋友可以不把全部放进去,慢慢地加入,以后遇到错误也好排除,但我们这里就不那么做了,毕竟一般缺少什么类那些的异常没什么难看的,大家可以自己排除。

2)我们首先来了解一下xfire与其他webservice框架的不同,它最大的不同之处在于它需要一个接口,而且如果需要用xfire来调用相应的webservice必须知道接口的定义,感觉这里有点限制了。但除了这点,xfire调用webservice,那是相当的方便,就跟调用本地方法一样。我们直接来看例子:

首先是最重要的接口:

public interface IReaderService {

public Reader getReader(String name,String password);

public List getReaders();

}

有接口,当然也要有实现类,不然接口就没什么意义了。

public class ReaderService implements IReaderService{

public Reader getReader(String name,String password) {

return new Reader(name,password);

}

public List getReaders(){

List readerList = new ArrayList();

readerList.add(new Reader("shun1","123"));

readerList.add(new Reader("shun2","123"));

return readerList;

}

}

也看一下JAVABEAN,Reader类:

public class Reader{

private static final long serialVersionUID = 1L;

private String name;

private String password;

public Reader(){}

public Reader(String name,String password) {

this.name = name;

this.password = password;

}

//Get/Set方法省略

public String toString(){

return "Name:"+name+",Password:"+password;

}

}

注意,我们这里的Reader类实现了Serializable接口,为什么呢?这里,首先我们需要了解webservice的原理,对于JAVA来讲,如果我们需要在互联网上传对象,很多人当然会想到序列化,对了,这里就是序列化,因为我们需要把reader作为参数来传递。这在以前的版本中是需要强制实现,否则会报错,但现在的最新的版本(其实最新的也是07年的,因为xfire已经停止开发,被apache合并为CXF项目,这个我们之后再讲)已经不需要了,至于是用什么方式实现的,我们这里暂时不深究,因为它已经被合并到CXF中,我们如果要深入学习,应该学习CXF较好。

3)当我们完成上面的接口和JAVABEAN的编写后,很多人会问,我看很多webservice都会有WSDL文件,那你这个怎么来的?在讲这个之前,我们来讨论一下什么是WSDL。也许很多公司提供的接口都还是只是一个HTTP地址,返回XML这样的格式,我们的也是。这有一个好处,也有一个坏处。好处是我们开发的难度小了,而坏处是我们需要提供给用户一堆说明文件,每个返回的XML标签是什么意思,这倒也没啥,但就是比较烦而已。而webservice呢,坏处就是我们开发的东西稍微多了点,而好处是我们不用再写那么多说明文件,因为有一个统一的说明,叫WSDL,这个是webservice的说明文档,是统一的,无论什么语言都一样,所以不存在谁看不懂的问题。

而这里,当我们部署完成xfire后,它就可以帮我们生成WSDL文件。

问题是怎么部署,这个其实也简单。我们在src目录下新建一个文件夹META-INF,再建它的一个字文件夹xfire,里面建立文件services.xml。之后的结构如下:

有人会问为什么要建到src目录下,其实不是规定建到这里的,但因为我们需要让开发工具帮我们自己部署这几个文件,所以我们放到这里,eclipse就可以帮我们自己部署到tomcat或者其他的容器中。注意,这个文件所在文件夹层次是固定的,不可以修改。

我们直接看一下servics.xml:

readerService

http://test/HelloService

com.xfire.servlet.IReaderService

com.xfire.servlet.ReaderService

看着注释一般都没问题的。

4)很多人以为这样就行了,不,还没行,你指定了这个,那别人怎么访问呢。怎么把相应的请求转发到xfire那里,让它进行处理呢。这里又需要修改web.xml了。

修改后如下:

xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"

id="WebApp_ID" version="3.0">

XFireServlet

org.codehaus.xfire.transport.http.XFireConfigurableServlet

XFireServlet

/services/*

其实也就是添加了一个servlet和对应的mapping。接下来,我们在浏览器上直接输入:

http://localhost:8080/xfireWebService/services/readerService?wsdl

我们可以看到:

这里显示的就是wsdl,它会显示我们定义的方法,返回的类型。后面有对WSDL的讲解。

5)上面四步完成后,我们就完成了webservice的部署了。别人就可以调用相应的webservice来访问我们的方法了。下面我们就用xfire提供的client来访问一下我们刚才发布的webservice:

public class ReaderClient {

public static void main(String[] args) {

//这里是创建一个service,需要传入一个接口类,因为我们后面必须调用相应的接口方法

Service srcModel = new ObjectServiceFactory().create(IReaderService.class);

//代理工厂,这里是为了后面创建相应的接口类

XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());

//webservice地址,不需要加wsdl

String readerServiceUrl = "http://localhost:8080/xfireWebService/services/readerService";

try {

//利用工厂返回相应的接口类

IReaderService readerService = (IReaderService)factory.create(srcModel,readerServiceUrl);

Reader reader = readerService.getReader("shun","123");

System.out.println(reader);

} catch (MalformedURLException e) {

e.printStackTrace();

}

}

}

这样,我们看到输出结果为:

wsdl文件结构分析

WSDL (Web Services Description Language,Web服务描述语言)是一种XML Application,他将Web服务描述定义为一组服务访问点,客户端可以通过这些服务访问点对包含面向文档信息或面向过程调用的服务进行访问(类似远程过程调用)。WSDL首先对访问的操作和访问时使用的请求/响应消息进行抽象描述,然后将其绑定到具体的传输协议和消息格式上以最终定义具体部署的服务访问点。相关的具体部署的服务访问点通过组合就成为抽象的Web服务。 本文将详细讲解WSDL文档的结构,并分析每个元素的作用。

一:WSDL定义

WSDL是一个用于精确描述Web服务的文档,WSDL文档是一个遵循WSDL XML模式的XML文档。WSDL 文档将Web服务定义为服务访问点或端口的集合。在 WSDL 中,由于服务访问点和消息的抽象定义已从具体的服务部署或数据格式绑定中分离出来,因此可以对抽象定义进行再次使用:消息,指对交换数据的抽象描述;而端口类型,指操作的抽象集合。用于特定端口类型的具体协议和数据格式规范构成了可以再次使用的绑定。将Web访问地址与可再次使用的绑定相关联,可以定义一个端口,而端口的集合则定义为服务。

一个WSDL文档通常包含7个重要的元素,即types、import、message、portType、operation、binding、 service元素。这些元素嵌套在definitions元素中,definitions是WSDL文档的根元素。文章的下一部分将会详细介绍WSDL 的基本结构。

二:WSDL的基本结构--概述

如第一部分最后描述的那样,一个基本的WSDL文档包含7个重要的元素。下面将分别介绍这几个元素以及他们的作用。

WSDL 文档在Web服务的定义中使用下列元素:

·                Types - 数据类型定义的容器,它使用某种类型系统(一般地使用XML Schema中的类型系统)。

·                Message - 通信消息的数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构。

·                Operation - 对服务中所支持的操作的抽象描述,一般单个Operation描述了一个访问入口的请求/响应消息对。

·                PortType - 对于某个访问入口点类型所支持的操作的抽象集合,这些操作可以由一个或多个服务访问点来支持。

·                Binding - 特定端口类型的具体协议和数据格式规范的绑定。

·                Port - 定义为协议/数据格式绑定与具体Web访问地址组合的单个服务访问点。

·                Service- 相关服务访问点的集合。

WSDL的xml schema可以参照如下网址:http://schemas.xmlsoap.org/wsdl/

三:WSDL的基本结构--详述

本节将通过一个例子详细描述WSDL文档每个元素的作用。下面一个例子是一个简单的WSDL文档的内容,该文档的产生可以参见我的另外一篇文章:xfire开发实例--HelloWorld篇 。

一个简单的Web Service的WSDL文档,该服务支持名为sayHello的唯一操作,该操作通过在http上运行SOAP协议来实现的。该请求接受一个字符串name,经过处理后返回一个简单的字符串。文档如下:

targetNamespace="http://com.liuxiang.xfireDemo/HelloService"

xmlns:tns="http://com.liuxiang.xfireDemo/HelloService"

xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"

xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"

xmlns:xsd="http://www.w3.org/2001/XMLSchema"

xmlns:soapenc11="http://schemas.xmlsoap.org/soap/encoding/"

xmlns:soapenc12="http://www.w3.org/2003/05/soap-encoding"

xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/"

xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">

attributeFormDefault="qualified" elementFormDefault="qualified"

targetNamespace="http://com.liuxiang.xfireDemo/HelloService">

name="name" nillable="true" type="xsd:string" />

name="out" nillable="true" type="xsd:string" />

binding="tns:HelloServiceHttpBinding">

location="http://localhost:8080/xfire/services/HelloService" />

types元素使用XML模式语言声明在WSDL文档中的其他位置使用的复杂数据类型与元素;

import元素类似于XML模式文档中的import元素,用于从其他WSDL文档中导入WSDL定义;

message元素使用在WSDL文档的type元素中定义或在import元素引用的外部WSDL文档中定义的XML模式的内置类型、复杂类型或元素描述了消息的有效负载;

portType元素和operation元素描述了Web服务的接口并定义了他的方法。portType元素和operation元素类似于java接口中定义的方法声明。operation元素使用一个或者多个message类型来定义他的输入和输出的有效负载;

Binding元素将portType元素和operation元素赋给一个特殊的协议和编码样式;

service元素负责将Internet地址赋给一个具体的绑定;

1、definitions元素

所有的WSDL文档的根元素均是definitions元素。该元素封装了整个文档,同时通过其name提供了一个WSDL文档。除了提供一个命名空间外,该元素没有其他作用,故不作详细描述。

下面的代码是一个definitions元素的结构:

targetNamespace="http://com.liuxiang.xfireDemo/HelloService"

xmlns:tns="http://com.liuxiang.xfireDemo/HelloService"

xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"

xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"

xmlns:xsd="http://www.w3.org/2001/XMLSchema"

xmlns:soapenc11="http://schemas.xmlsoap.org/soap/encoding/"

xmlns:soapenc12="http://www.w3.org/2003/05/soap-encoding"

xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/"

xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">

2、types元素

WSDL采用了W3C XML模式内置类型作为其基本类型系统。types元素用作一个容器,用于定义XML模式内置类型中没有描述的各种数据类型。当声明消息部分的有效负载时,消息定义使用了在types元素中定义的数据类型和元素。在本文的WSDL文档中的types定义:

attributeFormDefault="qualified" elementFormDefault="qualified"

targetNamespace="http://com.liuxiang.xfireDemo/HelloService">

name="name" nillable="true" type="xsd:string" />

name="out" nillable="true" type="xsd:string" />

上面是数据定义部分,该部分定义了两个元素,一个是sayHello,一个是sayHelloResponse:

sayHello:定义了一个复杂类型,仅仅包含一个简单的字符串,将来用来描述操作的参入传入部分;

sayHelloResponse:定义了一个复杂类型,仅仅包含一个简单的字符串,将来用来描述操作的返回值;

3、import元素

import元素使得可以在当前的WSDL文档中使用其他WSDL文档中指定的命名空间中的定义元素。本例子中没有使用import元素。通常在用户希望模块化WSDL文档的时候,该功能是非常有效果的。

import的格式如下:

必须有namespace属性和location属性:

namespace属性:值必须与正导入的WSDL文档中声明的targetNamespace相匹配;

location属性:必须指向一个实际的WSDL文档,并且该文档不能为空。

4、message元素

message元素描述了Web服务使用消息的有效负载。message元素可以描述输出或者接受消息的有效负载;还可以描述SOAP文件头和错误detail元素的内容。定义message元素的方式取决于使用RPC样式还是文档样式的消息传递。在本文中的message元素的定义,本文档使用了采用文档样式的消息传递:

该部分是消息格式的抽象定义:定义了两个消息sayHelloResponse和sayHelloRequest:

sayHelloRequest:sayHello操作的请求消息格式,由一个消息片断组成,名字为parameters,元素是我们前面定义的types中的元素;

sayHelloResponse:sayHello操作的响应消息格式,由一个消息片断组成,名字为parameters,元素是我们前面定义的types中的元素;

如果采用RPC样式的消息传递,只需要将文档中的element元素应以修改为type即可。

5、portType元素

portType元素定义了Web服务的抽象接口。该接口有点类似Java的接口,都是定义了一个抽象类型和方法,没有定义实现。在WSDL中, portType元素是由binding和service元素来实现的,这两个元素用来说明Web服务实现使用的Internet协议、编码方案以及 Internet地址。

一个portType中可以定义多个operation,一个operation可以看作是一个方法,本文中WSDL文档的定义:

java xfire指定参数名_Java编程中使用XFire框架调用WebService程序接口相关推荐

  1. java xfire指定参数名_Java如何获取方法参数具体名称?这是个好问题!

    原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处. 默认情况下,我们是无法获取方法中参数名称的.通过反射机制,也只能得到参数的顺序以及一些没有意义的变量:arg0.arg1等 ...

  2. java xfire指定参数名_xfire中自定义参数名

    近期在做多个应用交互系统,其中数据交互采用了webservice的方式,说到webservice项目中不得不用到xfire这个框架,有了它我们几乎不用写代码,就可以很快速的创建自己的webservic ...

  3. java命令行参数工具_Java方法中的参数太多,第8部分:工具

    java命令行参数工具 在我的系列文章的前七篇文章中,有关处理Java方法中期望的参数过多的内容集中在减少方法或构造函数期望的参数数量的替代方法上. 在本系列的第八篇文章中,我将介绍一些工具,这些工具 ...

  4. java xfire指定参数名_XFire绑定Aegis自定义友好参数(复杂对象)

    1.方法名的首字母没有大写: 2.入参的首字母没有大写: 3.属性的首字母没有大写: 说明:由于XFire会自动生成WSDL文件,所以对于其格式有时候需要规范一下,跨平台时需要根据报文格式来组装数据请 ...

  5. java反射 获取参数名_java

    传List.class即可,泛型参数在编译后会被擦除掉,无论List里面是String还是什么别的东西都不会影响获取到那个method,在invoke的时候传的参数对不上的话才会产生异常 //Test ...

  6. java编写静态工具类_Java编程中静态内部类与同步类的写法示例

    java静态内部类 将某个内部类定义为静态类,跟将其他类定义为静态类的方法基本相同,引用规则也基本一致.不过其细节方面仍然有很大的不同.具体来说,主要有如下几个地方要引起各位程序开发人员的注意. (一 ...

  7. Java调用webservice.asmx接口.

    直接上代码: 1 package utils; 2 3 import java.net.MalformedURLException; 4 import java.rmi.RemoteException ...

  8. java 反射 参数 注解_Java编程之反射中的注解详解

    "注解"这个词,可谓是在Java编程中出镜率比较高,而且也是一个老生常谈的话题.我们之前在聊Spring相关的东西时,注解是无处不在,之前我们简单的聊过一些"注解&quo ...

  9. java参数传入的是一个类名_Java编程细节——泛型的定义(类、接口、对象)、使用、继承...

    1. 设计泛型的初衷: 1) 主要是为了解决Java容器无法记忆元素类型的问题: i. 由于Java设计之初并不知道会往容器中存放什么类型的元素,因此元素类型都设定为Object,这样就什么东西都能放 ...

最新文章

  1. 重大事故!线上系统频繁卡死,凶手竟然是 Full GC ?
  2. 选择适合过一辈子的人
  3. 软件工程师不可不知的10个概念
  4. Cocos2d-xna : 横版战略游戏开发实验5 TiledMap实现关卡地图
  5. .NET Core实用技巧(一)如何将EF Core生成的SQL语句显示在控制台中
  6. 【转】C#进阶系列——WebApi 接口参数不再困惑:传参详解
  7. linux下getrlimit与sysconf函数
  8. 用ipad同步mac的屏幕
  9. coding4fun比赛总结
  10. 计算机图形学中点画线法
  11. 新时达系统服务器怎么看故障,新时达系统故障详解:38故障
  12. 蓝桥耐摔指数 JAVA暴解(摔手机)
  13. QT学习 第一章:基本对话框--利用Qt Designer设计多个UI界面
  14. SpringApplicationRunListener
  15. iOS前期OC训练OC_10Block
  16. 宗镜录略讲——南怀瑾老师——系列8
  17. 阿里云机器学习平台PAI的视频介绍(其中tensorflow高级教程有tf的代码优化讲解)
  18. 加密算法、公钥、私钥、数字签名与CA
  19. 使用php mcrypt加密解密
  20. [转]王建硕:为什么eBay在中国会失败?

热门文章

  1. uni-app小程序退出当前小程序/app
  2. 转-超级巡警清除挂马js文件
  3. mysqldump where子句使用
  4. android系统锁屏详解【android锁屏解析二】
  5. Python解题 - CSDN周赛第32期 - 运输石油(三维背包)
  6. easyExcel读取模板填充数据再从浏览器中导出下载
  7. 什么时候报空指针异常?
  8. CANoe CAPL编程之Test函数使用方法从零开始
  9. 字符串的相关操作,例子以及应用
  10. 利用Phaser开发微信小游戏(排行榜小结)