`
weiwei5910
  • 浏览: 27705 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类

java WebService jws 入门学习笔记

 
阅读更多

研究下jdk webService 觉得非常好用,可以像使用本地方法那样去调用


什么原理就不说了,一大堆什么规范的我也说不明白


使用java webService前提条件

1.系统已安装jdk1.6以上

2.系统已配置java环境变量


服务端示例代码:

package com.wei.service;

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;

/**
 * webService服务端
 * @author wangwei
 * May 27, 2013
 */

@WebService
public class HelloWorld {
	
	@WebMethod 
	public String sayHello(String userName){
		return "Hello " + userName;
	}
	
	public static void main(String[] args) {
		Endpoint.publish("http://localhost:8080/webservice/hws", new HelloWorld());
	}
}

在运行服务端前需要先使用jdk/bin中wsgen来生成 服务所需要的依赖类

如果没有生成直接运行可能会出现如下错误:

Exception in thread "main" com.sun.xml.internal.ws.model.RuntimeModelerException: runtime modeler error: Wrapper class com.wei.service.jaxws.SayHello is not found. Have you run APT to generate them?
	at com.sun.xml.internal.ws.model.RuntimeModeler.getClass(RuntimeModeler.java:256)
	at com.sun.xml.internal.ws.model.RuntimeModeler.processDocWrappedMethod(RuntimeModeler.java:567)
	at com.sun.xml.internal.ws.model.RuntimeModeler.processMethod(RuntimeModeler.java:514)
	at com.sun.xml.internal.ws.model.RuntimeModeler.processClass(RuntimeModeler.java:341)
	at com.sun.xml.internal.ws.model.RuntimeModeler.buildRuntimeModel(RuntimeModeler.java:227)
	at com.sun.xml.internal.ws.server.EndpointFactory.createSEIModel(EndpointFactory.java:308)
	at com.sun.xml.internal.ws.server.EndpointFactory.createEndpoint(EndpointFactory.java:174)
	at com.sun.xml.internal.ws.api.server.WSEndpoint.create(WSEndpoint.java:420)
	at com.sun.xml.internal.ws.api.server.WSEndpoint.create(WSEndpoint.java:439)
	at com.sun.xml.internal.ws.transport.http.server.EndpointImpl.createEndpoint(EndpointImpl.java:208)
	at com.sun.xml.internal.ws.transport.http.server.EndpointImpl.publish(EndpointImpl.java:138)
	at com.sun.xml.internal.ws.spi.ProviderImpl.createAndPublishEndpoint(ProviderImpl.java:90)
	at javax.xml.ws.Endpoint.publish(Endpoint.java:170)
	at com.wei.service.HelloWorld.main(HelloWorld.java:22)

wsgen的使用方法:

1.打开命令提示符窗口 转到项目主目录中 如我的项目目录为D:\workspace\javaWebService>

2.输入wsgen -cp ./bin -s ./src -d ./bin -wsdl com.wei.service.HelloWorld

-cp 定义classpath

-s 源码文件存放目录 当前则放到src目录中

-d 编译文件存放目录 当前则放到bin目录中

-wsdl 生成wsdl文件

com.wei.service.HelloWorld 指定服务端程序

3.完成后会在com.wei.service即服务程序目录中新增一个jaxws目录并包含依赖类

4.运行服务端程序 在 IE中输入http://localhost:8080/webservice/hws?wsdl 出现如下个界面即完成服务端部署



生成客户端

在命令提示符窗口执行wsimport -d ./bin -s ./src -p com.wei.client http://localhost:8080/webservice/hws?wsdl

-d 编译文件存放目录 本例为bin目录

-s 源文件存放目录 本例为src目录

-p 定义生成类的包名

命令执行完成后会在com.wei.client包中生成客户端执行类文件

如下图



调用方法

package com.wei.test;

import com.wei.client.HelloWorld;
import com.wei.client.HelloWorldService;

/**
 * 
 * @author wangwei
 * May 28, 2013
 */
public class Test {
	public static void main(String[] args) {
		HelloWorldService hws = new HelloWorldService();
		HelloWorld hw = hws.getHelloWorldPort();
		System.out.println(hw.sayHello("wangwei"));
	}
}
输出结果:Hello wangwei


这样整个服务的部署和调用就完成了

下面符上一些关于jdk webService的一些说明



JKD6 中定义的Web Service注释
1. @WebService 标注要暴露为WebServices的类或接口,用于申修饰类或接口,包含属性
targetNamespace 定义命名空间,默认为”http://”+”包名倒排”
name Web Service 的名称,默认为类名,例如:
<definitions targetNamespace="http://service.jws.test/"
name="HelloWorldService">
portName Web Service 的端口名称
serviceName Web Service 的服务名称,例如
<service name="HelloWorldService">
<port name="HelloWorldPort"
binding="tns:HelloWorldPortBinding">
...
</port>
</service>
2. @SOAPBinding 定义Web Service 在SOAP中的消息协议,用于申修饰类或接口,包含属性
style 定义消息的编码类型
user 定义消息的格式化类型
3. @WebMethod 定义Web Service运作的方法,包含属性
action 操作的活动
operationName与此方法匹配的 wsdl:operation 的名称
exclude 标注此方法是否被暴露,默认为false
4. @WebResult 定义返回值,返回值类型不能为接口类或抽象类,而且必须有个不带参的构造函数,包含属性
name返回值的名称
partName表示此返回值的 wsdl:part 的名称
targetNamespace返回值的 XML 名称空间
header如果为 true,则结果是从消息头而不是消息正文获取的
5. @WebParam 定义方法的参数,参数类型不能为接口类或抽象类,而且必须有个不带参的构造函数,包含属性
name参数名称
partName表示此参数的 wsdl:part 的名称
targetNamespace参数的 XML 名称空间
header如果为 true,则结果是从消息头而不是消息正文获取的
mode参数的流向(IN、OUT 或 INOUT 之一)
wsgenwsimport命令说明
wsgen命令的主要功能是用来生成合适的JAX-WS。它读取Web Service的终端类文件,在我们的例子中就是test.jws.service.HelloWorld,同时生成所有用于发布Web Service所依赖的源代码文件和经过编译过的二进制类文件,通常Web Service Bean中用到的异常类会另外生成一个描述Bean。它还能生成WSDL和符合规范的HelloWorld类Web Service。wsgen从资源文件生成一个完整的操作列表并验证是合法的。如果Web Service Bean中的主法有申明抛出异常,这一步是必需的,否则服务器无法绑定该对像。
命令参数说明:
-cp 定义classpath
-r 生成 bean的wsdl文件的存放目录
-s 生成发布Web Service的源代码文件的存放目录(如果方法有抛出异常,则会生成该异常的描述类源文件)
-d 生成发布Web Service的编译过的二进制类文件的存放目录(该异常的描述类的class文件)
wsimport命令的主要功能是根据wsdl文件生成客户端存根及框架,负责与Web Service 服务器通信,并在将其封装成实例,客户端可以直接使用,就像使用本地实例一样。
命令参数说明:
-d 生成客户端执行类的class文件的存放目录
-s 生成客户端执行类的源文件的存放目录
-p 定义生成类的包名
三、 附录:WSDL说明
1、WSDL 文档结构
WSDL 文档是利用这些主要的元素来描述某个 web service 的:
元素
定义
<portType>
web service 执行的操作
<message>
web service 使用的消息
<types>
web service 使用的数据类型
<binding>
web service 使用的通信协议
一个 WSDL 文档的主要结构是类似这样的:
<definitions>
<types>
definition of types........
</types>
<message>
definition of a message....
</message>
<portType>
definition of a port.......
</portType>
<binding>
definition of a binding....
</binding>
</definitions>
WSDL 文档可包含其它的元素,比如 extension 元素,以及一个 service 元素,此元素可把若干个 web services 的定义组合在一个单一的 WSDL 文档中。
WSDL 端口
<portType> 元素是最重要的 WSDL 元素。
它可描述一个 web service、可被执行的操作,以及相关的消息。
可以把 <portType> 元素比作传统编程语言中的一个函数库(或一个模块、或一个类)。
WSDL 消息
<message> 元素定义一个操作的数据元素。
每个消息均由一个或多个部件组成。可以把这些部件比作传统编程语言中一个函数调用的参数。
WSDL types
<types> 元素定义 web service 使用的数据类型。
为了最大程度的平台中立性,WSDL 使用 XML Schema 语法来定义数据类型。
WSDL Bindings
<binding> 元素为每个端口定义消息格式和协议细节。
WSDL 实例
这是某个 WSDL 文档的简化的片段:
<message name="getTermRequest">
<part name="term" type="xs:string"/>
</message>
<message name="getTermResponse">
<part name="value" type="xs:string"/>
</message>
<portType name="glossaryTerms">
<operation name="getTerm">
<input message="getTermRequest"/>
<output message="getTermResponse"/>
</operation>
</portType>
在这个例子中,<portType> 元素把 "glossaryTerms" 定义为某个端口的名称,把 "getTerm" 定义为某个操作的名称。
操作 "getTerm" 拥有一个名为 "getTermRequest" 的输入消息,以及一个名为 "getTermResponse" 的输出消息。
<message> 元素可定义每个消息的部件,以及相关联的数据类型。
对比传统的编程,glossaryTerms 是一个函数库,而 "getTerm" 是带有输入参数 "getTermRequest" 和返回参数 getTermResponse 的一个函数。
2、WSDL 端口
<portType> 元素是最重要的 WSDL 元素。
它可描述一个 web service、可被执行的操作,以及相关的消息。
端口定义了指向某个 web service 的连接点。可以把它元素比作传统编程语言中的一个函数库(或一个模块、或一个类),而把每个操作比作传统编程语言中的一个函数。
操作类型
请求-响应是最普通的操作类型,不过 WSDL 定义了四种类型:
类型
定义
One-way
此操作可接受消息,但不会返回响应。
Request-response
此操走可接受一个请求并会返回一个响应
Solicit-response
此操作可发送一个请求,并会等待一个响应。
Notification
此造作可发送一条消息,但不会等待响应。
One-Way 操作
一个 one-way 操作的例子:
<message name="newTermValues">
<part name="term" type="xs:string"/>
<part name="value" type="xs:string"/>
</message>
<portType name="glossaryTerms">
<operation name="setTerm">
<input name="newTerm" message="newT


分享到:
评论

相关推荐

    JAVA6开发WebService JWS示例

    JAVA6 开发WebService JWS示例 WebService 概念 WebService 是一种软件系统,旨在支持跨网络的机器之间相互操作交互。它有一个机器可识别的描述格式,特别是 WSDL。不同的系统之间可以通过 SOAP 消息在规定的方式...

    C#调用JavaWebService

    调用WebService,最简单的办法当然是直接添加WEB引用,然后自动产生代理类,但是在调用JAVA的WebService时并没有这么简单,特别是对于SoapHeader的处理,通过C#添加Web引用方式访问JavaWebService的方法,除了string...

    Java WebService入门实例

    通过这个简单的Java WebService入门实例,我们可以了解到如何使用Java来创建、发布和调用一个基本的WebService。实际开发中,WebService还涉及到更多复杂的应用,如安全性、事务处理、错误处理等,这些都是进阶学习...

    C# JAVA WebService教程 追雨笔记教程.doc

    C# JAVA WebService教程 追雨笔记教程

    java webService接口开发案例

    Java WebService接口开发是将Java应用程序暴露为网络服务的一种方式,允许不同系统间的数据交换和交互。本案例将深入探讨如何使用Java实现Web服务的创建、发布和调用。 一、理解WebService WebService是一种基于...

    webService JWS实现方式

    例如,通过`@WebService`注解一个Java类,就可以将其转换为一个可发布的Web服务。 2. **JAXB**: Java Architecture for XML Binding (JAXB) 提供了将Java对象与XML文档之间进行自动转换的功能。在JWS中,JAXB用于...

    C# JAVA WebService教程 追雨笔记教程_第二版.doc

    C# JAVA WebService教程 追雨笔记教程_第二版

    delphi调用Java webservice实例

    标题 "Delphi调用Java WebService实例" 涉及的是在Delphi编程环境中如何与Java WebService进行交互的技术。Delphi是一款强大的Windows应用程序开发工具,而Java WebService则是一种基于标准的,跨平台的远程调用技术...

    java Webservice

    Java WebService是一种基于标准的、平台无关的通信方式,它允许不同系统间的应用程序进行交互,主要依赖于SOAP(Simple Object Access Protocol)协议和WSDL(Web Services Description Language)。本教程将带你...

    java开发webservice入门最全讲解demo

    java开发webservice入门最全讲解demo

    .net调用java WebService

    2. **获取WSDL文件**:Java WebService通常会提供一个包含`.jws`或`.wsdl`扩展名的URL。例如:`http://example.com/service?wsdl`。这个URL返回的即是描述该服务接口的WSDL文件。 3. **解析WSDL文件**:在.NET环境...

    java 利用webservice传输文件

    在“java 利用webservice传输文件”的场景中,JACOB可能被用来执行以下任务: 1. **文件操作**:Windows系统有许多内置的COM组件,如Scripting.FileSystemObject,可用于读写文件、创建目录等。通过JACOB,Java程序...

    Java WebService 简单实例 方式一(生成类文件方式)

    通过上述步骤,我们已经成功创建了一个基于 Java 的 WebService,并学习了如何通过生成类文件的方式来进行开发。这种方式不仅易于理解,而且非常适用于实际项目中的需求。随着技术的发展,尽管 RESTful API 的流行度...

    java webservice

    Java WebService是一种基于标准的、平台无关的...总的来说,Java WebService是构建可互操作网络服务的关键技术,通过学习和掌握其开发与调用方法,开发者可以构建出强大的分布式应用程序,实现不同系统间的无缝通信。

    调用 java webservice 的问题

    调用Java WebService的问题在IT领域中颇为常见,尤其是在跨平台、跨语言的环境中,如C#调用Java WebService。以下将详细解析这一过程中的关键知识点,包括WebService的架构原理、工具选择(如Axis2)、数据类型转换...

    java webservice实例教程PPT

    java webservice实例教程ppt,共15讲,java webservice实例教程适合对象:想要学习SOA面向服务编程思想,学习Webservice技术,希望学习系统间通信设计的Java设计开发人员。java webservice实例教程适合于各个层次的...

    c#调用Java webService的专题(一)

    本文将深入探讨如何使用C#调用Java WebService,这是实现.NET与Java平台间互操作性的一个重要方式。我们将首先理解WebService的基本概念,然后详细讲解C#中如何通过.NET Framework的SOAP客户端代理类来调用Java ...

    javawebservice例子.pdf

    Java WebService是一个基于标准的,用于构建分布式应用程序的开放平台,它允许不同系统间的应用程序通过...理解这些基础将有助于你更好地掌握Java WebService的开发,并应用于实际项目中,实现不同系统之间的无缝集成。

    java注解webservice学习第一篇

    在Java Web服务(WebService)开发中,注解的应用极大地简化了服务的创建和配置。本文将深入探讨如何使用Java注解来构建Web服务,并结合给出的“lib”压缩包文件,推测可能包含了一些用于支持Web服务的库文件。 ...

    java Webservice 简单实例

    Java WebService 简单实例教程 在Java开发中,WebService是一种常见的用于应用程序间通信的技术。它基于标准的XML(可扩展标记语言)和WSDL(Web服务描述语言)进行数据交换,允许不同平台和语言的应用程序之间共享...

Global site tag (gtag.js) - Google Analytics