在本教程中,您将设计一个开发订单处理应用程序,该应用程序将其功能公开为Web服务,由此各种使用者可以以与平台无关的方式下达订单信息。
在学习完本教程之后,您可以应用概念和知识来使用JAX-WS技术为您的应用程序开发Web服务。
为了成功完成本教程,您应该对Web服务技术有基本的了解,并且对Java编程有所了解。
相关内容:
Web服务提示和技巧:JAX-RPC与JAX-WS系列 WebSphere Application Server V6.1系列的Web服务功能包中的JAX-WS客户端API Web服务点播演示要运行本教程中的示例,您需要安装Java平台标准版(Java SE)6.0。
JAX-WS是一项旨在简化Java中Web服务和Web服务客户端的构造的技术。 它提供了完整的Web服务堆栈,可简化开发和部署Web服务的任务。 JAX-WS支持WS-I Basic Profile 1.1,这确保了使用JAX-WS堆栈开发的Web服务可以由遵循WS-I Basic Profile标准的任何编程语言开发的任何客户端使用。 JAX-WS还包括用于XML绑定的Java体系结构(JAXB)和带有Java附件API的SOAP(SAAJ)。
JAXB通过提供将XML模式映射到Java代码中的表示形式的便捷方法来启用数据绑定功能。 JAXB不需要将XML消息中的XML模式消息转换为Java代码,而无需完全了解XML和SOAP解析。 JAXB规范定义了Java和XML模式之间的绑定。 SAAJ提供了一种处理SOAP消息中包含的XML附件的标准方法。
此外,JAX-WS通过提供注释库将普通的旧Java对象(POJO)类转换为Web服务来加快Web服务的开发。 它还指定了从Web服务描述语言(WSDL)中定义的服务到实现该服务的Java类的详细映射。 遵循JAXB规范定义的映射,将WSDL中定义的任何复杂类型映射为Java类。 JAX-WS以前与Java平台企业版(Java EE)5捆绑在一起。JAX-WS2.0规范是根据Java Community Process(JCP)的JSR 224开发的。
入门JAX-WS的一个好方法是首先开发一个Web服务。 您可以使用以下两种方法之一开发Web服务:
首先签约:从WSDL签约开始,并生成Java类以实现服务。 代码优先:从Java类开始,并使用批注生成WSDL文件和Java接口。合同优先的WSDL方法要求对WSDL和XSD(XML架构定义)进行很好的理解,以定义消息格式。 如果您是Web服务的新手,那么从代码优先方法开始是个好主意,本教程将在本教程中使用它来开发Web服务。
使用代码优先方法,您可以从一个Java类开始,这些类实现要作为服务公开的功能。 当Java实现已经可用并且您需要将实现公开为服务时,代码优先方法特别有用。
首先,我们创建一个订单处理Web服务,该服务接受订单信息,运输信息和订购的商品,并最终生成一个确认ID作为响应。 清单1中提供了订单处理服务的代码。这是一个虚拟实现,可在控制台上打印客户ID和商品数量,然后返回虚拟订单ID A1234 。 (您可以在本文的“ 下载”部分中下载完整应用程序的源代码。)将源代码提取到C驱动器中,在该驱动器中创建了一个名为JAXWS-Tutorial的文件夹。 该文件夹包含源代码,如清单1所示。
OrderBean包含清单2中所示的订单信息。具体地说,它包含对客户,订单项和送货地址对象的引用。
开发JAX-WS Web服务的起点是带有javax.jws.WebService批注的Java类。 所使用的JAX-WS注释是Java平台规范(JSR-181)的Web服务元数据的一部分。 您可能已经注意到, OrderProcessService带有WebService批注,该批注将类定义为Web服务终结点。
OrderProcessService类(带有@javax.jws.WebService批注的类)隐式定义了服务端点接口(SEI),该接口声明了客户端可以在服务上调用的方法。 该类中定义的所有公共方法,除非该方法使用@WebMethod批注注释,并且exclude元素设置为true ,否则将映射到WSDL操作。 @WebMethod批注是可选的,用于自定义Web服务操作。 除了exclude元素之外, javax.jws.WebMethod批注还提供了操作名称和操作元素,用于自定义操作的名称属性和WSDL文档中的SOAP操作元素。 这些属性是可选的。 如果未定义,则默认值从类名称派生。
实施Web服务后,您需要生成部署服务所需的任何工件,然后将Web服务打包为已部署的工件(通常作为WAR文件),并将WAR文件部署到支持JAX-WS的任何兼容服务器上2.0规范。 生成的典型工件是提供将Java对象转换为XML以及基于服务接口的WSDL文件和XSD模式的类。
为了进行测试,Java 6捆绑了一个轻量级Web服务器,可以通过调用简单的API调用将Web服务发布到该服务器。 接下来,您将了解如何使用这种方法测试Web服务。
通过运行wsgen工具,可以为订单处理Web服务生成JAX-WS可移植工件。 该工具读取Web SEI类,并生成Web服务部署和调用所需的所有工件。 wsgen工具为需要发布的Web服务生成WSDL文件和XSD模式。
为了生成JAX-WS工件,首先需要编译服务和bean源:
打开命令提示符,然后导航到c:\ JAXWS-Tutorial。 运行以下命令来编译Java文件并将类文件放入其各自的文件夹中: javac com\ibm\jaxws\tutorial\service\*.java com\ibm\jaxws\tutorial\service\bean\*.java 运行以下命令以生成JAX-WS工件: wsgen -cp . com.ibm.jaxws.tutorial.service.OrderProcessService -wsdlwsgen工具提供了许多选项,例如通过提供-wsdl选项为服务生成WSDL和模式构件。 运行此命令后,您应该看到JAXWS-Tutorial文件夹中生成的OrderProcess.wsdl和OrderProcess_schema1.xsd,以及在com \ ibm \ jaxws \ tutorial \ service \ jaxws文件夹中创建的JAX-WS构件。
生成工件后,您可以通过运行以下Web服务发布者客户端来发布订单处理Web服务。
通过从c:\ JAXWS-Tutorial文件夹运行以下命令来编译OrderWebServicePublisher : javac com\ibm\jaxws\tutorial\service\publish\OrderWebServicePublisher.java 然后运行以下命令: java com.ibm.jaxws.tutorial.service.publish.OrderWebServicePublisher运行Java程序后,您应该看到以下消息: The web service is published at http://localhost:8080/OrderProcessWeb/orderprocess. To stop running the web service, terminate this Java process. The web service is published at http://localhost:8080/OrderProcessWeb/orderprocess. To stop running the web service, terminate this Java process.
这将在http:// localhost:8080 / OrderProcessWeb / orderprocess位置发布订单Web服务。 您可以通过显示订单处理Web服务生成的WSDL来验证Web服务是否正在运行:
打开浏览器,然后导航到http:// localhost:8080 / OrderProcessWeb / orderprocess?wsdl。在分析WSDL和架构工件之前,让我们分析OrderWebServicePublisher的代码。 清单3提供了OrderWebServicePublisher客户端的源代码。
Endpoint.publish()方法提供了一种方便的方法来发布和测试JAX-WS Web服务。 publish()具有两个参数:Web服务的位置和JAX-WS Web服务实现类。 publish()方法在指定的URL(在本例中为本地主机和端口8080)创建一个轻量级的Web服务器,并将Web服务部署到该位置。 轻量级Web服务器在Java虚拟机(JVM)中运行,可以通过有条件地调用endpoint.stop()方法或终止OrderWebServicePublisher客户端来终止。
要查看生成的订单处理Web服务WSDL,请在浏览器中键入以下URL位置: http://localhost:8080/OrderProcessWeb/orderprocess?wsdl 。
让我们分析一些重要的WSDL方面,并从分析生成的XSD开始,看看如何基于JAX-WS元数据生成WSDL和模式构件。 使用xsd:import标记将其导入到WSDL文件中(参见清单4)。 schemaLocation指定XSD的位置。
将schemaLocation (http:// localhost:8080 / OrderProcessWeb / orderprocess?xsd = 1)放在浏览器中,以查看在浏览器中呈现的架构定义。 让我们分析一下这里发生的情况:模式定义以targetNamspace和tns声明开头,该声明映射到您在OrderProcessService的@WebService批注中定义的targetNamespace http://jawxs.ibm.tutorial/jaxws/orderprocess。 清单5提供了代码。
较早执行的wsgen工具生成两个包装bean类, ProcessOrder和ProcessOrderResponse ,它们保存订单处理Web服务的输入和输出消息。 基于包装器bean类,将生成以下模式元素:
processOrder的类型为processOrder ,它表示一种复杂类型,其中包含一个名称为arg0且元素为orderBean 。 您可以看到ProcessOrder类和processOrder复杂类型之间的一对一映射。 processOrderResponse与processOrderResponse类型类似,其定义映射到ProcessOrderResponse类。让我们更仔细地查看清单6中的内容。
清单7中所示的orderBean类型定义映射到OrderBean类。 orderBean类型定义包括:
一个类型为customer customer元素。 一个类型为string的orderId 。 orderItems (这是一个数组,因为它指定的maxOccurs属性作为unbounded ),其类型为orderItem 。 类型为address shippingAddress 。类似地, customer , orderItems和address的其余模式定义分别映射到Customer , OrderItem和Address Java Bean。
分析了模式定义之后,让我们重新访问WSDL中的消息定义,如清单8所示processOrder指定消息processOrder和processOrderResponse ,它们的组成部分是processOrder和processOrderResponse (您已经了解了它们的模式定义)。 portType指定操作processOrder其输入消息为processOrder ,其输出消息为processOrderResponse 。
接下来,定义WSDL绑定。 这将soap:binding样式定义为document , soap:body使用tag作为literal作为操作processOrder输入和输出消息格式。 生成的WSDL定义映射到您在OrderProcessService类上定义的@SOAPBinding注释(请参见清单9)。
接下来,定义WSDL服务。 这些指定端口和相应的绑定类型,以及服务的实际位置。 这通常是一个HTTP位置,在这种情况下为http:// localhost:8080 / OrderProcessWeb / orderprocess。 您可以在清单10中详细看到这一点。
这样,您就分析了生成的WSDL和模式构件。 清单11展示了Web服务客户端调用processOrder操作时发送的示例SOAP请求消息。
在本部分中,您将学习如何从WSDL创建Web服务客户端。 JAX-WS带有一个称为wsimport的工具,该工具用于从WSDL生成JAX-WS便携式工件。 通常生成的可移植工件包括以下内容:
精工 服务(您需要实现的服务实现类) JAXB从架构类型生成的类 从wsdl:fault映射的异常类(如果有)客户端使用生成的工件来调用Web服务。 Web服务客户端不需要处理任何SOAP格式,例如创建或解析SOAP消息。 而是由JAX-WS运行时处理,该运行时使用生成的工件代码(JAXB生成的类)。 Web服务客户端依次处理Java对象(由JAXB生成的类),这简化了Web服务客户端的开发和对Web服务的调用。
您可以使用wsimport工具从OrderProcess WSDL生成JAX-WS工件。 然后,创建一个Web服务客户端,该客户端使用生成的工件代码来调用订单处理Web服务。 要生成JAX-WS工件,请导航到JAXWS-Tutorial目录,并运行清单12中所示的wsimport命令。但是,在执行此操作之前,请确保已按照步骤5所述运行OrderWebServicePublisher来发布Web服务。在生成JAX-WS工件部分中 。
-keep选项指示您保留生成的文件, -p选项指定需要在其中生成构件的软件包名称。 http://localhost:8080/OrderProcessWeb/orderprocess?wsdl指定WSDL文件的位置。 以下工件是从OrderProcessService WSDL生成的:
JAXB类( Address , Customer , OrderBean和OrderItem ):通过读取OrderProcessService WSDL中定义的模式定义生成 RequestWrapper和ResponseWrapper类( ProcessOrder和ProcessOrderResponse ):将输入和输出包装为文档文字包装样式 服务类( OrderProcess ):您的客户端用于向Web服务发出请求的类 服务接口( OrderProcessService ):类包含您的服务实现的接口现在看一下如何使用上面生成的构件来创建Web服务客户端。 com \ ibm \ jaxws \ tutorial \ service \ client文件夹中提供了示例参考代码。 清单13提供了Web服务客户端的代码。
上面列出的Web服务客户端代码:
通过传入OrderProcess Web服务的WSDL URL和服务的QName来创建OrderProcess类的实例。 创建OrderBean的实例,并在populateOrder()方法中填充订单信息。 通过在服务上调用getOrderProcessPort()来检索该服务的代理(也称为端口getOrderProcessPort() 。 端口实现服务定义的服务接口。 调用端口的processOrder方法,并传递在OrderBean的第二个列表项中创建的OrderBean实例。 从服务获取OrderBean响应并打印订单ID。要运行Web服务客户端,请首先通过运行JAXWS-Tutorial文件夹中的以下命令来编译Web服务客户端:
javac com\ibm\jaxws\tutorial\service\client\OrderClient.java
通过使用以下命令提供定单处理Web服务的WSDL URL,执行Web服务客户端:
java com.ibm.jaxws.tutorial.service.client.OrderClient http://localhost:8080/OrderProcessWeb/orderprocess?wsdl
当执行Web服务客户端时,您将在运行OrderWebServicePublisher的控制台上看到以下输出:
processOrder called for customer A123 Number of items is 1
在执行Web服务客户端的控制台上,您将获得以下输出:
Order id is A1234
正如在客户端代码中看到的那样,您不会处理用于调用Web服务操作的任何基于SOAP或XML的格式。 取而代之的是,您处理生成的用于输入和输出消息的JAXB类,并使用服务接口和服务类对象,它们充当Web服务调用的存根。 存根负责根据JAXB批注创建SOAP请求,并将SOAP响应转换回Java对象。
您现在已经成功创建并发布了Web服务,并通过Web服务客户端执行了该服务!
在本教程中,您学习了如何使用代码优先的开发方法和JAX-WS技术来设计和开发Web服务。 JAX-WS是一个不错的选择,因为它提供了完整的Web服务堆栈,以简化Web服务的开发和部署。
您在本教程中开发的订单处理Web服务使用文档样式的Web服务,该服务可确保服务使用者和服务提供者使用XML文档进行通信。 XML文档遵守定义良好的合同,通常使用XML Schema定义创建合同。 XML模式格式指定服务使用者可以调用的业务消息的合同,并遵守该合同。 文档样式的Web服务应该是开发企业Web服务的首选方法。
翻译自: https://www.ibm.com/developerworks/webservices/tutorials/ws-jax/ws-jax.html
相关资源:微信小程序源码-合集6.rar