`
忆梦竹
  • 浏览: 65850 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

Web Service学习小结——基于JDK自带JAX-WS实现的web service

 
阅读更多
该文组成:
1. 概念解读
2. 例子

Web Service:是使应用程序可以 以 与平台和编程语言无关的方式进行相互通信的一项技术规范。Web服务是一个软件接口,它描述了一组可以在网络上通过标准化的XML消息传递访问的操作。它使用基于XML语言的协议来描述要执行的操作或者要与另一个Web服务交换的数据。

W3School :WSDL:WSDL is a document written in XML. The document describes a Web service. It specifies
the location of the service and the operations (or methods) the service exposes.

SOAP:(Simple Object Access Protocol)简单对象访问协议, 是在分散或分布式的环境中交换信息并执行远程过程调用的轻量级协议,是一个基于XML的协议
W3School :SOAP is a simple XML-based protocol to let applications exchange information over HTTP.

SOAP协议可以说是一种基于HTTP协议之上的一种协议。HTTP协议的请求数据或者响应数据都是文本格式的,而SOAP协议就是将我们应用程序的对象或者数据封装层XML格式的数据,然后作为HTTP的响应数据或者请求数据进行传送。然后通过WS-binding帮助我们在XML格式的数据与应用程序的对象之间进行转换。


以下是使用jdk自带的JAX-WS实现开发的web service

首先开发服务器端的程序:
1. 新建普通的java项目即可。
2. 创建如下结构的类:


先创建一个接口Speakable:
package com.piedra.ws;

import javax.jws.WebService;

@WebService
public interface Speakable {
	public String speak(String from , String to , String cont);
}

要注意,记得写上annotation @WebService。有了接口还需要有一个实现类Duck(会讲话的鸭子):
package com.piedra.ws.impl;

import javax.jws.WebService;

import com.piedra.ws.Speakable;

@WebService(endpointInterface="com.piedra.ws.Speakable")
public class Duck implements Speakable {

	@Override
	public String speak(String from, String to, String cont) {
		return from + " tell " + to + " " + cont ;
	}

}

接口和实现类都开发好了就要发布服务了,发布服务的代码如下:Starter.java
package com.piedra.ws.main;

import javax.xml.ws.Endpoint;

import com.piedra.ws.impl.Duck;

public class Starter {
	public static void main(String[] args) {
		String wsdlURL = "http://localhost:3737/ws";
		Endpoint.publish(wsdlURL, new Duck());
	}
}


发布服务之后我们就可以访问WSDL的定义了:
打开IE浏览器,我们在地址栏输入:http://localhost:3737/ws?wsdl  如下图:



好吧,为了开发一个正常一点的web service项目,我们需要在创建一个java Project。
创建好新的java项目后。我们发现如果要开发的客户端跟服务器端在不同的地方,那么,我们根本无法获得服务,比如我们要调用Duck的speak方法,那是不可能的事情啊,因为客户端和服务器端在不同的机器还可能使用不同的开发语言。
我们可能会想能不能通过上面发布的wsdl地址进行访问?
而wsdl仅仅只是描述用的,根本不用调用。
是的,我们可以让wsdl文件转为我们需要的类和接口。而这个转换过程可以借助wsimport(如果是axis2或者cxf框架可能会有其他的方式——还没看,不了解!)


这样子,在我们的G盘的ws目录下面就会生产我们需要的代码了
将整个包拷贝到我们新创建的客户端项目中,并创建我们需要的测试类


测试类的代码很简单:
package com.piedra.ws.client;

import com.piedra.ws.impl.DuckService;
import com.piedra.ws.impl.Speakable;

public class Test {
	public static void main(String[] args) {
		Speakable duck = new DuckService().getDuckPort();
		System.out.println(duck.speak("lin", "wu", "duck!~"));
	}
}

打印结果:lin tell wu duck!~

JAX-WS实现web service大概就是这样的形式,还有的开发方式是先写wsdl文件,然后再生成客户端和服务器端的代码。还有使用CXF,AXIS2开发web service。

继续学习中、、、、、、

谢谢阅读!!!



  • 大小: 6.7 KB
  • 大小: 12.8 KB
  • 大小: 103.6 KB
  • 大小: 11.7 KB
0
0
分享到:
评论
2 楼 忆梦竹 2013-05-31  
在世界的中心呼喚愛 写道
楼主,按照你的方法在测试类那里出现异常:
[color=red]Caused by: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions
Two classes have the same XML type name "{http://test.yujie.com/}speak". Use @XmlType.name and @XmlType.namespace to assign different names to them.[/color]
	this problem is related to the following location:
		at com.yujie.webService.Speak
		at public com.yujie.webService.Speak com.yujie.webService.ObjectFactory.createSpeak()
		at com.yujie.webService.ObjectFactory
	this problem is related to the following location:
		at com.yujie.test.Speak
Two classes have the same XML type name "{http://test.yujie.com/}speakResponse". Use @XmlType.name and @XmlType.namespace to assign different names to them.


你好,根据问题描述应该是你的命名空间冲突了,解决办法是在你的Duck中加入@XMLType(namespace="XXXX")。这里的XXX是你通过浏览器访问wsdl时那个页面的namespace
或者你在Test类中创建Qname的时候命名空间写错了。这里的命名空间就是上面浏览器访问到的页面的命名空间。在我的应用中是http://impl.ws.piedra.com/。

我把我的源代码也弄上去,你看下吧。这个应该是你不小心写错造成的。


1 楼 在世界的中心呼喚愛 2013-05-31  
楼主,按照你的方法在测试类那里出现异常:
Exception in thread "main" javax.xml.ws.WebServiceException: Unable to create JAXBContext
	at com.sun.xml.internal.ws.model.AbstractSEIModelImpl.createJAXBContext(AbstractSEIModelImpl.java:156)
	at com.sun.xml.internal.ws.model.AbstractSEIModelImpl.postProcess(AbstractSEIModelImpl.java:84)
	at com.sun.xml.internal.ws.model.RuntimeModeler.buildRuntimeModel(RuntimeModeler.java:235)
	at com.sun.xml.internal.ws.client.WSServiceDelegate.createSEIPortInfo(WSServiceDelegate.java:652)
	at com.sun.xml.internal.ws.client.WSServiceDelegate.addSEI(WSServiceDelegate.java:640)
	at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:332)
	at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:315)
	at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:297)
	at javax.xml.ws.Service.getPort(Service.java:119)
	at com.yujie.webService.impl.DuckService.getDuckPort(DuckService.java:71)
	at com.yujie.client.Test.main(Test.java:13)
Caused by: java.security.PrivilegedActionException: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions
Two classes have the same XML type name "{http://test.yujie.com/}speak". Use @XmlType.name and @XmlType.namespace to assign different names to them.
	this problem is related to the following location:
		at com.yujie.webService.Speak
		at public com.yujie.webService.Speak com.yujie.webService.ObjectFactory.createSpeak()
		at com.yujie.webService.ObjectFactory
	this problem is related to the following location:
		at com.yujie.test.Speak
Two classes have the same XML type name "{http://test.yujie.com/}speakResponse". Use @XmlType.name and @XmlType.namespace to assign different names to them.
	this problem is related to the following location:
		at com.yujie.webService.SpeakResponse
		at public javax.xml.bind.JAXBElement com.yujie.webService.ObjectFactory.createSpeakResponse(com.yujie.webService.SpeakResponse)
		at com.yujie.webService.ObjectFactory
	this problem is related to the following location:
		at com.yujie.test.SpeakResponse

	at java.security.AccessController.doPrivileged(Native Method)
	at com.sun.xml.internal.ws.model.AbstractSEIModelImpl.createJAXBContext(AbstractSEIModelImpl.java:143)
	... 10 more
Caused by: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions
Two classes have the same XML type name "{http://test.yujie.com/}speak". Use @XmlType.name and @XmlType.namespace to assign different names to them.
	this problem is related to the following location:
		at com.yujie.webService.Speak
		at public com.yujie.webService.Speak com.yujie.webService.ObjectFactory.createSpeak()
		at com.yujie.webService.ObjectFactory
	this problem is related to the following location:
		at com.yujie.test.Speak
Two classes have the same XML type name "{http://test.yujie.com/}speakResponse". Use @XmlType.name and @XmlType.namespace to assign different names to them.
	this problem is related to the following location:
		at com.yujie.webService.SpeakResponse
		at public javax.xml.bind.JAXBElement com.yujie.webService.ObjectFactory.createSpeakResponse(com.yujie.webService.SpeakResponse)
		at com.yujie.webService.ObjectFactory
	this problem is related to the following location:
		at com.yujie.test.SpeakResponse

	at com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:91)
	at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:451)
	at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:283)
	at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:126)
	at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1148)
	at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:173)
	at com.sun.xml.internal.bind.api.JAXBRIContext.newInstance(JAXBRIContext.java:96)
	at com.sun.xml.internal.ws.developer.JAXBContextFactory$1.createJAXBContext(JAXBContextFactory.java:98)
	at com.sun.xml.internal.ws.model.AbstractSEIModelImpl$1.run(AbstractSEIModelImpl.java:151)
	at com.sun.xml.internal.ws.model.AbstractSEIModelImpl$1.run(AbstractSEIModelImpl.java:143)
	... 12 more

相关推荐

    基于JDK自带的Web服务JAX-WS实现WebService的简单示例

    Java 基于第三方插件实现WebService实在麻烦,尤其是要添加几十M的Jar包...还好,自从JDK 1.6开始,Java自身已经支持WebSeervice的开发即JAX-WS,附件是一个简单的示例,供入门参考。注意,JDK环境要求1.6及以上版本。

    Jax-ws所需要的JAR包

    Java API for XML Web Services(JAX-WS)是Java平台上用于构建和消费Web服务的标准API。它简化了创建和使用Web服务的过程,使得开发者能够通过SOAP消息与远程服务进行交互。JAX-WS允许开发者将服务接口直接映射到...

    JAX-WS Web service

    **JAX-WS Web服务开发概述** JAX-WS(Java API for XML Web Services)2.0,由JSR 224定义,是Java EE 5平台的关键组成部分,它是JAX-RPC 1.1的升级版。JAX-WS的主要目标是简化基于XML的Web服务的开发任务,它提供...

    jax-ws发布webservice

    通过定义服务接口,实现服务逻辑,以及使用`Endpoint.publish()`发布服务,我们可以轻松地创建一个基于JAX-WS的Web服务。同时,利用`wsimport`工具生成客户端代码,可以方便地进行服务调用。在"jax-ws-server"和"jax...

    jaxb-api.jar.jaxws-api.zip_ jaxb-api.jar_cxf_jax-ws.jar_jaxb-api

    它支持基于标准的服务实现,如JAX-WS(Java API for XML Web Services)和JAX-RS(Java API for RESTful Web Services)。CXF不仅提供了服务端的实现,还支持客户端调用,使得开发者可以方便地创建、发布和管理Web...

    jax-ws用户指南 pdf版

    JAX-WS (Java API for XML Web Services) 是 Java 平台上用于开发和实现 Web 服务的官方标准之一。本用户指南详细介绍了 JAX-WS 2.2 版本的功能、编程模型以及如何使用该 API 来构建 Web 服务应用。 #### 文档结构 ...

    java WebService Jax-WS创建

    【Java WebService Jax-WS 创建】是Java中创建Web服务的一种常见方式,主要用于构建基于SOAP(Simple Object Access Protocol)的Web服务。JAX-WS(Java API for XML Web Services)是Java EE 5及更高版本中提供的...

    MyEclipse中jax-ws开发教程

    在MyEclipse中使用JAX-WS开发Web服务是一个简单而高效的过程,下面将详细介绍这个过程中的关键步骤和涉及的技术点。 首先,JAX-WS(Java API for XML Web Services)是Java平台上的一个标准,用于创建和消费Web服务...

    使用JAX-WS(JWS)发布WebService

    使用JAX-WS(JWS)发布WebService 使用myeclipse开发java的webservice的两种方式 方式一: (此方式只能作为调试,有以下bug:jdk1.6u17?以下编译器不支持以Endpoint.publish方式发布document方式的soap,必须在...

    Asynchronous Web Service Invocation with JAX-WS 2.0

    JAX-WS 2.0 是Java API for XML Web Services的第二个主要版本,它引入了异步Web服务调用的功能,以解决在Service-Oriented Architecture(SOA)环境中开发响应迅速的Web服务客户端应用程序的挑战。由于Web服务调用...

    JAX-WS使用教程

    开发者需要安装JDK 1.6.0或更高版本以及JAX-WS的引用实现版本,这样在开发和运行JAX-WS Web服务时才能保证兼容性。 最后,文档中提供了一个详细的目录结构,它将引导开发者从基础到高级的概念学习和使用JAX-WS,...

    JAX-WS的lib、src和docs

    在%JDK_HOME%/bin下有两个命令wsgen和wsimport,就是用到APT和Compiler API来处理碰到的Annotations,wsgen可以为Web Services Provider产生并编译必要的帮助类和相关支持文件,wsimport以WSDL作为输入为Web Service ...

    webservicedemo+jax-ws

    JAX-WS使用了JDK 6自带的实现,这意味着开发者无需额外安装库就可以直接在项目中使用。readme.txt文件提供了详细的指南,包括设置、运行和测试Web服务的步骤,这对于初学者来说是非常宝贵的资源。 在Web服务开发中...

    上传一个基于Jax-ws的WebService

    【标签】:“源码”和“工具”表明该博客可能包含了示例代码以及可能使用的工具或库,比如`wsimport`工具的使用,以及如何通过源码级别的操作来理解和实现基于JAX-WS的Web服务。 【压缩包子文件的文件名称列表】:...

    JAX-WS开发部署WebService

    【JAX-WS开发部署WebService】是Web服务开发的一个重要主题,主要涉及到使用Java API for XML Web Services(JAX-WS)创建和部署基于SOAP的Web服务。JAX-WS是一种标准的、Java平台上的API,它使得开发人员能够轻松地...

    使用JAX-WS开发WebService入门教程.pdf

    这是因为JAX-WS自Java SE 6开始作为标准API被集成到了JDK中,但在Java SE 1.5中也可以通过额外添加相关的JAR包来实现。 2. **开发工具**:本教程推荐使用MyEclipse作为开发工具,因为MyEclipse内置了对JAX-WS的...

    MyEclipse6_5上基于JAX-WS开发Webservice(中文示例)

    1. **环境配置**:首先确保安装了MyEclipse 6.5,然后可能需要配置JDK和Web服务相关的库,如JAX-WS的API和实现。 2. **创建服务端**:使用MyEclipse的向导创建一个新的JAX-WS服务。这通常涉及定义一个Java接口和其...

Global site tag (gtag.js) - Google Analytics