随着近几年来,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. 理解同步,异步
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规范。
支持SOAP 1.1(默认)、1.2
支持XML/HTTP Binding
支持WS-Addressing
支持document/literal样式
支持WS-I Basic Profile 1.1
支持消息传输优化机制(Message Transmission Optimization Mechanism,MTOM)
2.1JDKjavaversion "1.6.0_x"。
JAX-WS RI组件下载后为一个”.jar”文件,它并不能直接在工程中使用,它是一个以JAVA Swing为界面的JAXWS的安装程序包。
我们需要打开一个命令行窗口,并输入:
输入完这条命令后,你会得到一个安装界面如下:
下一步,下一步完成安装后你会得到这样的一个目录:
这个目录里有我们写JAXWS所需的所有lib包以及JAXWS自带的教程。
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里工程编译输出目录的路径就知道了:
好,我们现在回到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调用的客户端
同步调用,很好理解,即一来一回,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) {
}
}
}
|
运行,得到结果如下:
在旧的基于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 中来发送对与我们来说没由影响,然后从架构跟资源的角度来讲,对我们的影响就大了,把连接层的资源跟应用层的程序运行状态绑定起来是由许多弊端的,假如在异步调用时,程序运行出现了异常,将会导致连接层的资源被一直占用,这样会极大的影响我们程序的,稳定性,可靠性,资源的使用跟性能。
上例中实现的是一种“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);
}
}
|
分享到:
相关推荐
本教程“5天学会jaxws-webservice编程”旨在帮助你快速掌握JAX-WS的核心概念和技术,以便在短短五天内能够熟练地运用到实际项目中。 首先,我们需要了解Web服务的基础。Web服务基于开放标准,如SOAP(Simple Object...
webservice中用到的jar,xfire-jaxws-1.2.6.jar,xfire-jaxws-1.2.6.jar,xfire-jaxws-1.2.6.jar
**jaxws-ri-2.3.0** 是JAX-WS的一个实现版本,由Oracle公司提供,它是Java开发者用于实现Web服务的重要工具包。 **JAX-WS RI(Reference Implementation)** 是对JAX-WS规范的参考实现,它为开发人员提供了完整的...
maven 下载jaxws-rt 2.1.4 jar 失败了 其中包含包 com.sun.org.apache.xml.internal resolver 20050927 com.sun.xml.bind jaxb-impl 2.1.7 com.sun.xml.messaging.saaj saaj-impl 1.3.1 ...javax.xml.ws jaxws-api 2.1 ...
jaxws-rt-2.3.3
jaxws-rt-2.2.8.jar java webservice依赖包 在Tomcat中发布webservice时所用到
赠送jar包:cxf-rt-frontend-jaxws-3.0.1.jar; 赠送原API文档:cxf-rt-frontend-jaxws-3.0.1-javadoc.jar; 赠送源代码:cxf-rt-frontend-jaxws-3.0.1-sources.jar; 赠送Maven依赖信息文件:cxf-rt-frontend-jaxws...
还在为找不到jar文件烦心吗,不用了到我空间来有你想要的,持续更新。。。 jaxws-api.jar
【JAX-WS Web服务简介】 JAX-WS(Java API for XML Web Services)是Java平台上用于构建Web服务和客户端的API,它替代了早期的...通过对"jaxws-webservice"的Demo学习,你将能够熟练地运用JAX-WS创建和消费Web服务。
`jaxws-api`工具是JAX-WS的核心组成部分,它包含了一系列的接口和类,使得开发人员可以轻松地在Java应用中实现SOAP(Simple Object Access Protocol)通信。 在给定的压缩包文件中,包含了以下几个关键库文件: 1....
cxf-rt-frontend-jaxws-3.0.16.jar jar包下载3.0.16版本下载
**标题解析:** "jaxws-ri 2.3完整包" 指的是...综上,"jaxws-ri 2.3完整包"是一个用于在Tomcat上开发和部署基于JAX-WS的Web服务的工具集,包含了完整的运行时环境和必要的开发支持,是Java Web服务开发者的重要资源。
安卓用到的额外的jar包,记录在此以备不时之需
**jaxws-api-2.1-1** 是一个与Java API for XML Web Services(JAX-WS)相关的软件包,版本号为2.1-1。JAX-WS是Java平台上的一个标准,用于构建和部署Web服务。它是Sun Microsystems(现已被Oracle公司收购)在Java ...
1. **jaxws-api.jar**:这是JAX-WS的API接口定义,包含了服务端和客户端的接口,如`javax.jws.WebService`注解和相关的数据类型。 2. **jaxws-ri-runtime.jar**:这是JAX-WS运行时实现,提供了服务端和客户端的实现...
5. **性能优化**: jaxws-ri-2.3.0可能包含了一些性能优化,例如更快的序列化/反序列化机制,更高效的内存管理等。 总之,JAX-WS是Java世界中构建和使用Web服务的强大工具,而jaxws-ri-2.3.0则是开发者实现这一功能...
总结来说,"基于jaxws-ri的Web服务项目"是一个涵盖了服务端、客户端和Web客户端的完整示例,展示了如何利用JAX-WS框架创建和消费SOAP Web服务。对于学习和理解Web服务的开发流程,这个项目是一个很好的实践案例。
5. **JAXWS-RI实现**: JAX-WS 2.1的Reference Implementation (RI)提供了一个完整的实现,包括工具和运行时环境,便于开发者快速上手。 6. **注解增强**: 提供了更多的注解,如`@WebService`、`@WebMethod`、`@...
1. **jaxws-api.jar**:这是JAX-WS的API规范,定义了与Web服务相关的接口和类,如`javax.xml.ws.WebServiceClient`和`javax.jws.WebMethod`等。 2. **jaxws-rt.jar**:运行时库,包含了实现JAX-WS规范所需的所有类...
jaxws-api.jar jaxws-rt.jar jaxws-rt-javadoc.jar jaxws-tools.jar jaxws-tools-javadoc.jar jsr181-api.jar management-api.jar mimepull.jar policy.jar saaj-api.jar saaj-impl.jar stax-ex.jar stax2...