研究下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的一些说明
元素
|
定义
|
<portType>
|
web service 执行的操作
|
<message>
|
web service 使用的消息
|
<types>
|
web service 使用的数据类型
|
<binding>
|
web service 使用的通信协议
|
<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>
|
<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>
|
类型
|
定义
|
One-way
|
此操作可接受消息,但不会返回响应。
|
Request-response
|
此操走可接受一个请求并会返回一个响应
|
Solicit-response
|
此操作可发送一个请求,并会等待一个响应。
|
Notification
|
此造作可发送一条消息,但不会等待响应。
|
<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
|