开发JAX-WS 2.0 Web服务

简介:

实现一个Web服务的过程,大概有3个基本的过程:

  • Web服务提供者设计并开发Web服务
  • Web服务提供者发布Web服务
  • Web服务请求者调用Web服务

下面,我通过一个例子,来实现上述过程:
假设一个Web服务提供者提供一个对域名进行探测解析的服务,给定一个域名,可以给出改域名解析后对应的IP地址列表。Web服务提供者设计并开发这个Web服务,然后将服务发布出去,并可以让Web服务请求者进行调用。

开发Web服务

服务接口文件DetectionService.java代码如下所示:

1 package org.shirdrn.server.webservices.jaxws;
2
3 public interface DetectService {
4 DetectedResult detect(String domain);
5 }

对应的实现类DomainDetectionService.java,如下所示:

01 package org.shirdrn.server.webservices.jaxws;
02
03 import java.net.InetAddress;
04 import java.net.UnknownHostException;
05 import java.util.Date;
06
07 import javax.jws.WebMethod;
08 import javax.jws.WebService;
09 import javax.jws.soap.SOAPBinding;
10
11 import org.xbill.DNS.Address;
12
13 @WebService(serviceName = "DomainDetector",portName = "DomainDetectorPort",
14 targetNamespace = "http://ws.shirdrn.org/jaxws/WSDomainDetector")
15 @SOAPBinding(style=SOAPBinding.Style.DOCUMENT,use=SOAPBinding.Use.LITERAL,
16 parameterStyle=SOAPBinding.ParameterStyle.WRAPPED)
17 public class DomainDetectService implements DetectService {
18
19 @WebMethod
20 public DetectedResult detect(String domain) {
21 DetectedResult result = new DetectedResult();
22 result.setStartTime(new Date());
23 try {
24 InetAddress[] addresses = Address.getAllByName(domain);
25 for(InetAddress addr : addresses) {
26 result.getIpAddresses().add(addr.getHostAddress());
27 }
28 } catch (UnknownHostException e) {
29 e.printStackTrace();
30 } finally {
31 result.setFinishTime(new Date());
32 result.setTimeTaken(result.getFinishTime().getTime() - result.getStartTime().getTime());
33 }
34 return result;
35 }
36
37 }

上面用到一个DtectedResult类,如下所示:

01 package org.shirdrn.server.webservices.jaxws;
02
03 import java.util.ArrayList;
04 import java.util.Date;
05 import java.util.List;
06
07 public class DetectedResult {
08
09 private Date startTime;
10 private Date finishTime;
11 private long timeTaken;
12 private List<String> ipAddresses = new ArrayList<String>();
13
14 public Date getStartTime() {
15 return startTime;
16 }
17
18 public void setStartTime(Date startTime) {
19 this.startTime = startTime;
20 }
21
22 public Date getFinishTime() {
23 return finishTime;
24 }
25
26 public void setFinishTime(Date finishTime) {
27 this.finishTime = finishTime;
28 }
29
30 public long getTimeTaken() {
31 return timeTaken;
32 }
33
34 public void setTimeTaken(long timeTaken) {
35 this.timeTaken = timeTaken;
36 }
37
38 public List<String> getIpAddresses() {
39 return ipAddresses;
40 }
41
42 public void setIpAddresses(List<String> ipAddresses) {
43 this.ipAddresses = ipAddresses;
44 }
45
46 }

生成Web Service描述文件(WSDL),如下所示:

1 shirdrn@SYJ:~$ cd ~/programs/eclipse-java-juno/workspace/self_practice/bin
2 shirdrn@SYJ:~/programs/eclipse-java-juno/workspace/self_practice/bin$ wsgen -cp . org.shirdrn.server.webservices.jaxws.DomainDetectService -wsdl
3 shirdrn@SYJ:~/programs/eclipse-java-juno/workspace/self_practice/bin$ ls
4 com DomainDetector_schema1.xsd DomainDetector.wsdl log4j.properties main org server.xml test
5 shirdrn@SYJ:~/programs/eclipse-java-juno/workspace/self_practice/bin$ cp DomainDetect* /home/shirdrn/programs/eclipse-java-juno/workspace/self_practice/src/org/shirdrn/server/webservices/jaxws/wsdl

经过上面步骤,生成了两个文件:DomainDetect_schema1.xsd和DomainDetect.wsdl,内容分别如下所示:

  • DomainDetector_schema1.xsd内容
01 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
02 <xs:schema version="1.0"targetNamespace="http://ws.shirdrn.org/jaxws/WSDomainDetector"
03 xmlns:tns="http://ws.shirdrn.org/jaxws/WSDomainDetector"xmlns:xs="http://www.w3.org/2001/XMLSchema">
04
05 <xs:element name="detect" type="tns:detect" />
06
07 <xs:element name="detectResponse" type="tns:detectResponse" />
08
09 <xs:complexType name="detect">
10 <xs:sequence>
11 <xs:element name="arg0" type="xs:string" minOccurs="0" />
12 </xs:sequence>
13 </xs:complexType>
14
15 <xs:complexType name="detectResponse">
16 <xs:sequence>
17 <xs:element name="return" type="tns:detectedResult" minOccurs="0"/>
18 </xs:sequence>
19 </xs:complexType>
20
21 <xs:complexType name="detectedResult">
22 <xs:sequence>
23 <xs:element name="finishTime" type="xs:dateTime" minOccurs="0" />
24 <xs:element name="ipAddresses" type="xs:string" nillable="true"
25 minOccurs="0" maxOccurs="unbounded" />
26 <xs:element name="startTime" type="xs:dateTime" minOccurs="0" />
27 <xs:element name="timeTaken" type="xs:long" />
28 </xs:sequence>
29 </xs:complexType>
30 </xs:schema>
  • DomainDetector.wsdl内容
01 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
02 <!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS
03 RI 2.1.6 in JDK 6. -->
04 <definitions targetNamespace="http://ws.shirdrn.org/jaxws/WSDomainDetector"
05 name="DomainDetector" xmlns="http://schemas.xmlsoap.org/wsdl/"xmlns:tns="http://ws.shirdrn.org/jaxws/WSDomainDetector"
06 xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
07 <types>
08 <xsd:schema>
09 <xsd:importnamespace="http://ws.shirdrn.org/jaxws/WSDomainDetector"
10 schemaLocation="DomainDetector_schema1.xsd" />
11 </xsd:schema>
12 </types>
13 <message name="detect">
14 <part name="parameters" element="tns:detect" />
15 </message>
16 <message name="detectResponse">
17 <part name="parameters" element="tns:detectResponse" />
18 </message>
19 <portType name="DomainDetectService">
20 <operation name="detect">
21 <input message="tns:detect" />
22 <output message="tns:detectResponse" />
23 </operation>
24 </portType>
25 <binding name="DomainDetectorPortBinding" type="tns:DomainDetectService">
26 <soap:binding transport="http://schemas.xmlsoap.org/soap/http"
27 style="document" />
28 <operation name="detect">
29 <soap:operation soapAction="" />
30 <input>
31 <soap:body use="literal" />
32 </input>
33 <output>
34 <soap:body use="literal" />
35 </output>
36 </operation>
37 </binding>
38 <service name="DomainDetector">
39 <port name="DomainDetectorPort" binding="tns:DomainDetectorPortBinding">
40 <soap:address location="REPLACE_WITH_ACTUAL_URL" />
41 </port>
42 </service>
43 </definitions>

可以看到,在wsdl文件中通过import引用了前面的schema文件,这个schema文件用于定义类型。

发布Web服务

我们可以发布我们上面开发的Web服务,代码如下所示:

01 package org.shirdrn.server.webservices.jaxws;
02
03 import javax.xml.ws.Endpoint;
04
05 public class PublishingServer {
06
07
08 public static void main(String[] args) {
09 String address ="http://172.0.8.212:9033/ws/services/DomainDetectService";
10 DetectService domainDetectService = new DomainDetectService();
11
12 Endpoint.publish(address, domainDetectService);
13 }
14
15 }

可以查看本地运行的Web服务进程:

1 shirdrn@SYJ:~/programs/eclipse-java-juno/workspace/self_practice/src/org/shirdrn/server/webservices/jaxws$ sudo netstat -nap | grep 9033
2 tcp6 0 0 172.0.8.212:9033 :::* LISTEN 8302/java
3 shirdrn@SYJ:~/programs/eclipse-java-juno/workspace/self_practice/src/org/shirdrn/server/webservices/jaxws$ jps
4 8302 PublishingServer
5 8358 Jps

可见,服务发布成功。
也可以在浏览器中打开链接:http://172.0.8.212:9033/ws/services/DomainDetectService?wsdl,就能看到发布的WSDL,内容如下所示:

01 <!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.6 in JDK 6. -->
02 <!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.6 in JDK 6. -->
03 <definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
04 xmlns:tns="http://ws.shirdrn.org/jaxws/WSDomainDetector"xmlns:xsd="http://www.w3.org/2001/XMLSchema"
05 xmlns="http://schemas.xmlsoap.org/wsdl/"targetNamespace="http://ws.shirdrn.org/jaxws/WSDomainDetector"
06 name="DomainDetector">
07 <types>
08 <xsd:schema>
09 <xsd:import namespace="http://ws.shirdrn.org/jaxws/WSDomainDetector"
10 schemaLocation="http://172.0.8.212:9033/ws/services/DomainDetectService?xsd=1" />
11 </xsd:schema>
12 </types>
13 <message name="detect">
14 <part name="parameters" element="tns:detect" />
15 </message>
16 <message name="detectResponse">
17 <part name="parameters" element="tns:detectResponse" />
18 </message>
19 <portType name="DomainDetectService">
20 <operation name="detect">
21 <input message="tns:detect" />
22 <output message="tns:detectResponse" />
23 </operation>
24 </portType>
25 <binding name="DomainDetectorPortBinding" type="tns:DomainDetectService">
26 <soap:binding transport="http://schemas.xmlsoap.org/soap/http"
27 style="document" />
28 <operation name="detect">
29 <soap:operation soapAction="" />
30 <input>
31 <soap:body use="literal" />
32 </input>
33 <output>
34 <soap:body use="literal" />
35 </output>
36 </operation>
37 </binding>
38 <service name="DomainDetector">
39 <port name="DomainDetectorPort" binding="tns:DomainDetectorPortBinding">
40 <soap:address
41 location="http://172.0.8.212:9033/ws/services/DomainDetectService" />
42 </port>
43 </service>
44 </definitions>

调用Web服务

首先要根据服务提供者发布的Web服务,生成服务请求者客户端代码,如下所示:

01 shirdrn@SYJ:~/programs/eclipse-java-juno/workspace/self_practice/bin$ wsimport -keep -p org.shirdrn.client.webservices.jaxwshttp://172.0.8.212:9033/ws/services/DomainDetectService?wsdl
02 parsing WSDL...
03
04 generating code...
05
06 compiling code...
07 shirdrn@SYJ:~/programs/eclipse-java-juno/workspace/self_practice/bin$ cd org/shirdrn/client/webservices/jaxws/
08 shirdrn@SYJ:~/programs/eclipse-java-juno/workspace/self_practice/bin/org/shirdrn/client/webservices/jaxws$ cp *.java /home/shirdrn/programs/eclipse-java-juno/workspace/self_practice/src/org/shirdrn/client/webservices/jaxws
09 shirdrn@SYJ:~/programs/eclipse-java-juno/workspace/self_practice/bin/org/shirdrn/client/webservices/jaxws$ cd ~/programs/eclipse-java-juno/workspace/self_practice/src/org/shirdrn/client/webservices/jaxws/
10 shirdrn@SYJ:~/programs/eclipse-java-juno/workspace/self_practice/src/org/shirdrn/client/webservices/jaxws$ ls
11 DetectedResult.java DetectResponse.java DomainDetector.java ObjectFactory.java
12 Detect.java DomainDetectService.java package-info.java

上面自动生成了客户端代码的骨架,如下几个文件:

  • DetectedResult.java
  • DetectResponse.java
  • DomainDetector.java
  • ObjectFactory.java
  • Detect.java
  • DomainDetectService.java
  • package-info.java

基于这些代码,就可以实现服务请求者对服务提供者发布服务的调用。我们实现了一个简单的调用,代码如下所示:

01 package org.shirdrn.client.webservices.jaxws;
02
03 public class DomainDetectClient {
04
05 public static void main(String[] args) {
06 DomainDetector detector = new DomainDetector();
07 String domain = "baidu.com";
08 DetectedResult result = detector.getDomainDetectorPort().detect(domain);
09 System.out.println(result.getIpAddresses());
10 }
11
12 }

调用后可以返回对域名进行解析后得到的IP地址列表,结果如下所示:

1 [220.181.111.86, 123.125.114.144, 220.181.111.85]

到此为止,我们完成了一个简单的Web Service的开发、发布、调用的过程。

目录
相关文章
|
9月前
|
开发框架 监控 安全
Windows Defender 导致 Web IIS 服务异常停止排查
某日凌晨IIS服务异常停止,经查为Windows Defender安全补丁KB2267602触发引擎更新,导致系统资源波动,进而引发应用池回收。确认非人为操作,系统无重启。通过分析日志与监控,定位原因为Defender更新后扫描加重负载。解决方案:将IIS及.NET相关路径添加至Defender排除列表,避免业务影响。
975 116
|
9月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
669 4
|
缓存 JavaScript 前端开发
鸿蒙5开发宝藏案例分享---Web开发优化案例分享
本文深入解读鸿蒙官方文档中的 `ArkWeb` 性能优化技巧,从预启动进程到预渲染,涵盖预下载、预连接、预取POST等八大优化策略。通过代码示例详解如何提升Web页面加载速度,助你打造流畅的HarmonyOS应用体验。内容实用,按需选用,让H5页面快到飞起!
|
JavaScript 前端开发 API
鸿蒙5开发宝藏案例分享---Web加载时延优化解析
本文深入解析了鸿蒙开发中Web加载完成时延的优化技巧,结合官方案例与实际代码,助你提升性能。核心内容包括:使用DevEco Profiler和DevTools定位瓶颈、四大优化方向(资源合并、接口预取、图片懒加载、任务拆解)及高频手段总结。同时提供性能优化黄金准则,如首屏资源控制在300KB内、关键接口响应≤200ms等,帮助开发者实现丝般流畅体验。
|
前端开发 JavaScript Shell
鸿蒙5开发宝藏案例分享---Web页面内点击响应时延分析
本文为鸿蒙开发者整理了Web性能优化的实战案例解析,结合官方文档深度扩展。内容涵盖点击响应时延核心指标(≤100ms)、性能分析工具链(如DevTools时间线、ArkUI Trace抓取)以及高频优化场景,包括递归函数优化、网络请求阻塞解决方案和setTimeout滥用问题等。同时提供进阶技巧,如首帧加速、透明动画陷阱规避及Web组件初始化加速,并通过优化前后Trace对比展示成果。最后总结了快速定位问题的方法与开发建议,助力开发者提升Web应用性能。
|
JSON 开发框架 自然语言处理
【HarmonyOS Next之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(三)
本文主要介绍了应用开发中的三大核心内容:生命周期管理、资源限定与访问以及多语言支持。在生命周期部分,详细说明了应用和页面的生命周期函数及其触发时机,帮助开发者更好地掌控应用状态变化。资源限定与访问章节,则聚焦于资源限定词的定义、命名规则及匹配逻辑,并阐述了如何通过 `$r` 引用 JS 模块内的资源。最后,多语言支持部分讲解了如何通过 JSON 文件定义多语言资源,使用 `$t` 和 `$tc` 方法实现简单格式化与单复数格式化,为全球化应用提供便利。
401 104
|
JavaScript 前端开发 API
【HarmonyOS Next之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(二)
本文介绍了HarmonyOS应用开发中的HML、CSS和JS语法。HML作为标记语言,支持数据绑定、事件处理、列表渲染等功能;CSS用于样式定义,涵盖尺寸单位、样式导入、选择器及伪类等特性;JS实现业务逻辑,包括ES6语法支持、对象属性、数据方法及事件处理。通过具体代码示例,详细解析了页面构建与交互的实现方式,为开发者提供全面的技术指导。
498 104
|
开发框架 安全 前端开发
Go Web开发框架实践:模板渲染与静态资源服务
Gin 是一个功能强大的 Go Web 框架,不仅适用于构建 API 服务,还支持 HTML 模板渲染和静态资源托管。它可以帮助开发者快速搭建中小型网站,并提供灵活的模板语法、自定义函数、静态文件映射等功能,同时兼容 Go 的 html/template 引擎,具备高效且安全的页面渲染能力。
|
开发框架 JSON 中间件
Go语言Web开发框架实践:使用 Gin 快速构建 Web 服务
Gin 是一个高效、轻量级的 Go 语言 Web 框架,支持中间件机制,非常适合开发 RESTful API。本文从安装到进阶技巧全面解析 Gin 的使用:快速入门示例(Hello Gin)、定义 RESTful 用户服务(增删改查接口实现),以及推荐实践如参数校验、中间件和路由分组等。通过对比标准库 `net/http`,Gin 提供更简洁灵活的开发体验。此外,还推荐了 GORM、Viper、Zap 等配合使用的工具库,助力高效开发。
|
设计模式 Web App开发 存储
移动 Web 开发的10个优秀 JavaScript 框架
选择正确的 JavaScript 框架,对于开发移动 Web 应用程序是至关重要的,也是移动应用程序开发的一项重要任务。开发人员可以使用框架实现的功能高效地达到他们的开发目标。这些预实现的组件采用优秀的设计模式和最佳实践,促进应用程序以标准化的方式开发。最重要的是,它让开人员在开发过程中得心应手。
865 0
移动 Web 开发的10个优秀 JavaScript 框架