目前,大部分公司要么正在积极的开发Web service基础架构,要么正有此打算。老实说,利用以前写好的业务逻辑并将其作为Web service公开并不那么困难。在过去几年中,Web service标准获得了很大发展,如今已经变得可靠且健壮;甚至不同的开发工具箱也能够跨不同的平台生成标准的结果。 向业务流程添加Web service基础架构会带来以下几点益处。第一,现有的源代码(不管是基于PC机还是大型机)和所有的开发投资都不会化为乌有,而是将通过新的Web接口继续发挥作用。第二,新的业务事务很容易通过Web处理,并能够与任何新系统或者公开为标准Web service的传统系统相交互。第三,业务事务变得富有意义,这在某种程度上要归功于SOAP和XML标准。第四,如果Web service设计良好的话,所需的流程控制应该最少。第五,由于会话通过HTTP连接完成,所以有可能不受防火墙的限制。当然,实现Web service还有很多其他好处。所以,对于任何公司,Web service都有很高的ROI(投资回报率)。 在本文中,我将说明如何使用企业级工具(如:JBuilder X或JBuilder 2005 Enterprise以及BEA WebLogic Application Server)在现有的Java应用程序的基础上创建简单的Web service。我还将描述Web service的结构、标准、逻辑和相关的平台。为了演示运行中的Web service,我将创建一个具有服务器和客户机的项目。客户机将启动到服务器的真实Web service会话。我还将简要描述如何使用可免费得到的工具(如:Eclipse IDE和 Axis Toolkit)来完成相同的任务。 宿主环境 要获得运行的Web service,必须有一个能驻留该服务的应用服务器。Web service可以选择在任何公共的UDDI(Universal Description, Discovery and Integration,统一描述、发现和集成协议)注册库注册,或在驻留在应用服务器上的本地UDDI注册库注册。UDDI向潜在的业务客户机提供地址薄功能;它允许客户机定位特定服务,并描述了哪种API可用。如果没有UDDI注册库,业务客户机可以(并且常常会)直接转向一个Web service URL并请求WSDL(Web Service Definition Language,Web service描述语言)文档,文档中同样包含有关提供了哪些API的详细描述。WSDL是驻留在应用服务器中的XML文档。 在真实的业务环境中,WSDL不仅要定义所有可用的方法,还要定义所有事务的模式。WSDL旨在被Web service程序识别,帮助它创建具有客户端可以调用的方法的对象存根;因此,WSDL文件是通过将用来创建Web service的工具箱自动生成的。 Web service以Web应用程序的形式驻留在应用服务器上的Web service容器中。任何感兴趣的客户机都可以启动常规HTTP会话与其交互。我们将使用BEA WebLogic应用服务器来建立Web service,它是业内的主流平台之一。若用于开发,BEA WebLogic应用服务器可以免费使用,用于生产则需要许可证。作为替代方案,也可以使用免费的Tomcat应用服务器和Axis工具箱,或者使用 Jetty应用服务器和Axis工具箱。当然还有其他应用服务器,典型的应用服务器如JBoss、Sun Microsystems的SunOne、IBM的WebSphere,但这些不在本文的讨论范围之内。所有这些Web平台都能够驻留Web应用程序和 Web services。但从开发的角度来说,JBuilder X或2005 Enterprise在创建Web services方面非常灵活易用。 BEA Weblogic的安装非常简单,但需要配置JBuilder来挂钩应用服务器。说明如下:进入JBuilder,在Tool菜单下,单击Configure Servers来建立应用服务器设置。
创建传统项目 在JBuilder中新建一个项目。在该项目下新建一个“beanexport”程序包,并添加一个名为Bean1的类。同时创建另一个名为Tuple的类(参见本文结尾处的清单1)。tuple类中有一对字符串,该类用于演示由一个Web service发送的更复杂的对象,该对象是可选的,不一定要使用。 将代码公开为Web service 为演示如何包装现有的“传统”API并将其转换为全功能的Web service,考虑一个极其简单的名为Bean1的Java类,它只有三个方法。第一个方法总是返回一个随机数,第二个返回一个“Hello”字符串,第三个返回更复杂的对象。 该类公开了一个只有三个方法的公共API,而现实中的应用程序所包含的API要复杂的多。一个企业应用程序可能包含上百个方法,这些方法从数据库、EJB或大型机调用包装器返回值。其中一些方法会带参数,另一些则启动业务事务会话。但是,将任何复杂的API转换为Web服务API就如同这个示例类一样容易。 package beanexport; import java.io.Serializable; public class Bean1 implements Serializable { public double getDouble(){ return Math.random(); } public String getText(){ return "Hello"; } public Tuple getHeader(){ Tuple t = new Tuple("Vlad","Kofman"); return t; } } 关于Tuple对象源,请参见清单1。 创建Web服务 假定我们已经在JBuilder中建立了Bean1 Java项目,并且可以成功编译,而BEA Weblogic Server正在正常运行,那么现在Bean1类就可以公开为Web service。JBuilder真正简化了Web service的创建和部署。打开Bean1项目,执行以下步骤:
注意:对于要部署在免费的Tomcat服务器上的Web service,也可以使用Jbuilder来开发;此处也把它列为一个选项。
图3
JBuilder自动创建所有必需的J2EE(Java 2企业版)标准化文件夹和文件结构。在保存初始配置后,它会打开一个Web Services Designer视图。 接下来的步骤很简单。Bean1项目应该已经具有下列结构(左面板):
取出Bean1类并将其拖放到Web-services设计工具区。或者单击Create Service,从下拉菜单中选择Java Service。 重构Bean1项目;在该项目的各个子文件夹中会自动创建更多文件。就这样,Web service已经开发出来了。接下来只需部署它即可!
所有的Web service都是通过HTTP(或HTTPS)协议通信的。客户机发送SOAP(简单对象访问协议)请求,并等待SOAP响应。SOAP实质上是特殊格式的XML,用于描述通信。服务器和客户机都具有通过HTTP套接字通信的XML解析器和编码器。在接收到请求后,将其解码为可调用的、带参数的特定方法,在调用该方法后,其返回值会包装到XML-SOAP信封中并发回。 根据J2EE规范,Web应用程序必须使用特定的应用程序结构。WAR(Web ARchive)文件包含部署描述符和代码,并被压缩到EAR(Enterprise ARchive)文件中,以便最终安装在应用服务器上。因为该规范对于所有的平台都一视同仁,所以由任何工具箱开发的WAR和EAR程序包中的任何代码都可以在任意应用服务器上运行;但是,大部分应用服务器供应商的部署描述符文件多半不同。 令人欣慰的是,JBuilder简化了Web应用程序的开发,还可以经常使用独立的Axis Java2WSDL工具,也可以手动将代码打包到EAR文件中。 示例服务器
JBuilder会显示如下内容: Initiated Task: [0] [Deployer:149026]Deploy application ApplicationModule1 on myserver. Task 0 running: [Deployer:149026]Deploy application ApplicationModule1 on myserver. Deployment completed on Server myserver 就是这样!现在新的Web service已经驻留并可以被全世界使用了! 也可以解除部署,然后用同样的方法重新部署。所有当前的部署都可以在同一个菜单中列出。 要进行测试,可以打开JBuilder -> Tools-> Web Services Console,或者将Web浏览器指向http://localhost:7001/web-services/Bean1。 将会出现一个由Weblogic提供的、基于Web测试新服务的客户机,它会在后台调用SOAP通信来调用Bean1的方法。它甚至能够显示发送到各处的XML。 例如,单击getText()方法将会出现:
向服务器发送请求: <!--REQUEST.................--> <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <env:Body env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <m:getText xmlns:m="http://beanws"> </m:getText> </env:Body> </env:Envelope>服务器的响应: <!--RESPONSE.................--> <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <env:Body env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <m:getTextResponse xmlns:m="http://beanws"> <result xsi:type="xsd:string">Hello</result> </m:getTextResponse> </env:Body> </env:Envelope> 向URL添加“?WSDL”可以看到整个WSDL文件: http://localhost:7001/web-services/Bean1?WSDL 生产环境中的服务器部署当然不会使用JBuilder来部署EAR文件,而是使用与JBuilder同样易于操作的、基于Web的管理控制台,它通常和Weblogic服务器运行在同一端口上(例如:http://localhost:7001/console)。 请参阅有关如何使用其服务器管理功能的Weblogic文档;可以在JBuilder项目目录下找到ApplicationModule.EAR文件。 简单客户机 Weblogic测试客户机对业务不是很有用;其他客户机希望使用自己实现的Web service。创建客户机的一般机制是将Web service工具箱指向WSDL文件,并使它生成客户机对象存根。然后使用存根打开到服务器的端口,并调用其方法。存根也隐藏了对SOAP进行编组和解组的所有复杂性(都在后台处理)。但是,由于向项目添加了客户机模块,JBuilder会自动为项目添加一个 GeneratedWebServicesClient文件夹,并创建Bean1_client.jar文件。 该jar文件包含了为Bean1服务添加全功能客户机所必需的所有文件。 以下是创建简单的测试客户机的步骤: 创建一个名为“test”的新程序包,并添加新的Test类。 然后,导入beanexport.generated.*程序包;由于该程序在项目中,所以它应该已经在类路径中了。 通过生成的存根来创建到该服务的连接: String wsdlUrl = "http://localhost:7001/web-services/Bean1?WSDL"; Bean1 service = new Bean1_Impl(wsdlUrl); //bind to service Bean1Port port = service.getBean1Port(); //get port 然后任意调用一个方法。以下是完整的程序清单: package test; import beanexport.generated.*; public class Test { public static void main(String[] args) { try { String wsdlUrl = "http://localhost:9501/web-services/Bean1?WSDL"; Bean1 service = new Bean1_Impl(wsdlUrl); Bean1Port port = service.getBean1Port(); int result = port.getInt(); System.out.println("Int is: " + result); Tuple[] tuple = port.getHeader(); System.out.println("1st tuple: " + tuple[0]); System.out.println("2nd tuple: " + tuple[1]); } catch (Exception e) { e.printStackTrace(); } } } 最终结果是一个可执行的程序,该程序使用Web service与服务器通信,调用之前还只是传统Java方法而现在是Web service的API。 结束语 本文介绍了Web service的基础知识。并创建了一个简单的Java类,将其转变为全功能的Web service。本文还讨论了如何生成与服务器通话并调用SOAP通信的客户机。 把“传统”代码打包为Web service主要涉及到对所使用工具的了解。当前的应用服务器和工具箱可以通过隐藏“信息管道”以及SOAP编组和XML解析的复杂性,使创建新的Web service或者将现有代码公开为Web service的任务变得很轻松。 清单1 Tuple Class package beanexport; import java.io.Serializable; public class Tuple implements Serializable { private String key; private String value; public Tuple() { } public Tuple(String key, String value) { this.key = key; this.value = value; } public Tuple(Object key, Object value) { this.key = key.toString(); this.value = value.toString(); } public String getValue() { return value; } public String getKey() { return key; this.key = key; } public void setValue(String value) { this.value = value; } } } public String toString() { return key + " : " + value; } public void setKey(String key) { |
使用JB和WL开发开发Web Services
最新推荐文章于 2023-08-17 17:09:20 发布