`

初学webservices

    博客分类:
  • ws
阅读更多
首先我把我做webservices应用的流程写出来,有个明了的过程。
 
  • 编写wsdl
  • 生成服务端框架
  • 编写功能类
  • 在服务端框架内调用功能类
  • 发布服务,从生成的deploy.wsdd文件中,拷贝service内容到server-config里面
  • 在web.xml中添加axis servlet
  • 发布工程
  • 使用soapUI测试
  • 编写客户端代码
  •  

  我解释一下,因为一般给你的需求,基本上确定你需要的功能和传入的参数、返回的参数,所以直接编写wsdl,简洁明确。以后的改动若添加功能或者修改参数,仅需要对wsdl文件进行修改。
  我使用的是Axis,在ant调用wsdl文件转化成服务框架代码。每次启动时做,就不用自己动手了。
  外面工程想调用你本地的功能,去获得相应的结果。这个功能类作用就是把传入的参数封装一下,去调用你本地已经写好的功能,然后把获得结果重新封装一下,返回客户想要的结果。功能类就是HelloHelp。
  外部调用你这边的代码,最终是通过该类HelloServiceHttpBindingImpl.java去操作,所以在这里去调用你相应的功能类的方法。因为这个类存在所以不会覆盖该类,这时大家会有疑问,如果我改动了wsdl文件,HelloServiceHttpBindingImpl的内容会变,我是不是又要手动去删除该类。其实只要你的wsdl文件中的功能名字不变,然后定义一个的封装参数类去封装你的传入参数,和传出参数,那样*SoapBindingImpl类就不会变了,你添加或修改参数,都不会影响到*SoapBindingImpl类了。 
  生成的内容里面会有deploy.wsdd文件,你要把你的服务复制到server-config文件中,这样才能发布出去。server-config你可以复制一个,然后替换掉service。这个文件基本上就只需要你动service这块内容,如有复杂点自己在慢慢该,如handler处理,在这就就不介绍了。或者你用命令java org.apache.axis.client.AdminClient deploy.wsdd 这样也可以生成server-config,记得要把axis放在容器里跑起来,然后考入到与web.xml同级目录
  你要想工程处理你的webservice,那么你必须要servlet里面加入axis servlet,这样才会处理你的webservice。
  发布工程。
  然后你就是用soapUI测试你服务端这边是否弄好了。
  最后编写客户端代码。
 
  大家可以看到最后一步操作是在客户端工程里面,前面都是在服务端工程里面。这二个不是同一个工程,服务端工程只要把功能暴露出来,其它工程就可以根据你的wsdl文件去调用。
 
  讲完整个应用的流程后,我具体介绍一下,从上面的步骤大家可以明白,我们主要做的就是2步,写wsdl和写功能类。功能类就需要你自己根据你实际项目去做,我在这里介绍一下编写wsdl。

  WSDL文件主要包含一下内容:
  Types - 数据类型定义。 也就是定义的要传入传出的参数
  Message - 通信消息的数据结构的抽象类型化定义。
  PortType - 对于某个访问入口点类型所支持的操作的抽象集合。主要就是里面定义的operation。
  Operation - 对服务中所支持的操作的抽象描述。这里就是你写你要得功能。
  Binding - 特定端口类型的具体协议和数据格式规范的绑定。通过它暴露你的功能
  Service- 相关服务访问点的集合。包含下面的port
  Port - 定义为协议/数据格式绑定与具体Web访问地址组合的单个服务访问点。访问的地址和端口号。

  举个领子可能大家明白些:

Types:
	<element name="helloRequestParameter">
		<complexType>
			<sequence>
				<element name="name" type="xsd:string" maxOccurs="1"
					minOccurs="1" />
				<element ref="ns:hello" />
			</sequence>
		</complexType>
	</element>

	<element name="hello" type="ns:Hello" />
	
	<complexType name="Hello">
		<sequence>
			<element name="name" type="xsd:string" maxOccurs="1"
				minOccurs="1" />
			<element name="str" type="xsd:string" maxOccurs="1"
				minOccurs="1" />
		</sequence>
	</complexType>

	<element name="helloResponseParameter">
		<complexType>
			<sequence>
				<element name="strOut" type="xsd:string" maxOccurs="1"
					minOccurs="1" />
			</sequence>
		</complexType>
	</element>

元素helloRequestParameter,hello,helloResponseParameter,用Axis生成java文件后,就生成helloRequestParameter,hello,helloResponseParameter 3个类。

Message:
	<message name="helloRequest">
		<part name="helloParameter" element="ns:helloRequestParameter" />
	</message>
	<message name="helloResponse">
		<part name="parameters" element="ns:helloResponseParameter" />
	</message>

这里用我的意思来讲,就是要把你传入,传出参数声明,你样你的2个参数才能使用。part里面name参数名,element参数类型。

PortType,Operation
	<portType name="HelloServicePortType">
		<operation name="sayHello">
			<input message="cs:helloRequest" />
			<output message="cs:helloResponse" />
		</operation>
	</portType>

定义了功能,sayHello方法名,input,output输入,返回参数。

Binding:
<binding name="HelloServiceHttpBinding" type="cs:HelloServicePortType">
		<SOAP:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
		<operation name="sayHello">
			<SOAP:operation soapAction="urn:helloService:webService:com#sayHello" />
			<input>
				<SOAP:body use="literal" />
			</input>
			<output>
				<SOAP:body use="literal" />
			</output>
		</operation>
	</binding>

基本上固定的,不用你修改什么。

service,port:
	<service name="HelloServiceInterface">
		<port name="HelloServiceHttpPort" binding="cs:HelloServiceHttpBinding">
			<SOAP:address location="http://localhost:8080/webServiceTest/services/HelloServiceHttpPort" />
		</port>
	</service>

定义了你的服务名HelloServiceInterface,端口名HelloServiceHttpPort 和发布的地址http://localhost:8080/webServiceTest/services/HelloServiceHttpPort

调用axis的WSDL2Java,会生成6个类
HelloServicePortType              你发布的services接口文件
HelloServiceHttpBindingImpl       实现了services接口,服务器需补充的内容
HelloServiceHttpBindingSkeleton   services的服务端框架代码,实现了services,skeleton接口
HelloServiceInterface             获取services接口文件
HelloServiceInterfaceLocator      实现获取services接口文件
HelloServiceHttpBindingStub       services的客户端存根代码,实现services接口
这几个类包含客户端和服务端的,前面3个是服务端的,后面3个加第一个是客户端的。

这是Ant把wsdl文件转换成java文件
	<target name="convert">
		<java classname="org.apache.axis.wsdl.WSDL2Java" classpathref="lib" fork="true" jvm="${JAVA_JVM}">
			<arg value="-W" />
			<arg value="-a" />
			<arg value="--skeletonDeploy" />
			<arg value="true" />
			<arg value="-o" />
			<arg value="./src" />
			<arg value="./wsdl/Hello.wsdl" />
		</java>
	</target>

这里只是简单的转化了一下,还要考虑到其它问题的,以后再更新。

直接在命令行里面转换wsdl
java org.apache.axis.wsdl.WSDL2Java -W -a --ske
letonDeploy true -o code Hello.wsdl

需要axis  commons-discovery-0.2  commons-loggin-1.04 jaxrpc  wsdl4j-1.5.1这几个类写到环境变量里面,才能在命令行里面调用。

遇到的问题:
1. there is no undefined binding problem?
solution:when you reference the tns:HelloServicePortType and tns:HelloServiceHttpBinding,the xmlms:tns should same to your targetNamespace。
2. Invalid element in com.webService.helloService.schema.HelloRequestParameter - arg0
I debug the code, find the operationName is null cause this problem, so i add call.setOperation(_operations[0]), then it work fine. you can refer the code from *BindingStub.java, and copy the code to your project.

webServiceTest这是服务端代码,我没有把run工程也写在ant里面,所以需要你先调用ant,在跑工程。
TestWebService是客户端代码,客户端的代码,可以根据wsdl文件生成,然后调用。本来也想直接创建call调用,可是没成功,就是遇到的第二个问题,暂时没解决。
经过了调试代码终于发现了问题,菜鸟水平的英语大家还看得懂吧,就是operationName为空引起异常,所以我从HelloServiceHttpBindingStub中把call.setOperation(_operations[0])这段代码考了过来发现没问题了。只是很疑惑为什么我从网上看大家写的客户端调用都没这段代码,难道是跟版本有问题嘛,希望大家指出来。
解压密码123456.

简单的ws了解了一下,有些还没具体弄清楚,希望再接再厉,若有错误,大家一定要指出来。

分享到:
评论

相关推荐

    初学webservices二

    "初学Web服务二"可能是指在初次学习Web服务的基础上更深入地理解相关概念和技术。在这个阶段,你可能会接触到SOAP(简单对象访问协议)、WSDL(Web服务描述语言)以及UDDI(统一描述、发现和集成)等核心概念。 ...

    webServices 天气预报

    在本项目"WebServices 天气预报"中,开发者提供了一个简单的天气预报应用,旨在帮助初学者理解WebServices的工作原理及其在C# WinForm环境中的实现。这个项目的核心是利用WebServices获取并显示天气信息。 首先,让...

    Web Services初学者教程

    【Web Services初学者教程】 Web Services是一种通过互联网进行通信的技术,允许不同的系统和应用程序之间进行交互,无论它们是运行在何种操作系统或使用哪种编程语言。这个概念为软件集成提供了强大的解决方案,...

    webServices 用法 。net

    本篇文章将深入探讨.NET环境下Web Services的使用方法,特别是对于初学者如何入门XML在Web Services中的应用。 首先,理解Web Services的基本概念至关重要。Web Services是通过HTTP协议传输数据的服务,它使用标准...

    web services 教程

    Web Services 教程旨在引导初学者理解这一技术的基本概念和应用。Web Services 是一种使应用程序能够跨越网络进行通信的技术,它能够将传统的应用程序转化为网络服务,从而实现不同系统间的数据交换和功能共享。这个...

    WebServices创建及使用

    本教程主要介绍了如何创建和使用Web Services,特别适合Web Services初学者。 首先,我们创建一个接口来定义Web Service的方法。在Java中,这通常涉及到使用`javax.jws.WebService`注解。例如,在`...

    RESTful Web Services中文高清版.pdf.zip

    RESTful Web Services是一种广泛应用于现代Web开发中的设计模式,它基于Representational State Transfer(表述性状态转移)原则,...无论是初学者还是有经验的开发者,都能从中受益匪浅,提升自己的Web服务设计能力。

    绝对最全的web services资源

    综上所述,这个资源集合为学习和实践Web Services提供了全面的材料,从基础理论到具体实现,再到高级应用,无论你是初学者还是经验丰富的开发者,都能从中受益。通过深入研究这些文档和示例,你将能够熟练地掌握Web ...

    webservices示例代码

    总之,这个`WebservicesDemo`示例代码涵盖了Web服务的基本创建、配置和使用流程,对于初学者来说是一个很好的起点。通过深入研究和实践,开发者可以掌握Web服务的核心技术和实现细节,为构建分布式、跨平台的应用...

    webservices的开发图片和文档

    - WSDL(Web Services Description Language)用于定义Web服务的接口,描述服务提供的操作、消息格式以及如何调用这些操作。 2. **RESTful API** - REST(Representational State Transfer)是一种流行的Web服务...

    Web Services 应用 入门资料

    Web Services是一种基于互联网的、平台独立的交互方式,允许不同系统之间进行数据交换和服务调用。这个概念在21世纪初期出现,...对于初学者来说,理解Web Services的基本概念、标准和应用是进入这一领域的关键步骤。

    web services包

    这个“web services包”显然包含了与创建、部署和使用Web服务相关的组件和文档。让我们深入探讨一下这个包可能包含的内容以及相关知识点。 1. **SOAP(简单对象访问协议)**:SOAP是Web服务最常用的通信协议,它...

    WebServices实现原理.ppt

    Web Services是一种基于网络的、开放的、松散耦合的软件组件交互方式,它使得不同系统之间能够通过标准的...理解并掌握这些原理对于开发、部署和管理Web Services至关重要,尤其对初学者来说,这是一个良好的学习起点。

    idea Webservices服务、客户端项目.zip

    接着,为项目命名并设置项目位置,确保选中"Include support for"下的"Webservices"选项。 创建项目后,我们将开始构建Web服务。在项目中,右键点击"src"目录,选择"New" -&gt; "Other" -&gt; "Web Service",然后选择...

    web services 接口文档

    本教程旨在为初学者提供一个全面了解 Web Services 的入门指导,帮助他们快速掌握 Web Services 的基本概念、工作原理及其实现方式。 ##### 2.1 基础概念 - **SOAP (Simple Object Access Protocol)**:一种轻量级...

    Java调用.net webservices实例

    本教程将通过一个具体的实例,讲解如何使用Java调用.NET Webservices,帮助初学者理解和掌握这两种技术的结合使用。 首先,理解Web Services的基本概念至关重要。Web Services是一种基于网络的、标准化的模块化应用...

    一个简单的webservices

    对于初学者而言,理解Webservices的工作原理和实现方式是非常重要的。这个实例提供了学习Webservices开发的基础。通过分析这些文件,我们可以了解如何创建、部署和调用一个简单的Webservice。 【标签】:“Web...

Global site tag (gtag.js) - Google Analytics