第二章    实现一个简单的web service

 

 第一章:http://www.cnblogs.com/hanlsheng/archive/2011/1/20.html

 

本章主要内容:如何实现第一章设计的web service 接口。

 

1.安装eclipse

         需要安装eclipse v3.3或者以上版本,而且满足JavaEE开发。如果没有去http://www.eclipse.org下载JavaEE开发版本的Eclipse IDE(比如:eclipse-jee-helios-SR1-win32.zip)。解压到路径c:\eclipse.然后在桌面创建快捷方式。并创建默认工作空间c:\workspace.运行eclipse并转到JavaEE开发透视图下

         EclipseBUG提示:在Eclipse3.3.1中有一个严重的BUG:当在可视化环境下编辑WSDL文件时eclipse会提示OutOfMemoryError错误。若修复这个bug,请按照下面方式修改文件:c:\eclipse\eclipse.ini:

 

2.安装Axis2

         接下来,去http://ws.apache.org/axis2下载”Standard Binary Distribution”(比如:axis2-1.5.4-bin.zip).解压到c:\axis。切换到目录c:\axis\bin下运行axis2server.bat将启动Axis服务器。你将看到如下画面

         打开浏览器并访问地址http://localhost:8080/ 你将看到如下画面:

这说明在Axis服务上已经存在了一个名称为”Version”web service。单击”Version”连接你将看到它的WSDL文件

3.Eclipse上安装AXIS2插件

         http://ws.apache.org/axis2/tools/index.html下载代码生成插件(Code Generator 比如:axis2-eclipse-codegen-plugin-1.5.4.zip)。把它解压到c:\eclipse\plugins文件夹下面。重启eclipse如果需要。检验是否安装成功,选择菜单”File|New|Other”看是否有”Axis2 Code Generator”选项

 

4.web serviceWSDL文件

         假如你想创建一个在第一章描述的web service

 

         WSDL语言来描述,应该是这样的

 

         上面定义了schemaport type。下面我们来定义bindingport

  

 

         实际上,在SOAP binding中,你可以指定更详细的信息

  

 

5.RPC类型的web service (版本一)

         如果创建的web serviceRPC类型的,那么WSDL文件应该是这样的

  

         因为RPC类型web service不是实践中最好的选择。建议使用文档类型(Document style)的版本

6.以可视化方式创建WSDL

         以手写方式创建WSDL文件容易出错误。幸运的是,在Eclipse中可以在可视化方式下进行WSDL的创建。首先,在Eclipse中创建一个名称为SimpleServiceJava工程

         在创建工程的过程中,保证对于源代码和类文件使用不同的文件夹。然后继续完成工程的创建。接下来,右键单击工程并选择菜单”New|Other”,然后选择”Web Services|WSDL”:

         如果你没有看到这个选项,说明你没有安装JavaEE版本的Eclipse。如果正常工作,单击”Next”并输入SimpleService.wsdl作为文件名

         单击”Next”,接着安装下图图示输入

         单击”Finish”,你将会得到如下画面:

         这是WSDL的代码文件表现形式。如果要进行可视化编辑,单击编辑器窗口底部的”Design”标签。你看到

         双击endpoint将其改为http://localhost:8080/axis2/services/SimpleService:

         双击operation将其改为”concat”:

         现在,input part 是一个<concat>元素(element).让我们把其改为<concatRequest>.把鼠标光标移动到图像右边缘的箭头上,箭头会变成蓝颜色。光标停留几秒钟,会出现一个<concat>元素定义的窗口:

         单击其他地方窗口会消失。为了编辑schema 定义(比如:在这里是指<concat>元素的定义),单击蓝色箭头。一个新的编辑器窗口会出现

         如果要想可视化(图形化)方式编辑,单击编辑器底部的”Design”标签,你将会看到

         双击”in”把其改为”s1”:

         右键单击(concatType)选择”Add Element”并把名字设置为”s2”:

         默认情况下元素类型被设置为string(比如:元素s1,s2)。如果要更改元素类型,双击其类型会出现一个下拉列表选择框可以选择合适的元素类型

         如果你想让s2s1之前显示,可以把其选中拖放在s1前面

         现在,还是保持s1s2之前显示。接下来右键单击<concat>元素,并选择”Refactor|Rename”,把其名称改为concatRequest:

         现在已近完成了对<concatRequest>元素的设置。现在返回到WSDL编辑器开始对response message进行设置。目前,<concatResponse>元素如下图所示

         如上图所示,concatResponse是一个包含了<out>元素的元素:

         <foo:concatResponse>

                   <foo:out>abc</foo:out>

         </foo:concatResponse>

         然而,在接口设计的时候,response是一个简单类型的元素,而不是一个复杂类型元素

 

         那么如何更改concatResponse的类型呢?右键单击选择”Set Type|Browse”:

 

         选择”string”:

 

         成功更改后,concatResponse会变成下图所示

 

         好了,现在让我们查看一下整个schema,单击左上角的图标:

 

         你将看到:

 

         看起来不错吧?O(_)O~。现在,保存下文件吧!

7.验证WSDL 文件

         为保证wsdl文件遵守各种web service标准,接下来我们对其进行验证。验证操作非常简单:右键单击SimpleService.wsdl文件选择”Validate”. 如果有任何错误,会在问题窗口显示。比如,这里我引入了一个错误在SimpleService.wsdl文件中

 

 

8.生成一个service stub

         接下来,为了实现这个web service,需要生成一个 “service stub”(见下图)。当一个请求消息到来时,service stub 会把XML元素<concatRequest>转换为一个ConcatRequest Java对象。然后,ConcatRequest对象被传递给concat()方法,concat()方法在service skeleton(service skeleton 需要你来提供).concat()方法会创建一个ConcatResponse Java对象并将其返回。Service stub 获得ConcatResponse对象并把它转化为一个XML元素<concatResponse>然后再把这个XML元素返回给客户端

 

         以上对原理进行了简单的介绍,接下来我们进行实践操作。在Eclipse中选择菜单”File|New|Other” 并选择”Axis2 Code Generator”(见下图).默认是从WSDL文件生成java代码。默认选择正是我们所要选择的

 

         单击”Next”(见下图).单击”Browse”定位到SimpleService.wsdl文件:

 

         单击”Next”(见下图).像下面一样设置每个选项:

 

         注意namespace是如何默认映射为Java 包的。比如,SimpleServiceport type在命名空间http://ttdev.com/ss中,映射到Java包结构为com.ttdev.ss

 

         当然,这只是默认的映射方式。在上面的对话框中可以自定义Java包结构。但是对于我们来说默认的映射也比较合理。接下来单击”Next”并输入以下信息

 

         单击”Finish”.邮件单击工程文件夹选择”Refresh”.然后你将看到以下一些生成的文件

 

         Java 源代码文件会提示很多错误,这是因为这些源代码会引用到Axis2jar文件但是目前这些文件不在build path中。所以,打开build path 对话框并单击”Add JARs”按钮:

 

         选择工程中”lib”文件夹下的所有的Jar 文件

 

         这时,所有的提示错误都会消失掉。O(_)O~

 

9.实现web service

         要实现web service,需要更改SimpleServiceSkeleton.java文件,这个文件即service skeleton

 

         ConcatRequest类和ConcatResponse类从哪里得来的呢?它们是由Axis2 Code Generator生成的

 

 

10.部署web service

         Axis2服务器中,部署web service,只需要按照下图进行文件的拷贝就可以了:

 

         现在,通过运行:c:\axis\bin\axis2server.bat文件启动Axis2服务器。你应该看到服务器已经获得了SimpleService :

 

         打开浏览器,在地址栏输入http://localhost:8080 你将看到SimpleService

 

         若要查看SimpleServiceWSDL文件,只需要单击”SimpleService” 链接即可

 

 

11.通过客户stub创建一个客户端

         若访问一个web service, 需要使用Axis2的代码生成工具生成一个”client stub”(客户 stub).当访问web service中的一个方法时,stub 会把你程序中的Java 对象数据转化为适当的格式(XML格式的SOAP),并在SOAP中创建请求消息,然后通过Internet使用适当的传输协议 (HTTP)把其(soap)发送到正确的endpoint(端点).当有响应到来时,stubXML格式的消息再转化为Java对象数据,并将其返回给你。

 

         按照以下步骤生成客户stub。运行Axis2 Code Generator 向导直到看到下图所示的步骤。这次选中生成客户端代码(generate client side code):

 

         然后选择把生成的代码输出到SimpleService 工程。

 

         单击”Finish”并刷新工程。你将看到一些新生成的Java 类文件:

 

         在上图的类文件中,SimpleServiceStub.java 是客户stub。这就好比你模仿他人访问你的自己的web service一样,他人不可能把客户端代码和web service的实现代码混在一起。因此,把客户端代码放到单独的包中,比如com.ttdev.ss.client.

         接下来,在com.ttdev.ss.client包中创建SimpleClient.java类文件:

        

 

         运行它,会获得如下输出:

 

12.卸载web service

         如果要卸载web service。只需要把SimpleService文件夹删除即可:

 

         即使在Axis2 服务器运行的时候,删除文件夹操作一样正常工作。服务器会提示文件夹被删除和service被成功卸载。

 

         如果把删除的service文件夹复原。Axis2 服务器会立刻重新部署:

 

这就是所谓的”hot deployment””(热部署)

13.本章总结

         Tomcat承载了一个或者多个web applicationAxis 服务器可以作为一个web application安装到Tomcat中。Axis可以承载一个或者多个web service

         普遍情况下,输入消息和输出消息是以SOAP消息传送的。一个SOAP消息总是一个<Envelope>元素。其中可能包含一个<Header>元素,是由一个或多个头结点或者头元素组成。<Envelope>必须包含一个<body>元素,是由一个或多个body节点或元素组成。对于文档类型的web service,通常仅有一个输入消息部分(input message part)作为一个单一的body入口。对于RPC类型的web service,元素通常包含所有的消息部分(message parts)作为一个单一的body 节点。

         创建一个web service,首先要创建一个WSDL文件用来描述web service的接口。通常通过工具来创建wsdl文件,比如用eclipse。使用Axis code Generator向导通过WSDL文件生成服务器端stub。然后在service skeleton中填充自定义代码。服务器端stub 的作用是把请求消息中的XML元素转化为Java对象数据,然后调用skeleton并把Java 数据对象以XML元素返回,然后封装到相应消息(response message)中。

         部署一个web service,拷贝类文件和services.xml文件到Axis2 服务器中要符合特定的文件结构。如果要卸载一个web service只要删除相应的web service 文件夹即可。Axis2 服务器支持热部署。这意味着,可以在服务器运行中,部署和卸载web service

         部署的web service的端点(endpoint)是:http://localhost:8080/axis2/services/%3cname-of-your-service>.

         访问一个web service,在相应的WSDL文件上运行Axis Code Generator向导生成一个客户端stub。然后在自己的代码中创建一个client stub的实例,把其当作一个web service进行调用。客户端 stub将把java 数据对象转化为XML 元素,并以正确的格式创建请求消息,然后通过适当的传输协议把请求消息发送到正确的端点(endpoint),并把相应消息中的xml元素转化为Java 数据对象返回。

 

作者: 韩连生 发表于 2011-01-24 17:32 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架