`
king_tt
  • 浏览: 2234555 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

5天学会jaxws-webservice编程第一天

阅读更多

前言:

随着近几年来,SOA,EAI等架构体系的日渐成熟,Webservice越来越炽手可热,尤其是在企业做异质平台整合时成为了首选的技术。

Java的Webservice技术更是层出不穷,比较流行的有:

Axis2,Spring WS以及Jaxws。

本人在日常工作和以往工程中,在使用了上述这些Webservice后进行了总结,比较,最终觉得jaxws是目前最标准,需要额外第三方插件最少,配置最少最灵活的webservice。

JAXWS适合几乎所有Webservice客户端的调用,因此不少巨头型的厂商如:IBM,Weblogic等,在他们的产品上都使用了以JAXWS为标准的Webservice接口。

本教程分成五天,为初级教程。

通过本教程,可以使一个没有Webservice概念或者没有写过Webservice的JAVA Resource快速上手入门,并能满足一般中小型项目中Webservice的应用。

对于Webservice Security,在(初级)教程中并不提供,会在高级教程中详细描述。

不过真正利用Webservice Security特性即XML加密技术的工程并不多,少之又少,大多还是以http: //xxx/xxxService?userId=&password=这样的形式来进行“假安全”通讯的。

必经我们的大部分项目是运行在Intranet里的,而且有很好的监控和布防。

下面开始我们的教程。

 

第一天

 

目标:

1. 理解jaxws

2. 写jaxws之前的准备工作

3. 一切始于HelloWorld

4. 理解同步,异步

一、理解jaxws

1.1JAX-WS概述

JAX-WS2.0 的全称为 Java API for XML-Based Webservices (JAX-WS) 2.0。JAX-WS 2.0 是对 JAX-RPC 1.0 规范的扩展,是 JAX-RPC 1.1 的后续版本, JAX-RPC 2.0 标准发布不久后便被重新命名为 JAX-WS 2.0。 JAX-WS 2.0 是面向 Java 5 的开发 Web services 的最新编程标准,它提供了新的编程模型和对以往的 JAX-RPC 方式的 Web services 进行了增强。 JAX-WS2.0 (JSR 224)是Sun新的web services协议栈,是一个完全基于标准的实现。在binding层,使用的是the Java Architecture for XMLBinding (JAXB, JSR 222),在parsing层,使用的是the Streaming API for XML (StAX, JSR 173),同时它还完全支持schema规范。

1.2JAX-WS 2.1特性

支持SOAP 1.1(默认)、1.2

支持XML/HTTP Binding

支持WS-Addressing

支持document/literal样式

支持WS-I Basic Profile 1.1

支持消息传输优化机制(Message Transmission Optimization Mechanism,MTOM)

二、写jaxws之前的准备工作

2.1JDKjavaversion "1.6.0_x"。

2.2JAX-WS RI 2.1.1 in JDK 6

2.2.1 JAX-WS RI 2.1.1安装注解

JAX-WS RI组件下载后为一个”.jar”文件,它并不能直接在工程中使用,它是一个以JAVA Swing为界面的JAXWS的安装程序包。

我们需要打开一个命令行窗口,并输入:

 

 

输入完这条命令后,你会得到一个安装界面如下:

 

下一步,下一步完成安装后你会得到这样的一个目录:

这个目录里有我们写JAXWS所需的所有lib包以及JAXWS自带的教程。

 

三、一切始于HelloWorld

3.1建立Webservice的Server端工程

 

 

可以看到我们这个目录除传统的src,WebContent目录外还有几个目录,它们分别是:

 

? build
? wsdl
? wssrc

 

我们来书写我们的第一个Webservice吧,它的名字叫Hello(Come on, 老套了,又来了)。

package ctsjavacoe.ws.fromjava;

 

import javax.jws.WebMethod;

import javax.jws.WebService;

 

@WebService

public class Hello {

@WebMethod

public String say(String name) {

return ("Hello: "+name);

}

}

注意:

@WebService

注释在了Class之上,这告诉了JAXWS,此类为Webservice。

@WebMethod

注释在了public方法上,这告诉了JAXWS,此方法为soap方法,该方法有两个参数,一个input的String,一个output的String。

业务逻辑很简单,客户端调用传入一个Name,服务端返回给客户端一个”Hello: “+name的字串。

现在我们通过Java文件来生成Webservice相关布署文件以及调用接口。

3.2通过Java类编译Webservice

JAX-WS 2.0 有两种开发过程:自顶向下和自底向上。自顶向下方式指通过一个 WSDL 文件来创建Web Service,自底向上是从 Java 类出发创建 Web Service。两种开发过程最终形成的文件包括:

1.SEI。一个SEI对应WSDL中WebService的一个port,在Java中是一个Java接口。

2.SEI实现类。

3.WSDL和XSD文件。

结合公司内项目的特点,我们更多的是碰到以下两种情况:

1. Onsite要我们做一个Webservice或者是客户要求我们提供Webservice接口;

2. Onsite已经有一个Webservice了,现在要我们做客户端集成。

 

因此,我们选用Server端通过Java Class生成webservice,而客户端通过wsdl生成Java调用类的做法

 

JAXWS为我们提供了两个工具:

ü wsgen

主要用于Server端通过Java类编译成Webservice及相关的wsdl文件

ü wsimport

主要用于Client端(调用端)通过wsdl编译出调用Server端的Java文件

我们就来生成一下上面的这个Hello,打开一个command窗口,键入如下命令:

 

-wsdl参数代表生成webservice

- s参数代表生成的.java文件置于何处

-d 参数代表生成的编译class文件置于何处(这个可以忽略,我们利用eclipse编译)

-r 参数代表生成的.wsdl文件与.xsd文件生成在何处

-cp参数代表classpath,即Hello.class的所在,为什么我们的-cp后是这么长一个路径呢?请看Eclipse里工程编译输出目录的路径就知道了:

 

3.2.1 生成的src文件

 

好,我们现在回到eclipse工程里,刷新一下工程:

 

看到在wssrc目录下已经生成了我们所需的java文件了,请手工cut(对,是cut)这些文件到我们工程的”src”目录,如果不cut,下次继续使用该目录生成webservice类时,wsgen有时会生成不了,但也不报错,不知道为什么,查了一下,可能是一个bug,因该会在后续的jdk1.6.30up里改进。

3.2.2 生成的wsdl及xsd文件

 

这里我们有两个文件,一个是wsdl文件,这个就是我们的webservice的entry,一个是xsd文件,这个是什么?

这个就是我们java的方法里的参数的对应,或者换句话说,它就是xml格式的java bean,在webservice的世界里,xsd是作为数据结构描述用的。

现在我们的webservice的服务端有了。

3.2.3 布署webservice

布署前的准备:

在工程的WEB-INF目录下建立“sun-jaxws.xml”文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<endpoints xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime'

version='2.0'>

<endpoint name='Hello' implementation='ctsjavacoe.ws.fromjava.Hello'

url-pattern='/HelloService' />

</endpoints>

将ctsjavacoe.ws.fromjava.Hello声明为Web Service。

 

 

 

 

 

 

如果是从WSDL生成的Web Service,则写法为,

<?xml version="1.0" encoding="UTF-8"?>

<endpoints version="2.0" xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime">

<endpoint implementation="ctsjavacoe.ws.fromjava.HelloSEI"

name="Hello" url-pattern="/HelloService" />

</endpoints>

 

修改WEB-INF目录下的web.xml文件,增加如下内容:

<servlet>

<servlet-name>Hello</servlet-name>

<servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>

<load-on-startup>2</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>Hello</servlet-name>

<url-pattern>/HelloService</url-pattern>

</servlet-mapping>

为每一个WebService声明一个com.sun.xml.ws.transport.http.servlet.WSServlet。

 

开始布署:

1. 在tomcat的webapps目录下建立一个目录叫“D:\tomcat2\webapps\JaxWSSample”

2. 把eclipse工程JaxWSSample下WebContent目录下所有的东西copy至该目录下

3. 重启tomcat

在ie中输入:

http://localhost:9090/JaxWSSample/HelloService?wsdl

可以看到我们的webservice已经生成了。

 

3.3通过Server端的WSDL生成供JAVA调用的客户端

3.3.1 同步与异步

 

同步调用,很好理解,即一来一回,Client端request到Server端,Sever端立刻回一个response。

异步调用,就是客户端调用一次服务端后,服务端处理事务并不是即时返回的,比如说传一个600MB文件给服务端,服务端在处理接收和解析文件时,客户端不会马上得到一个响应,它会等待一段时间,等服务器处理完后,再通知客户端“我处理完了”。

3.3.2 利用wsimport产生客户端

我们新建一个eclipse的工程,只需要是JAVA工程就行了,不需要web工程的,因为我们这边只用代码做调用:

 

 

把Server端的wsdl及xsd都手工copy到客户端工程的wsdl目录下。

打开一个cmd窗口敲入如下的命令:

wsimport -keep -d bin -s src wsdl/HelloService.wsdl

 

以上是产生同步客户端的命令。

如果要产生异步客户端命令,需要在工程根目录下建一个binding.xml的文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<bindings xmlns:xsd="http://www.w3.org/2001/XMLSchema"

xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" wsdlLocation="wsdl/HelloService.wsdl"

xmlns="http://java.sun.com/xml/ns/jaxws">

<bindings node="wsdl:definitions">

<enableAsyncMapping>true</enableAsyncMapping>

</bindings>

</bindings>

然后产生客户端代码的wsimport命令也会不一样:

wsimport -keep –b binding.xml -d bin -s src wsdl/HelloService.wsdl

 

 

 

我们来看异步调用的代码(同步代码比异步调用简单,留给大家自己做练习)

wsimport命令会在eclipse工程的src目录中生成你在调用时所用的java src文件。

 

Hello.java与HelloService.java是wsimport给我们生成的供客户端调用的java文件。

我们把HelloService文件打开,可以看到两行:

file:/D:/workspace/JaxWSClient/wsdl/HelloService.wsdl

把它们改成:

http://localhost:9090/JaxWSSample/HelloService?wsdl

有两行,尤其是Url url=这一行,千万不要漏改了。

 

我们创建一个调用类,叫:HelloAsyncPollingClient.java文件,内容如下:

package ctsjavacoe.ws.fromjava;

 

import javax.xml.ws.Response;

 

public class HelloAsyncPollingClient {

 

/**

* @param args

*/

public static void main(String[] args) throws Exception {

HelloService service = new HelloService();

Hello port = service.getHelloPort();

Response<SayResponse> sayAsync = port.sayAsync("Mk");

while (!sayAsync.isDone()) {

System.out.println("is not down");

}

try {

SayResponse callNameResponse = sayAsync.get();

String message = callNameResponse.getReturn();

System.out.println(message);

} catch (Exception ex) {

}

}

 

}

运行,得到结果如下:

 

3.3.3 细说同步与异步

 

在旧的基于JAX-RPC的webservice编程model中,是不支持异步的service 调用的,在最新的Jax-ws webservice 编程model中,加入了对webservice的异步调用的支持。

首先我来讲一下它的原理,大家不要以为在异步的调用下,从client到server 之间的soap message 流也是异步的,其实不是,Soap/Http 协议在同步跟异步的调用下是一样的,都是客户端的service在运行时打开一个connectin,发送请求,然后接收返回,这些都在同一个connection中。这种方式对我们有什么影响呢?从客户端程序的角度来讲,没有影响,客户端的编程模型是由WSDL中的messages跟port types 来定义的,只要这些东西没有改变,request 跟response是不是在同一个Tcp/ip 的session 中来发送对与我们来说没由影响,然后从架构跟资源的角度来讲,对我们的影响就大了,把连接层的资源跟应用层的程序运行状态绑定起来是由许多弊端的,假如在异步调用时,程序运行出现了异常,将会导致连接层的资源被一直占用,这样会极大的影响我们程序的,稳定性,可靠性,资源的使用跟性能。

 

 

3.3.4 异步的另一种实现

上例中实现的是一种“polling方式的异步调用”,下面给出“callback”方式的异步调用客户端。

由于此callBack当请求发出去以后当前的这个connection就会关闭 ,为了达到测试的目的,加入了sleep,让客户端程序等待服务器端得返回。

callback类型的client要传入一个javax.xml.ws.AsyncHandler类型的匿名内部类,当soapMessage 到达时,Jax-ws会调handleResponse这个方法来处理response.

客户端测试代码如下:

package ctsjavacoe.ws.fromjava;

import javax.xml.ws.AsyncHandler;

import javax.xml.ws.Response;

public class HelloAsyncCallBackClient {

public static void main(String[] args) throws Exception {

HelloService service = new HelloService();

Hello port = service.getHelloPort();

port.sayAsync("Mk", new AsyncHandler<SayResponse>() {

public void handleResponse(Response<SayResponse> res) {

try {

SayResponse response = null;

response = res.get();

String message = response.getReturn();

System.out.println(message);

} catch (Exception e) {

e.printStackTrace();

}

}

});

Thread.sleep(1000);

}

}

分享到:
评论

相关推荐

    实验室管理系统 微信小程序+SSM毕业设计 源码+数据库+论文+启动教程.zip

    实验室管理系统 微信小程序+SSM毕业设计 源码+数据库+论文+启动教程 项目启动教程:https://www.bilibili.com/video/BV1BfB2YYEnS

    基于java的苹果网吧计费管理系统设计与实现.docx

    基于java的苹果网吧计费管理系统设计与实现.docx

    纸中世界-跳跃游戏.sb3

    纸中世界-跳跃游戏.sb3

    Keysight 网络分析仪新建校准件操作指导

    本操作指导用于在 ENA 系列网络分析仪 E5080B 上自定义校准件。目前 Keysight 网络分析仪的 PNA 系列 N52xxB、P50xx 系列、P937x 系列、PXI 板卡式网分以及 ENA 系列的 E5080B、E5081B 的操作界面均统一到如下界面,操作方式相同。

    调查海域浮游动物各类群栖息密度的空间分布表格.docx

    调查海域浮游动物各类群栖息密度的空间分布表格.docx

    ssm框架Java项目源码-高校毕业生就业管理系统+jsp毕设-大作业.zip

    本项目“高校毕业生就业管理系统”是一套基于SSM框架(Spring+SpringMVC+MyBatis)精心开发的Java Web应用,旨在为高校毕业生、高校就业指导部门以及企业用户提供一个高效、便捷的就业信息管理平台。 系统主要功能包括:学生用户可以查看和发布个人简历,搜索并筛选合适的工作岗位,申请心仪的职位;企业用户可以发布招聘信息,筛选和查看应聘者的简历,进行面试邀请等操作;高校就业指导部门则可以对学生的就业情况进行统计和分析,以更好地提供就业指导服务。 此外,系统采用了B/S架构,用户只需通过浏览器即可访问,无需安装客户端软件,方便快捷。数据库设计合理,数据存储安全,系统性能稳定。 本项目的开发,不仅为计算机相关专业的学生提供了一个实践SSM框架的好机会,帮助他们更好地理解和掌握Java Web开发技术,还能有效提升高校毕业生的就业效率和质量。

    使用 Python 进行视频编辑.zip

    电影剪辑 笔记MoviePy 最近升级到 v2.0,引入了重大的重大变化。有关如何更新 v2.0 代码的更多信息,请参阅本指南。MoviePy(在线文档在此处)是一个用于视频编辑的 Python 库剪切、连接、插入标题、视频合成(又名非线性编辑)、视频处理和创建自定义效果。MoviePy 可以读取和写入所有最常见的音频和视频格式,包括 GIF,并且可以在 Windows/Mac/Linux 上运行,并搭载 Python 3.9+。例子在此示例中,我们打开一个视频文件,选择 10 到 20 秒之间的子剪辑,在屏幕中心添加标题,然后将结果写入新文件# Import everything needed to edit video clipsfrom moviepy import *# Load file example.mp4 and keep only the subclip from 00:00:10 to 00:00:20clip = VideoFileClip("long_examples/example2.mp4").with_subcl

    基于java的视频播放器系统设计与实现.docx

    基于java的视频播放器系统设计与实现.docx

    基于java的车辆出租管理系统设计与实现.docx

    基于java的车辆出租管理系统设计与实现.docx

    mqtt等协议的pcap文件

    mqtt等协议的pcap文件

    小白的Python入门教程部分章节源码.zip

    学习python

    修木工施工规范及流程.docx

    修木工施工规范及流程.docx

    适用于 Windows,Linux 和 Python 3 (3.5,3.6,3.7) 的 Tensorflow Faster R-CNN.zip

    适用于 Windows/Linux 和 Python 3 (3.5/3.6/3.7) 的 Tensorflow Faster R-CNNtf-faster-rcnn使用 Python 3 在 Windows 和 Linux 上使用 Tensorflow Faster R-CNN这是在 Windows 和 Linux 上编译 Faster R-CNN 的分支。它深受这里和这里的出色工作的启发。目前,此存储库支持 Python 3.5、3.6 和 3.7。感谢@morpheusthewhite请注意我没有时间或意图修复此分支的所有问题,因为我不将其用于商业用途。我创建此分支只是为了好玩。如果您想做出任何承诺,我们非常欢迎。Tensorflow 已经发布了一个对象检测 API。请参考它。https: //github.com/tensorflow/models/tree/master/research/object_detection如何使用此分支安装 tensorflow,最好是 GPU 版本。按照说明操作。如果没有安装 GPU 版本,则需要注释掉代码中的所有 GP

    章节2:编程基本概念之python程序的构成

    Python是一种高级、解释型、面向对象的编程语言,以其简洁的语法、强大的功能和广泛的应用领域而著称。它无需事先编译,代码在运行时逐行解释执行,提供了极大的灵活性和快速开发的能力。Python支持多种数据类型,包括整数、浮点数、字符串、布尔值、列表、元组、字典和集合等,以及丰富的操作符和流程控制结构,使得开发者可以编写出复杂且灵活的代码。 Python拥有一个广泛的标准库,涵盖了文件操作、网络通信、文本处理、正则表达式、数学运算等多个领域,为开发者提供了大量的模块和函数。此外,Python还拥有丰富的第三方库,如NumPy、Pandas、Matplotlib等用于数据分析和可视化的库,以及Django、Flask等用于Web开发的框架,这些库和框架进一步扩展了Python的应用领域和功能。 Python在Web开发、数据科学、人工智能、自动化运维和游戏开发等多个领域都有广泛的应用。在Web开发方面,Python提供了Django和Flask等强大的Web框架,使得开发者可以轻松地开发出各种Web应用和网站。在数据科学领域,Python是数据科学家的首选工具,其强大的数据处理能力和丰

    毕设源码-基于python的西西家居全屋定制系统的设计与实现_ijsj--论文-期末大作业+说明文档.rar

    本项目是基于Python语言开发的西西家居全屋定制系统,旨在为家居行业提供一个高效、智能的定制解决方案。项目涵盖了从客户需求分析、设计方案生成、材料选购到最终订单生成的全过程,力求实现家居定制的数字化和智能化。 在主要功能方面,系统具备强大的客户管理模块,能够详细记录和分析客户的定制需求。设计模块则采用先进的三维建模技术,为客户提供直观、真实的家居设计方案预览。此外,系统还整合了丰富的材料数据库,方便客户根据自身喜好和预算进行材料选择。 框架方面,项目采用了B/S架构,确保了系统的稳定性和可扩展性。后端使用Python的Django框架,前端则结合了HTML、CSS和JavaScript等技术,实现了用户界面的友好和响应速度。 开发此项目的目的,不仅是为了满足家居行业对个性化定制的需求,也为计算机相关专业的学生提供了一个实践和学习的平台,有助于提升他们的实际开发能力。

    简单连接到 Binance Public API.zip

    Binance公共API连接器Python 这是一个轻量级库,可作为Binance 公共 API的连接器支持的 API/api/*/sapi/*现货 Websocket 市场动态现货用户数据流现货 WebSocket API包含测试用例和示例可定制的基本 URL、请求超时和 HTTP 代理可以显示响应元数据安装pip install binance-connector文档https://binance-connector.readthedocs.ioRESTful API使用示例from binance.spot import Spotclient = Spot()# Get server timestampprint(client.time())# Get klines of BTCUSDT at 1m intervalprint(client.klines("BTCUSDT", "1m"))# Get last 10 klines of BNBUSDT at 1h intervalprint(client.k

    离线安装eclipse的aptana插件详细中文最新版本

    Aptana是一个非常强大,开源,JavaScript-focused的AJAX开发IDE。 Aptana的特点包括: 1JavaScript,HTML,CSS语言的Code Assist功能。 2Outliner(大纲):显示JavaScript,HTML和CSS的代码结构。

    学习自律养成小程序 微信小程序+SSM毕业设计 源码+数据库+论文+启动教程.zip

    学习自律养成小程序 微信小程序+SSM毕业设计 源码+数据库+论文+启动教程 项目启动教程:https://www.bilibili.com/video/BV1BfB2YYEnS

    认知能力评估表.docx

    认知能力评估表.docx

    数学建模学习资料 粒子群算法 先进算法讲义.pdf

    数学建模学习资料 粒子群算法 先进算法讲义.pdf

Global site tag (gtag.js) - Google Analytics