第二章 实现一个简单的web service
第二章 实现一个简单的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开发透视图下:
Eclipse的BUG提示:在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 service的WSDL文件
假如你想创建一个在第一章描述的web service:
用WSDL语言来描述,应该是这样的:
上面定义了schema和port type。下面我们来定义binding和port:
实际上,在SOAP 的binding中,你可以指定更详细的信息:
5.RPC类型的web service (版本一)
如果创建的web service是RPC类型的,那么WSDL文件应该是这样的:
因为RPC类型web service不是实践中最好的选择。建议使用文档类型(Document style)的版本
6.以可视化方式创建WSDL
以手写方式创建WSDL文件容易出错误。幸运的是,在Eclipse中可以在可视化方式下进行WSDL的创建。首先,在Eclipse中创建一个名称为SimpleService的Java工程:
在创建工程的过程中,保证对于源代码和类文件使用不同的文件夹。然后继续完成工程的创建。接下来,右键单击工程并选择菜单”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)。如果要更改元素类型,双击其类型会出现一个下拉列表选择框可以选择合适的元素类型:
如果你想让s2在s1之前显示,可以把其选中拖放在s1前面:
现在,还是保持s1在s2之前显示。接下来右键单击<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 包的。比如,SimpleService的port type在命名空间http://ttdev.com/ss中,映射到Java包结构为com.ttdev.ss:
当然,这只是默认的映射方式。在上面的对话框中可以自定义Java包结构。但是对于我们来说默认的映射也比较合理。接下来单击”Next”并输入以下信息:
单击”Finish”.邮件单击工程文件夹选择”Refresh”.然后你将看到以下一些生成的文件:
Java 源代码文件会提示很多错误,这是因为这些源代码会引用到Axis2的jar文件但是目前这些文件不在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:
若要查看SimpleService的WSDL文件,只需要单击”SimpleService” 链接即可:

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