Web服务使用一个复杂的体系结构为客户应用程序提供一个简单机制来从服务器应用程序调用方法和获取结果,而不用计较源代码使用的语言和主机平台有什么不同。Sun ONE Studio提供的工具让开发者能够使用包含在现有的Java类中的Web服务、方法--而不需要对这种体系结构有更深的了解。本文从一个基于servlet的Web模块中创建一个Web服务,演示如何使用现有的服务逻辑来生成新的客户应用程序。
介绍
回顾一下Web服务的核心技术--XML和简单对象访问协议( SOAP)--很明显这些技术实现已经在产业环境中存在了许多年了。在这段时间内,构建、测试和部署Web服务的工具已经极大地成熟了。在前段时间,对于这些关键技术的认识深度--例如SOAP信封的结构--是一个先决条件。现在,使用象Sun ONE Studio这样的高级开发工具,一个Web服务可以在几分钟之内从一个现有的J2EE Web容器应用程序中生成--不需要像SOAP这样的Web服务技术背景。
本文将模拟一个通用的案例:使用一个基于J2EE Web容器应用程序的现有的服务,并且把它展示为防火墙后的点对点同步集成的Web服务。当使用的示例不是实际的应用程序的时候,它的简单性提供一个集中创建、部署和测试一个Web服务的处理的机会--被大部分全面的J2EE应用程序共用处理。诸如安全和事务这样的相关主题虽然很重要,但是超出了本教程的范围。
初始化设置任务
为了成功地遵循本文中的过程,必须设置一个类似的开发环境。这个环境包括Sun ONE Studio 4企业版和Sun ONE应用服务器7平台版本。
产品和文件下载
下面的表格概括了本教程中所需要的产品和文件下载。
| 产品/文件 | 注解 |
| Sun ONE Studio 5标准版 | Sun ONE Studio 5标准版预配置了Sun ONE Application Server 7,这个应用服务器是本文所需要的。如果Sun ONE Application Server 7已经安装在你的开发环境中,那么Sun ONE Studio 5将自动整合到现有的安装中。 |
| hellowebmod.zip | 在一个Web模块中的HelloWorld源程序 本教程使用的两个源文件:HelloWorld.java hello程序包中的入口类,用于基于servlet的Web容器应用程序。两个类文件都在com.sun.demo.hello程序包中。 Salutation.java 这是一个简单的类,包含一个用来作为Web服务的方法。 |
察看文件扩展
默认情况下,IDE在Explorer窗口中隐藏了扩展名,但是出于明确性的原因,本文包括了文件的扩展名。为了使文件扩展名可见,你可以选择性地执行下面的任务:
1.从IDE主菜单,选择Tools> Options打开Options窗口。
2.打开IDE的Configuration > System,选择System Settings。
3.设置Show File Extensions属性为True。
环境配置
在本示例中,一个Web模块被创建,并且两个源文件(包括上面的)被添加来创建Web应用程序。在文件web.xml中,url模式/servlet/HelloWorld被配置用于本示例。
下面的过程将结束本文中的设置任务,配置你的环境并且安装和演示示例Web模块。

图1:设置默认服务器。
1. 为本示例选择或者创建一个工作目录。然后在这个工作目录之内创建一个名为hellowebmod的子目录。
2. 解压缩示例文件hellowebmod.zip <http://developers.sun.com/tools/javatools/articles/buildingWS/hellowebmod.zip>到hellowebmod目录里。
3.启动Sun ONE Studio 5标准版。
4.启动Sun ONE应用服务器7。使用Explorer窗口中的Runtime选项卡:
i.打开Installed Servers> Sun ONE Application Server 7> localhost 4848。如果在localhost 4848下没有server1 ( localhost : port_no)节点,那么右击localhost 4848并且从上下文的菜单选择Start来启动Admin Server。
ii.右击server1 ( localhost : port_no)节点,并且从上下文菜单中选择Status。Sun ONE Application Server 7 Instance Status对话窗口将打开。
iii.单击Start server,然后等到对话框中的状态指示器变为Running。
iv.单击OK关闭对话框。
5. 使用Explorer窗口中的Runtime选项卡(参见图1),为J2EE Applications和Web Tier Applications验证(或者设置,如果必要)默认服务器来运行Sun ONE应用服务器7实例:
i.打开默认服务器(Default Servers)节点。
ii.分别依次右击每一节点。
iii.从上下文菜单选择Set Default Server。iv.打开Select Default Application Server或者Select Default Web Server对话框。
v.打开Sun ONE Application Server 7 > localhost:4848 > server1 ( localhost:4848)下的节点。
vi.选择server1 (localhost:80)。单击OK关闭对话框。
6.在Filesystems窗口中加载本地目录hellowebmod。打开加载的目录展示它的WEB - INF目录。验证IDE是否已经认可hellowebmod作为一个Web模块,通过WEB - INF旁边的黄色方框中的绿色圆圈来指定。
7.右击WEB - INF节点,并且从上下文菜单中选择Deploy来部署示例Web应用程序。
一旦你的环境配置完成,下面的URL(或者类似的东西,取决于你的配置)应该返回下面表格中指定的问候语。
| URL | 问候语 |
| http://localhost/servlet/HelloWorld | Hello World! |
| http://localhost/servlet/HelloWorld?m=0 | Hello World! |
| http://localhost/servlet/HelloWorld?m=1 | Greetings, World! |
| http://localhost/servlet/HelloWorld?m=2 | Excuse me, I did not understand. |
创建一个Web服务
下面的过程将展示,作为一个Web服务,Salutation.java中的getmessage()方法与它的int参数和String返回值一起。

图2:Web服务向导。
1.在Explorer窗口中,选择WEB-INF>Classes > com > sun > demo > hello。右击hello节点,并且从上下文菜单选择New > Web Service。
2. 将出现Web服务向导。
3.在Web Service Wizard的第一个页面(见图2):
4. 在Name字段中,输入SalutationService。这将要成为Web服务的名称,被用作servlet和Web服务规范的名称的一部分。
5.验证Package Name是否com.sun.demo.hello。
6.验证Create From选择是否为Java Methods。
7.对于Architecture,选择Web centric(与之相反的是Multitier)。这将使Web服务可以在除了成熟的应用服务器之外的Web容器中运行。
8. 单击Next按钮,转到Web Service Wizard的下一个页面。
9.在Web ServiceService Wizard的第二个页面中,选择hellowebmod > WEB - INF > Classes > com > sun > demo > hello > Salutation.java > class Salutation > Methods。选择getMessage ()方法,并且单击Finish按钮。
10.在Explorer窗口中,右击SalutationService.xms节点,并且从上下文菜单中选择Generate Web Service Files。
11. 这将生成SalutationService.wsdl文件和一个SalutationServiceGenServer文件夹名。生成的文件夹包含使用RMI的类来实现这条链的一部分,使用调用它的远程进程来连接getMessage ()方法。
12. 注意:如果一个消息对话框出现,指明某些类被标记为RMI对象,只是不需要遵循它的指令来关闭对话框。所有用于运行Web服务所必要的代码和配置文件现在已经被创建了。
所有用于运行Web服务所必要的代码和配置文件现在已经被创建了。
SalutationService.wsdl是一个使用XML格式描述Web服务的Web服务定义语言( WSDL)文件可以多种途径来使用。例如,一个WSDL文件可以发布为一个通用描述、发现和集成(UDDI)注册,在这里另一个应用程序可以找到它并且可以编程生成SOAP请求--所有的这些都可以不进行人工干预。这个过程类似于Java反射,这里的方法可以在运行时间发现。
另一种使用方法是这个文件可以在一个组织(或者合作组织)内部共享并且有效地用作一个协约,定义提供了什么服务并且如何使用。此外,"协约(contract)"的概念和Java接口背后的概念大不相同。此外,我们迟些将看到WSDL文件可用于创建一个Web服务客户端,而这个Web服务客户端将和用于本教程的Web服务示例相互作用。
包装一个Web服务
到目前为止有两个Web模块:最初的servlet和新创建的Web服务。因为这两个Web模块基于同一个Salutation.java文件,这两个Web模块应该统一以便更新只需要在某处部署的salutation.class。一旦结束,一个访问HelloWorld servlet的新的URL将可用,并且包含的Java类将出现在一个新的位置。
为了合并最初的servlet和新创建的Web服务。
1.在Explorer窗口中,右击SalutationService.xms文件,并且从上下文菜单中选择Export WAR file。
2.这生成WAR模块文件salutationservice.war,包含web.xml,sun - web.xml和其它所需要的文件。
3.将打开一个询问对话框,询问你是否想为Web服务生成一个测试客户端。点击No。在本教程稍后的地方将生成一个测试客户端。
4.右击WAR模块文件SalutationService.war,并且从上下文菜单中选择Unpack as Web Module。
5.创建并且选择SalutationService目录,在这个目录中打开Web模块。加载SalutationService目录作为Sun ONE Studio的一个文件系统。
6.Sun ONE Studio现在将识别这个文件系统作为一个Web模块--通过它的WEB-INF节点旁边的绿色的Web模块图标来标示。
7.从hellowebmod/WEB - INF/classes/com/sun/demo/hello/目录中复制文件HelloWorld.java和Salutation.java。然后把它们粘贴到SalutationService/WEB - INF/classes/com/sun/demo/hello/目录中。
8. 注意:对于Copy选项,选择Paste而不是Create链接。同时,关闭可能出现"Changes recommended in deployment descriptor.."消息的对话框,并且不接受推荐的变更。
9. 把HelloWorld servlet添加到SalutationService Web模块,如下:
. 在Explorer窗口中,选择SalutationService>WEB-INF节点,右击web.xml节点并且从上下文菜单中选择Properties。
i. 找到Servlets属性,并且点击它的相应的Browse button (…)。将打开Servlets Property Editor对话框。
ii. 点击Servlets Property Editor中的Add按钮。将打开Add Servlet对话框。
iii. 设置Servlet Name字段为HelloWorld。通过点击Browse (…)按钮设置Servlet Class字段并且选择SalutationService/WEB - INF/classes/com/sun/demo/hello/HelloWorld.java。
iv. 通过点击相应的Browse ( Edit…)按钮设置Mappings字段。将打开Edit Servlet Mappings对话框。
v. 点击Edit Servlets Mappings对话框中的Add按钮。将打开Add Servlet Mapping对话框。
vi. 在Edit Servlet Mappings对话框中设置Servlet Name为HelloWorld,并且设置URL Pattern为/hello。
vii. 在每个对话窗口中点击OK按钮关闭它们。(参见图3)

图3:把HelloWorld servlet添加到SalutationService Web模块中。
10.右击WEB - INF节点,并且打开它的属性对话框。设置上下文根为/SalutationService。
部署一个Web服务
接下来的任务是在Sun ONE Application Server上部署Web服务。
Sun ONE Studio标准版可以使用它的组合式体系机构部署到各种应用服务器中,默认情况包括Tomcat和J2EE Reference Implementation服务器。 Sun ONE Application Server安装程序将安装插件。
一旦安装正确,Sun ONE Application Server7应该在Sun ONE Studio中和在Explorer窗口的Runtime选项卡中以及Server Registry > Installed Server下可视。验证它是否是默认应用服务器,然后使用一个简单的步骤部署你的Web服务应用程序到这个容器中:
1.右击节点SalutationService > WEB - INF,从上下文菜单中选择Build All重新编译新复制的类。
2.右击WEB - INF节点,并且从上下文菜单中选择Deploy来部署示例Web应用程序。
基于缺省值,现在可以在下面的URL中测试示例Web服务的部署(参见图4):
§ http://localhost/SalutationService/SalutationService

图4:访问SalutationService Web服务。
下面的URL是可以访问的相关servlet和它的参数值:
§ http://localhost/SalutationService/hello
§ http://localhost/SalutationService/hello?m=0
§ http://localhost/SalutationService/hello?m=1
§ http://localhost/SalutationService/hello?m=2
现在创建并部署了一个具有功能的Web服务和servlet。在最初的SalutationService Web模块hellowebmod中的性能和源代码已经在新的Web模块中被重新构造了一遍。原来的hellowebmod现在就是多余的了,可以删除掉了。
接下来,我们将创建一个能和我们的web服务编程交互的web服务客户应用程序。
创建一个Web服务客户程序
接下来的任务是创建一个能和刚刚配置的web服务编程交互的web服务客户应用程序。
注意:如果你将在不同的机器或者文件系统上开发客户程序,你必须首先把WSDL文件保存在http://localhost/SalutationService/SalutationService
1. 从Explorer窗口中的Filesystems选项卡中,在已有的SalutationService/WEB - INF/classes/com/sun/demo/文件夹中创建一个名为client的新建文件夹。
2. 右击新的client目录,从上下文菜单中选择New > All Templates启动New Wizard。然后选择Web Services > Web Service Client并且按下一步。
3. Web Service Client Wizard的第一个页面:
i. 设置Name字段为SalutationClient。
ii. 确认Package字段被设置为com.sun.demo.client,也就是说client目录是在这之下创建的。
iii. 设置Create From字段为Local WSDL File。
iv. 单击Next按钮。
4. 在Web Service Client Wizard的第二个页面,如下选择Local WSDL文件:
i. 选择节点SalutaionService > SalutationService.wsdl
ii. 单击Next按钮。
Web服务描述文件SalutationClient.wsc现在将被生成。
5. 右击新生成的Web服务描述文件节点SalutationClient.wsc,并且从它的上下文菜单中选择Properties,确认Soap Runtime属性设置为JAXRPC。
6. 右击SalutationClient.wsc并且从上下文菜单选择Generate Client Files。
这个命令将生成完成这个客户端所需要的类和文档。
7. 再次右击SalutationClient.wsc。这次,从上下文菜单中选择Deploy。
这个命令将产生客户程序代理程序类,组装WAR模块,并且把它配置到应用服务器中。
8. Web服务客户程序现在可以在下面的URL处访问(参见图5):http://localhost/SalutationClient。

图5:使用SalutationClient。
为了在你的浏览器中测试新的Web服务客户程序,输入0~2之间的一个整数,并且点击Invoke按钮。客户程序将发送一个SOAP格式的请求到Web服务,返回一个SOAP响应。然后客户程序将显示一个包括一个到原始SOAP格式的响应的链接的非常格式化的响应。
调试
如果你遇到因为类加载器不能发送上下文信息到JAXRPCContextListener的情况所引起的加载servlet类的问题,请检查WEB-INF/classes/com/sun/demo/hello/forte4j/webdesigner/basecomponent/目录中是否有KOMODOxxx.class文件。如果没有这个文件,从Sun ONE Studio Filesystem中添加这些文件。