副标题#e#
Web处事是什么可能应该是什么有很多界说,每个或多或少都可以领略。很有趣的工作是最简朴的对象往往是最难描写的。面前就有一个很好的例子:一个Web处事是一个可以和外部世界互换文档的实体。这个实体是自我描写的而且拥有一个独一的特性。
这个文档内容是XML;严格来说是SOAP。SOAP(简朴工具存取协议)界说Web处事消费和生成的XML文档的内部布局。SOAP被认为是一个行业尺度而且被很多跨平台软件供给商、硬件平台、操纵系统可能编程语言遍及地回收。
每个Web处事都有一个地点。这是它的ID。这个地点由一个URI(亦称URL)界说。一个Web处事存在于而且被它的URI标识。这个地点常常被称为一个终端。这个ID和内容的安详性毫无干系。本教程的处事存在于http://localhost:6060/ChatService/。
Web处事带有它本身的描写。这汇报你它互换的是什么范例的文档。它说明白处事存在于什么处所(URI地点)。而且它还说明白它可以利用哪个传输协议来互换文档。Web处事描写利用的语言是WSDL(Web处事界说语言)。一个Web处事完全由它的WSDL文档描写。为了和一个独立Web处事通讯,你只需要WSDL文档。纵然WSDL在它本身的上下文中描写Web处事,它照旧无法描写多个Web处事组合起来所形成的美好的乐章。
Web处事有一个地点,可是为了会见它,你需要发明它在哪儿。换句话说,你需要一个电话号簿列表Web处事。UDDI (通用描写、发明和集成)是行业尺度的电话号码薄。UDDI处理惩罚寄存器而且发明Web处事。
综合起来,一个Web处事就是和现实世界互换SOAP文档的一个实体,利用一些URI定位,利用WSDL文档描写而且可以利用UDDI注册来列出并发明。
一个真实的示例
无数范例的文档可以被发送到Web处事并来历于Web处事。它可以是一个钢厂中的周期的温度报道,它可以是一个处所当局界说的退税请求,可能它可以是一个从一个软件组件到另一个组件的RPC挪用的文档气势气魄表示。同样的环境也产生在文档互换方案中。你可以设想单向的动静可能请求-响应动静传送,这内里都需要跟从一个响应文档的请求文档。 Web处事大部门当前的用法遵循XML模式上的长途进程挪用。这就是为什么开拓者可以很容易转到开拓Web处事,而不要对现有的应用措施做重大的修改,可能之需要支付最小的尽力就能建设用于Web处事的客户端。Web处事框架常常可以埋没底层体系布局的巨大性。他们凡是提供了用于从语言到WSDL和从WSDL到语言生成的东西。展示象Web处事这样的语言布局比手工处理惩罚XML文档快得多而且容易的多。此刻,Web处事常常用作一个集成东西,让开拓者和系统设计师互连差异的应用措施。
纵然本文中的Web处事和它的客户端遵循XML模式上的长途进程挪用,可是Web处事的应用范畴长短常宽阔的。近期,有很多基于松散耦合的纯文档互换模式实现。
一个简朴的谈天处事器
在本文中,我试图建设一个比著名的股票行情处事更具挑战的应用措施,可是仍然简朴易读。它是一个谈天处事器应用措施。谈天处事器的成果长短常简朴的客户端可能发送新动静并读取它们。
这个谈天处事器实现是与WASP和Web处事完全互不相关的。它可以乐成地被编译而且用于任何其他的Java情况。这个谈天处事器还描写预存在的业务逻辑。请查察代码来了解。你可以在这里下载用于谈天实现的源代码(而不是Web处事,谁人还没有写)。
设计谈天处事器
谈天处事器的全部的实现被支解到好几个类中。接口界说在措施包com.systinet.simplechat.server.iface中。它由三个类构成;谈天处事器的接口类IChatService.java和用于谈天动静的表示两个布局和participants-ChatMessage.java和ChatPerson.java。
谈天处事器的实此刻措施包com.systinet.simplechat.server.impl中。它把简朴的接口的实现从后端业务逻辑中疏散出来。我利用了适配器设计模式,那就是说,到ChatService.java的挪用被委托给一个后端处理惩罚机。业务逻辑是相当简朴的。它是在一个荟萃中生存动静的SimpleBackendImpl.java类的单一实例。
初看起来,置配器/后端实现看起来对付用于一个简朴的教程太巨大了。然而,纵然巨大的现有的业务逻辑可以被重利用来酿成一个没有任何改变它的代码的需要的Web处事。这是一个常见的现实的利用案例。纵然应用措施没有利用本来的适配器模式,编写一个象ChatService这样的包装类,不需要重写原始的后端措施逻辑。然而,后端可以利用JDBC和一个干系数据库来实现,不然作为一个EJB,甚至挪用外部非Java应用措施的当处所法。大概产生的事是无穷尽的。适配器模式只答允你很快地触发新的后端逻辑。
把一个谈天处事器转为一个Web处事
#p#分页标题#e#
此刻,这个谈天处事器只是一个Java实现。它还不是SOAP。它只是一个用于运行在沟通JVM上的客户端的可事情的谈天处事器。下一步就是生成谈天处事器讲话SOAP而且建设一个描写它的WSDL文档。
这个示例利用Systinet的Web Applications and Services Platform(WASP)软件来建设Web处事应用措施。WASP软件是平台无关的而且事情在险些任何Java情况中。这个平台提供了两个差异的陈设环境:编程陈设和声明陈设。在这两种环境下,取得陈设的是简朴的旧的Java工具。编程陈设(也称运行时间宣布)产生在一个应用的运行时间而且能动态的陈设应用措施为Web处事。你只要在你的应用措施中慢慢开始WASP,而且利用到WASP应用编程接口的挪用注册它的工具。换句话说,你事实上把WASP嵌入到你的应用措施。声明陈设意味着把你的应用措施包装到一个陈设措施包而且把这个宣布到一个WASP的运行实例中。为了简朴和便于会见起见,我们利用运行时间宣布要领。
图1:导入现有的代码
#p#副标题#e#
安装谈天处事器到Eclipse中
假定你让带有WASP Developer的Eclipse启动并运行,安装示例代码。
在Eclipse中建设一个新建项目(File – > New – > Project…)。选择Systinet Web Services/Web Service Project。
在下面的对话框中输入项目名,ChatServiceProject和位置。竣事领导。
从File菜单中,选择Import…呼吁,而且选择Zip file要领。
在对话框中选择前面源代码中下载的压缩文件,而且点击Finish按钮。
你的工程此刻应该包括两个带有Chat Service的源代码的措施包。你可以通过查抄Package Explore视图来查抄。
SOAP启动谈天处事器
此刻你有了一个简朴的谈天处事器的一个事情实现。为了能与SOAP通信,你要把它陈设到利用运行时间宣布要领的Web处事处事器。
启动绝对地点的处事器而且在处事器的地点下注册这个处事。处事器地点+处事路径构成了Web处事的完整的URI。
这里是启动SOAP处事器而且把谈天处事注册为一个Web处事的应用措施代码类。这个源代码文件应该(很明明)应该被存为ChatServerApp.java。
package com.systinet.simplechat.server.impl;
import org.systinet.wasp.*;
import org.systinet.wasp.webservice.Registry;
public class ChatServerApp {
public static void main(String[] args) throws Exception {
Wasp.startServer("http://localhost:6060");
Registry.publish("/ChatService/", ChatService.class);
System.out.println("The Chat server is up and running.");
}
}
它很简朴,只有两行代码:
Wasp.startServer("http://localhost:6060");
Registry.publish("/ChatService/", ChatService.class);
WASP.startServer要领启动一个Java应用措施内的处事器。Registry.publish要领编程地陈设ChatService类为一个Web处事。这个处事的URI由处事器的地点和处事器的处事路径构成。WASP还自动地建设描写处事WSDL文档而且把它宣布在SERVICE_URI/wsdl。
图2:运行处事器。
结构并运行谈天处事器
谈天处事器此刻可以运行了。在结构完毕之后(Project->Build Add),你可以启动它。首先,建设一个Web处事运行器。这个运行器担保处事器有所有需要的库而且被适当的设置。为了建设运行器,从com.systinet.simplechat.server.impl措施包中选择ChatServerApp而且从IDE菜单中选择Run->Run…。
打开的对话框是工程中的所有的运行器的打点器。双击WASP Java Application运行模板。建设了一个称为ChatServerApp的新的运行器。老是利用这个运行器来运行ChatServerApp类。按下Run按钮来启动谈天处事器。
处事器启动而且运行,筹备与SOAP通信。它的位置是http://localhost:6060/ChatService/。动态生成WSDL文档的位置是http://localhost:6060/ChatService/wsdl。
业务逻辑此刻利用Runtime API被编程陈设随处事器上。
图3:运行处事器的输出。
客户端
此刻,你需要一个消费这个ChatService的客户端。
假定你对这个处事所相识的所有的对象只是它的WSDL描写的位置: http://localhost:6060/ChatService/wsdl。你不能会见原始的Web处事的源代码。你甚至不知道它是利用什么语言来实现的。你还不知道ChatService的准确位置,可是你知道每个Web处事都在它的WSDL文档中完全描写。
#p#分页标题#e#
处事器建设一个署理,埋没所有的SOAP而且从开拓者垂直传送,而且让它们利用单一要领挪用来挪用Web处事。为了运行,这个署理必需知道Web处事的WSDL描写的位置,Web处事的URI和它的Java接口。你知道ChatService的WSDL位置,而且处事的URI包括在这个WSDL中。此刻你所需要的是取得处事的Java接口。手工建设它意味着很是相识WSDL和XML Schema,而且它甚至仍然是一个很难的任务。幸运的是,WASP Developer包括一个从它的WSDL生成一个Web处事的Java接口的东西。这个东西,称为WSDL2Java,可用作呼吁行实用措施和一个ANT任务,所以它很是便于与利用ANT的结构整合。
图4:建设客户端措施包。
客户端的代码
首先,建设一个用于客户端的新的措施包。从菜单选择File – > New – > Package。在New Package对话框中输入名为com.systinet.simplechat.client的措施包,而且按下finish按钮。
WASP Developer需要WSDL文件存在于工程中以便生成客户端类。下载谈天处事的WSDL文档到工程中。选择com.systinet.simplechat.client措施包,而且从菜单选择File – > New – > Other…。New对话框此刻打开了。在左边的东西栏中选择Systinet Web Services。所有可用的领导此刻呈此刻右边的东西栏中。选择WSDL from Internet条目而且转到下一窗囗。
在第二个窗口中填入WSDL文件的位置而且选择Next。ChatService的WSDL文件位于http://localhost:6060/ChatService/wsdl。
在最后一个窗口中,填充下载的WSDL文件的名称。配置它为ChatService而且点击finish。
WSDL文件此刻在你的工程中了。为了生成客户端类,从它的上下文菜单选择Generate Client…条目。
当Generate Client from WSDL领导打开的时候,所有的值都配置为它们的默认值而且竣事领导。
此刻你在两个新措施包中建设了几个文件;com.systinet.simplechat.client.iface和com.systinet.simplechat.client.iface.struct。前一个措施包包括接口界说,ChatService.java和一个被WASP框架利用的支持文件ChatService.xmap。后一个措施包包括利用在ChatService.java接口- ChatMessage.java和ChatPerson.java的附加的布局。假如你查抄这个生成的类,它们应该为你所熟知。它们不是原始的ChatService接口类精确无误的副本,可是它们准确地描写它的应用编程接口。
尚有一个WASP Developer从WSDL文件建设的类。看看com.systinet.simplechat.client措施包。哪里有一个新的文件,ChatServiceClient.java。这是一个客户端应用措施生成的骨架。列表1显示了这个文件中的类。
首先,几个WASP类被导入,然后你看看ChatService接口的导入的内容和从WSDL文件中生成的布局。这段代码的有意思的部门在main()要领中:
ServiceClient serviceClient = ServiceClient.create
(wsdlURI, ChatService.class);
serviceClient.setServiceURL(serviceURI);
serviceClient.setWSDLServiceName(new QName
("http://systinet.com/wsdl/com/systinet/simplechat/server/impl/", "ChatService"));
serviceClient.setWSDLPortName("ChatService");
service = (ChatService) Registry.lookup(serviceClient);
这些代码建设客户端利用来长途挪用谈天处事的署理。WASP Developer生成比简朴客户端需要的更多代码。因为WSDL文件可以包括有关大都的Web处事的信息,生成的代码有些巨大,所以它能用于任何WSDL文件。然而,下面的一行代码将以同样的要领用在我们的简朴的例子:
service = (ChatService) Registry.lookup
("http://localhost:6060/ChatService/wsdl/", ChatService);
处事工具此刻筹备挪用。它的要领的每个挪用导致谈天处事的长途挪用。竣事客户端来挪用谈天处事。列表2显示了扩展的自生成的代码。
结构和运行客户端既然客户端被实现,你需要结构而且运行它。为告终构代码,从菜单运行Project – > Build All呼吁。
为了运行客户端,你将需要它的Web处事运行器。
选择工程中的ChatServiceClient类而且从菜单选择Run – > Run…。双击WASP Java Application条目。一个称为ChatServiceClient的新的运行器被建设而且随时可利用客户端。老是利用这个运行客户端。按下Run按钮来启动客户端。
客户端毗连到谈天处事而且挪用它的两个要领。在客户端的两次执行之后到节制台的输出应该如图5所示。
图5:谈天客户端的输出。