研究下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 之一)
wsgen与wsimport命令说明
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示例
调用WebService,最简单的办法当然是直接添加WEB引用,然后自动产生代理类,但是在调用JAVA的WebService时并没有这么简单,特别是对于SoapHeader的处理,通过C#添加Web引用方式访问JavaWebService的方法,除了string...
C# JAVA WebService教程 追雨笔记教程
Java WebService入门实例
自己总结的java webService接口开发案例,希望能够帮助我需要的朋友。
webService的实现方式之一JWS,有需要的同学可以下载代码抽空研究;
C# JAVA WebService教程 追雨笔记教程_第二版
java Webservice 简单实例 java Webservice 简单实例 java Webservice 简单实例 java Webservice 简单实例
java开发webservice入门最全讲解demo
最简单的java webservice ,按照步骤完成java webservice学习
Java Webservice Axis2 Client(含soapheader验证)
java webservice实例教程ppt,共15讲,java webservice实例教程适合对象:想要学习SOA面向服务编程思想,学习Webservice技术,希望学习系统间通信设计的Java设计开发人员。java webservice实例教程适合于各个层次的...
java调用json参数的webservice 涉及技术: JAVA JSON WEBSERVICE
调用 java webservice 的问题
asp.net调用java webservice实例
本人自己的webservice入门学习的笔记。非常粗糙和浅显,主要是自己看的。博客地址:http://blog.csdn.net/zhutulang/article/details/51125459
java调用windows系统的com组件,用jacob来处理。JACOB一个Java-COM中间件.通过这个组件你可以在Java应用程序中调用COM组件和Win32程序库。
java调用webservicejava调用webservice.zipjava调用webservice.zipjava调用webservice.zipjava调用webservice.zipjava调用webservice.zipjava调用webservice.zipjava调用webservice.zipjava调用webservice.zipjava...
此文档是DotNet调用Java WebService的含代码的讲解与应用,对.Net开发者有很好的启发作用。
java webservice flash在domino中的使用