利用JAX-WS开发Web服务

本文提供了一个使用Java如何开发基于SOAP的Web Services,其客户端可以是Perl、Ruby、Python或Java等。

Java SE 6封装了JAX-WS(Java API for XML-Web Services),而JAX-WS同时支持基于SOAP的Web服务和REST风格的Web服务。JAX-WS通常可简写为JWS,当前,JWS的版本为2.x。

基于SOAP的Web服务可用单个Java类的实现,但是最好是用“接口+实现”的方式来实现最佳。

Web服务的接口称为SEI,即Service Endpoint Interface;
而Web服务的实现称为SIB,即Service Implementation Bean。

SIB可以是一个POJO,也可以是无状态的会话EJB。本文的SIB是普通Java类,通过JDK 6的类库即可实现Web服务的发布。

代码1:服务接口类SEI

package myweb.service; import javax.jws.WebService; import javax.jws.WebMethod; import javax.jws.soap.SOAPBinding; import javax.jws.soap.SOAPBinding.Style; @WebService @SOAPBinding(style=Style.RPC) public interface TimeServer { @WebMethod String getTimeAsString(); @WebMethod long getTimeAsElapsed(); }

代码2:服务实现类SIB

package myweb.service; import java.text.DateFormat; import java.util.Date; import javax.jws.WebService; @WebService(endpointInterface = "myweb.service.TimeServer") public class TimeServerImpl implements TimeServer { /** * 返回从1970年1月1日0点0时0分起的毫秒数 */ public long getTimeAsElapsed() { return new Date().getTime(); } /** * 返回如“2009-12-21”格式的日期 */ public String getTimeAsString() { Date date = new Date(); DateFormat df = DateFormat.getDateInstance(); return df.format(date); } }

代码3:服务发布类Publisher

package myweb.service; import javax.xml.ws.Endpoint; public class TimeServerPublisher { public static void main(String[] args){ // 第一个参数是发布的URL // 第二个参数是SIB实现 Endpoint.publish("http://127.0.0.1:10100/myweb", new TimeServerImpl()); } }

编译以上代码:

javac myweb/service/*.java

运行服务:

java myweb/service/TimeServerPublisher

在浏览器地址栏输入:

http://localhost:10100/myweb?wsdl

显示如下图所示:

也可编写客户端代码测试服务。

Java客户端:

package myweb.client; import javax.xml.namespace.QName; import javax.xml.ws.Service; import java.net.URL; import myweb.service.*; public class TimeClient { public static void main(String[] args) throws Exception{ URL url = new URL("http://localhost:10100/myweb?wsdl"); // 第一个参数是服务的URI // 第二个参数是在WSDL发布的服务名 QName qname = new QName("http://service.myweb/","TimeServerImplService"); // 创建服务 Service service = Service.create(url, qname); // 提取端点接口,服务“端口”。 TimeServer eif = service.getPort(TimeServer.class); System.out.println(eif.getTimeAsString()); System.out.println(eif.getTimeAsElapsed()); } }

运行客户端,显示结果如下:

2009-12-21
1261402511859

也可用Ruby编写客户端,如下:

#!/usr/bin/ruby # one Ruby package for SOAP-based services require 'soap/wsdlDriver' wsdl_url = 'http://127.0.0.1:10100/myweb?wsdl' service = SOAP::WSDLDriverFactory.new(wsdl_url).create_rpc_driver # Save request/response messages in files named '...soapmsgs...' service.wiredump_file_base = 'soapmsgs' # Invoke service operations. result1 = service.getTimeAsString result2 = service.getTimeAsElapsed # Output results. puts "Current time is: #{result1}" puts "Elapsed milliseconds from the epoch: #{result2}"

运行结果相同!

利用JAX-WS开发Web服务相关推荐

  1. 用 ASP.NET 开发 Web 服务的五则技巧

    (转的,作者不详) 一.禁用HTTP POST/GET协议 除非另外指定,否则,.NET将试图把Web服务绑定到三种协议:HTTP/POST.HTTP/GET和SOAP.之所以说"试图&qu ...

  2. ASP.NET编程技术-用ASP.NET开发Web服务的五则技巧

    ASP.NET编程技术-用ASP.NET开发Web服务的五则技巧 ------------------------------------------------------------------- ...

  3. [转载]SUN ONE 开发 WEB 服务

    SUN ONE 开发 WEB 服务 实施摘要 本文对在北美的一家最大能源公司TransCanada PipeLines Limited的原型Web服务实现做了高层次的技术回顾.TransCanada的 ...

  4. 微信小程序开发实战3 使用Go语言开发Web服务

    3.使用Go语言开发Web服务 微信小程序提供了一系列服务端API用以配合小程序前端来完成相应的功能,以及帮助开发者进行各类数据分析.业务管理和信息查询等操作.例如小程序用户信息的获取就是通过服务端A ...

  5. java 利用JAX-RS快速开发RESTful 服务

    JAX-RS(Java API for RESTful Web Services)同样也是JSR的一部分,详细规范定义见 https://jcp.org/en/jsr/detail?id=311 .从 ...

  6. golang打包HTML为Android,使用Go开发Web服务,并打包html/js/css等静态资源文件

    Go的高性能,使它天生适合开发io方面的服务,Web服务当然不再话下.同时,Go编译后生成的单文件不是字节码,而是对应平台的机器码,因此它效率更高.资源占用更低. 为了更好的进程程序管理,移动程序时更 ...

  7. python bottle框架搭建_python开发web服务 bottle框架

    开发功能不是特别复杂的web服务,可以考虑使用bottle框架.原因:一.Python开发效率高呀!不信你比比同样的功能Python几行可以搞定?换java试试?换C++试试?作为这几种语言都使用过的 ...

  8. 使用 Flex 开发 Web 服务客户端

    写了很多的flex调用 web服务的程序,也有很多体会,只是没总结过(以前写过一个完整的flex版手机网站,用axis做web服务的,可惜啊!),现在IBM的developerWorks发表了一篇讲的 ...

  9. 一个Axis2 + eclipse开发Web服务的例子SayHi

    快速开始 1.1创建webApps项目 启动Eclipse,新建立一个WebApps(File->New->Project->动态Web Project),给Project Name ...

最新文章

  1. MESI协议为何会引发 有序性、可见性的问题
  2. IOS错误总结:Unknown type name 'CGRect';did you mean 'Rect'
  3. 利用freopen()函数和fc命令简化程序调试
  4. 1.4 为什么深度学习会兴起-深度学习-Stanford吴恩达教授
  5. 拿了 30K 的 offer!
  6. 法学教授:洋文凭情结是对教育体制的嘲弄
  7. Sqoop(四)增量导入、全量导入、减量导入
  8. matlab图像处理函数大全
  9. Linux的cifs(samba)文件服务
  10. Android AlarmManager设置多个定时事件时只最后一个有效问题解决
  11. 原创 leetcode[349]两个数组的交集/ Intersection of Two Arrays 哈希策略
  12. 基于案例学SQL优化-全套视频教程免费下载
  13. 电脑录屏的html文件,怎样用电脑录制网页上的视频? 屏幕录像的实用方法
  14. 6. DICOM图像显示-DCMTK-像素数据获取的三种方式和源码分析
  15. 网络防火墙的配置与管理
  16. ESP8266学习笔记(3)——GPIO接口使用
  17. c语言中字母大写转小写,C语言中字母大小写转换的简单操作
  18. wxpython中表格顶角怎么设置,wxpython listctrl并修复列宽
  19. java使用geotools读取shp文件
  20. 冠军专访:是情侣,更是夺冠道路上的最佳伙伴

热门文章

  1. Python:操作dict时避免出现KeyError的几种方法
  2. HTTP 错误500.19 - 错误代码 0x80070021
  3. Pylint pylint设置不检查项
  4. 网站降权不必慌 扭转乾坤有绝招
  5. 水利数字孪生工程 推动智慧水利信息化建设和调度
  6. Leetcode 398 蓄水池抽样算法
  7. c语言常量修饰符的作用,C语言杂记(10):关于常量修饰符const
  8. 如何进行家居智能装饰
  9. 南京市推出新举措 用以做大做强软件产业
  10. ipad pro 生产力指南 2.1 下载