使用JDK自带的WebService工具发布WebService服务
2016-08-21 00:00
495 查看
摘要: 使用JDK自带的WebService工具发布WebService服务
发布该服务:
然后打开浏览器,输入以上发布的地址:http://127.0.0.1:7777/wwss/phoneService?wsdl
就可以看到对应自动生成的WSDL文件:
我们平时使用别人发布的WebService服务时,就需要阅读相应的WSDL文件。
然后打开cmd命令行窗口:
输入wsimport -version命令并回车,看到如下输出表明你JDK的webservice工具正常。
![](http://static.oschina.net/uploads/space/2016/0821/142950_peYA_2608182.png)
我们输入以下命令,根据wsdl文件自动生成class文件:
wsimport http://127.0.0.1:7777/wwss/phoneService?wsdl -d F:\ws -p at.ws.phone
![](http://static.oschina.net/uploads/space/2016/0821/143211_6dox_2608182.png)
如果要生成原文件,即.java文件,可加入 -s 参数.
![](http://static.oschina.net/uploads/space/2016/0821/143411_mHb8_2608182.png)
这时在F盘的ws目录下可以看一下生成的文件。
wsimport各种命令的用法和解释,使用wsimport -help查询。
![](http://static.oschina.net/uploads/space/2016/0821/143806_SGg6_2608182.png)
然后使用如下命令把生成的.class和.java文件打成jar包,放到工程jar包依赖目录下。
关于将代码打成Jar包可参见该篇博客:http://my.oschina.net/u/2608182/blog/724756
![](http://static.oschina.net/uploads/space/2016/0821/145532_PNUa_2608182.png)
以下是测试代码:
注意:以上的PhoneServiceService,PhoneService,Phone类均为是通过WSDL文件自动生成的类,在import的时候不要引错。
以下是输出结果:
![](http://static.oschina.net/uploads/space/2016/0821/151943_hkbP_2608182.png)
Tips:
1. 在类上添加@WebService注解,代表发布一个WebService服务
2. 通过EndPoint(端点服务)发布一个webService。Endpoint也是jdk提供的一个专门用于发布服务的类,它的publish方法接收两个参数,一个是本地的服务地址,二是提供服务的类。它位于javax.xml.ws.*包中。
3. Endpoint.publish(String address, Object implementor) 静态方法在给定地址处针对指定的实现者对象创建并发布端点
4. 给类添加上@WebService注解后,类中所有的非静态方法都将会对外公布
5. 如果希望某个方法不对外公开,可以在方法上添加@WebMethod(exclude=true),阻止对外公开。
6. 如果一个类上,被添加了@WebService注解,则必须此类至少有一个可以公开的方法,否则将会启动失败。
7. protected、private、final、static方法不能对外公开 代码如下:
WSDL规范为了不会产生歧义,就定义了一些新的名词来表述功能与服务。
<operation>子元素:
对服务中所支持的操作的抽象描述,一般单个Operation描述了一个访问入口的请求/响应消息对。
通信消息的数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构。
在这个例子中,<portType> 元素把 "glossaryTerms" 定义为某个端口的名称,把 "getTerm" 定义为某个操作的名称。
操作 "getTerm" 拥有一个名为 "getTermRequest" 的输入消息,以及一个名为 "getTermResponse" 的输出消息。
<message> 元素可定义每个消息的部件,以及相关联的数据类型。
对比传统的编程,glossaryTerms 是一个函数库,而 "getTerm" 是带有输入参数 "getTermRequest" 和返回参数 getTermResponse 的一个函数。
Binding、Port、Service是实现。
Port:
定义为协议/数据格式绑定与具体web访问地址组合的单个服务访问点。
Service:
相关服务访问点的集合。
WebService的注解包括:
1. @WebService-定义服务 --类上
2. @WebMethod-定义方法 - 方法
3. @WebResult-定义返回值 – 返回值
4. @WebParam-定义参数 – 参数
2. 当修改了WebService注解之后,同时会影响客户端生成的代码。
3. 调用的方法名和参数名也发生了变化。
4. 即使是没有修改源代码,只修改了注解,客户端的代码也必须要重新生成(注意是生成而不是下载)。否则调用将会失败。
5. 生成本地调用代码,依然使用wsimport工具
2. targetNamespace属性:定义命名空间,默认为”http://”+”包名倒排”
3. name属性:Web Service 的名称,默认为发布服务的类名。
4. serviceName: ws服务的名词,默认在类名后面添加了service
5. endpointInterface属性:定义服务抽象 Web Service 协定的服务端点接口的完整名称,接口也必须声明WebService注解,包括方法的注解必须也要添加到接口中,否则会无效, 而且WS在没有注解的情况下.生成WS的时候会自动生成一个注解.所以可以不用指定接口
2. operationName属性:与此方法匹配的 wsdl:operation 的名称
3. exclude属性:标注此方法是否被暴露,默认为false
注意:如果所有方法上都没有指定@WebMethod,则默认是所有的方法都是对外暴露的方法。如果有任一方法指定了@WebMethod,则只有指定这个注解的才是对外暴露的方法。
name属性:返回值的名称
一个添加注解的案例:
1.创建简单的WebService服务
首先我们来创建一个用于对外发布的WebService类//此注解表明该类是一个WebService,可用于发布WebService服务 @WebService public class PhoneService { public Phone getPhoneInfo(String name) { Phone phone = new Phone(); phone.setName(name); if (name.endsWith("android")) { phone.setProduce("Oracle"); phone.setTime(new Date()); } else if (name.endsWith("apple")) { phone.setProduce("Apple"); phone.setTime(new Date()); } else { phone.setProduce("未知"); phone.setTime(new Date()); } return phone; } }
发布该服务:
public static void main(String[] args) { //WebService发布的地址,端口号和路径随意写,IP地址在实际应用时应该写发布WebService的服务器的地址 String address = "http://127.0.0.1:7777/wwss/phoneService"; Endpoint endpoint = Endpoint.publish(address, new PhoneService()); //这里可以手动停止该服务,但是在实际开发中也不会随意停止 // endpoint.stop(); System.out.println(address + "?WSDL"); }
然后打开浏览器,输入以上发布的地址:http://127.0.0.1:7777/wwss/phoneService?wsdl
就可以看到对应自动生成的WSDL文件:
This XML file does not appear to have any style information associated with it. The document tree is shown below. <wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://service.ws.flying.at/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" name="PhoneServiceService" targetNamespace="http://service.ws.flying.at/"> <wsdl:types> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://service.ws.flying.at/" elementFormDefault="unqualified" targetNamespace="http://service.ws.flying.at/" version="1.0"> <xs:element name="getPhoneInfo" type="tns:getPhoneInfo"/> <xs:element name="getPhoneInfoResponse" type="tns:getPhoneInfoResponse"/> <xs:complexType name="getPhoneInfo"> <xs:sequence> <xs:element minOccurs="0" name="arg0" type="xs:string"/> </xs:sequence> </xs:complexType> <xs:complexType name="getPhoneInfoResponse"> <xs:sequence> <xs:element minOccurs="0" name="return" type="tns:phone"/> </xs:sequence> </xs:complexType> <xs:complexType name="phone"> <xs:sequence> <xs:element minOccurs="0" name="name" type="xs:string"/> <xs:element minOccurs="0" name="produce" type="xs:string"/> <xs:element minOccurs="0" name="time" type="xs:dateTime"/> </xs:sequence> </xs:complexType> </xs:schema> </wsdl:types> <wsdl:message name="getPhoneInfoResponse"> <wsdl:part element="tns:getPhoneInfoResponse" name="parameters"></wsdl:part> </wsdl:message> <wsdl:message name="getPhoneInfo"> <wsdl:part element="tns:getPhoneInfo" name="parameters"></wsdl:part> </wsdl:message> <wsdl:portType name="PhoneService"> <wsdl:operation name="getPhoneInfo"> <wsdl:input message="tns:getPhoneInfo" name="getPhoneInfo"></wsdl:input> <wsdl:output message="tns:getPhoneInfoResponse" name="getPhoneInfoResponse"></wsdl:output> </wsdl:operation> </wsdl:portType> <wsdl:binding name="PhoneServiceServiceSoapBinding" type="tns:PhoneService"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="getPhoneInfo"> <soap:operation soapAction="" style="document"/> <wsdl:input name="getPhoneInfo"> <soap:body use="literal"/> </wsdl:input> <wsdl:output name="getPhoneInfoResponse"> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="PhoneServiceService"> <wsdl:port binding="tns:PhoneServiceServiceSoapBinding" name="PhoneServicePort"> <soap:address location="http://127.0.0.1:7777/wwss/phoneService"/> </wsdl:port> </wsdl:service> </wsdl:definitions>
我们平时使用别人发布的WebService服务时,就需要阅读相应的WSDL文件。
然后打开cmd命令行窗口:
输入wsimport -version命令并回车,看到如下输出表明你JDK的webservice工具正常。
![](http://static.oschina.net/uploads/space/2016/0821/142950_peYA_2608182.png)
我们输入以下命令,根据wsdl文件自动生成class文件:
wsimport http://127.0.0.1:7777/wwss/phoneService?wsdl -d F:\ws -p at.ws.phone
![](http://static.oschina.net/uploads/space/2016/0821/143211_6dox_2608182.png)
如果要生成原文件,即.java文件,可加入 -s 参数.
![](http://static.oschina.net/uploads/space/2016/0821/143411_mHb8_2608182.png)
这时在F盘的ws目录下可以看一下生成的文件。
wsimport各种命令的用法和解释,使用wsimport -help查询。
![](http://static.oschina.net/uploads/space/2016/0821/143806_SGg6_2608182.png)
然后使用如下命令把生成的.class和.java文件打成jar包,放到工程jar包依赖目录下。
关于将代码打成Jar包可参见该篇博客:http://my.oschina.net/u/2608182/blog/724756
![](http://static.oschina.net/uploads/space/2016/0821/145532_PNUa_2608182.png)
以下是测试代码:
@Test public void testws1() { PhoneServiceService phoneService = new PhoneServiceService(); PhoneService phoneService1 = phoneService.getPhoneServicePort(); //获取到生成的本地Phone类,就可以调用其中的任何对外开放的方法 Phone phone = phoneService1.getPhoneInfo("eeeeapple"); System.out.println(phone.getName()); System.out.println(phone.getProduce()); System.out.println(phone.getTime()); }
注意:以上的PhoneServiceService,PhoneService,Phone类均为是通过WSDL文件自动生成的类,在import的时候不要引错。
以下是输出结果:
![](http://static.oschina.net/uploads/space/2016/0821/151943_hkbP_2608182.png)
Tips:
1. 在类上添加@WebService注解,代表发布一个WebService服务
2. 通过EndPoint(端点服务)发布一个webService。Endpoint也是jdk提供的一个专门用于发布服务的类,它的publish方法接收两个参数,一个是本地的服务地址,二是提供服务的类。它位于javax.xml.ws.*包中。
3. Endpoint.publish(String address, Object implementor) 静态方法在给定地址处针对指定的实现者对象创建并发布端点
4. 给类添加上@WebService注解后,类中所有的非静态方法都将会对外公布
5. 如果希望某个方法不对外公开,可以在方法上添加@WebMethod(exclude=true),阻止对外公开。
6. 如果一个类上,被添加了@WebService注解,则必须此类至少有一个可以公开的方法,否则将会启动失败。
7. protected、private、final、static方法不能对外公开 代码如下:
@WebService // 添加了此注解,代表是一个WebService public class HelloWorld { // 非 static final private 方法默认会发布 public String sayHi(String name) { return "hello" + name; } @WebMethod(exclude=true) public void exclude(){ // 被注解排除的方法 } protected void protected1(){ //受保护的方法默认不发布 } private void private1(){ // 私有方法默认不发布 } public static void static1(){ // static 方法默认不发布 } public final void final1(){ // final 方法默认不发布 } }
2.WSDL文件简介
WSDL 文档的组成部分:
元素 | 定义 |
<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元素介绍
定义一个功能,在Java中叫做方法,在C中叫做函数;在Java中叫类,在C语言中叫做结构体。这些名词都不一样。WSDL规范为了不会产生歧义,就定义了一些新的名词来表述功能与服务。
<portType>(WSDL端口)
<portType> 元素是最重要的 WSDL 元素。 它可描述一个 web service、可被执行的操作,以及相关的消息。 可以把 <portType> 元素比作传统编程语言中的一个函数库(或一个模块、或一个类)。<operation>子元素:
对服务中所支持的操作的抽象描述,一般单个Operation描述了一个访问入口的请求/响应消息对。
<message> (WSDL消息)
<message> 元素定义一个操作的数据元素。 每个消息均由一个或多个部件组成。可以把这些部件比作传统编程语言中一个函数调用的参数。通信消息的数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构。
<types>(WSDL types)
<types> 元素定义 web service 使用的数据类型。 为了最大程度的平台中立性,WSDL 使用 XML Schema 语法来定义数据类型。<binding> (WSDL Bindings)
<binding> 元素为每个端口定义消息格式和协议细节。示例
这是某个 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> |
操作 "getTerm" 拥有一个名为 "getTermRequest" 的输入消息,以及一个名为 "getTermResponse" 的输出消息。
<message> 元素可定义每个消息的部件,以及相关联的数据类型。
对比传统的编程,glossaryTerms 是一个函数库,而 "getTerm" 是带有输入参数 "getTermRequest" 和返回参数 getTermResponse 的一个函数。
说明
Types、Message、PortType、Opration为抽象定义。Binding、Port、Service是实现。
Port:
定义为协议/数据格式绑定与具体web访问地址组合的单个服务访问点。
Service:
相关服务访问点的集合。
3.使用WebService注解来修改WSDL文件
WSDL文件的内容,一般由服务默认生成,但为了更好的向开发人员提供使用说明书,一般应做一些简单的修改。至少不应该暴露我们的包结构。而targetNamespace默认情况下为倒置的包名,这已经暴露了我们的包结构。通过在类文件上添加以下注解,可以修改wsdl生成的各元素,而不是直接去修改wsdl文件,直接去修改wsdl文件是无效的。WebService的注解包括:
1. @WebService-定义服务 --类上
2. @WebMethod-定义方法 - 方法
3. @WebResult-定义返回值 – 返回值
4. @WebParam-定义参数 – 参数
WebService注解的使用
1. 通过WebService的注解,可以更加形像的描述Web服务。从而生成WSDL文档。2. 当修改了WebService注解之后,同时会影响客户端生成的代码。
3. 调用的方法名和参数名也发生了变化。
4. 即使是没有修改源代码,只修改了注解,客户端的代码也必须要重新生成(注意是生成而不是下载)。否则调用将会失败。
5. 生成本地调用代码,依然使用wsimport工具
@WebService注解:
1. @WebService 标注要暴露为Web Services的类或接口 ,用于修饰类或接口,包含的属性有:2. targetNamespace属性:定义命名空间,默认为”http://”+”包名倒排”
3. name属性:Web Service 的名称,默认为发布服务的类名。
4. serviceName: ws服务的名词,默认在类名后面添加了service
5. endpointInterface属性:定义服务抽象 Web Service 协定的服务端点接口的完整名称,接口也必须声明WebService注解,包括方法的注解必须也要添加到接口中,否则会无效, 而且WS在没有注解的情况下.生成WS的时候会自动生成一个注解.所以可以不用指定接口
@WebMethod
1. 此注解用在方法上,用于修改对外暴露的方法2. operationName属性:与此方法匹配的 wsdl:operation 的名称
3. exclude属性:标注此方法是否被暴露,默认为false
注意:如果所有方法上都没有指定@WebMethod,则默认是所有的方法都是对外暴露的方法。如果有任一方法指定了@WebMethod,则只有指定这个注解的才是对外暴露的方法。
@WebResult
@WebResult 定义返回值,返回值类型不能为接口类或抽象类,而且必须有个不带参的构造函数,包含属性name属性:返回值的名称
一个添加注解的案例:
// 修改web服务的名称,和命名空间 @WebService(name="Hello",targetNamespace="http://icast.cn") public class HelloWorld { @WebMethod(operationName="aaa") // 修改webResult 和 webParam会影响到JS的调用模式 public @WebResult(name="returnName") String sayHi(@WebParam(name="yourname") String name){ return "Hello" + name; } public static void main(String[] args){ // 发布一个web服务,指定IP和实现者 Endpoint end=Endpoint.publish("http://127.0.0.1:4567/hello",new HelloWorld()); } }
相关文章推荐
- WebService服务发布与使用(JDK自带WebService)
- JAVA项目中发布WebService服务——使用jdk
- Spring 集成CXF框架发布Webservice服务 和 使用jdk生成Webservice clinet
- webservice(三) 使用JDK的EndPoint和cxf框架分别发布webservice服务
- webservice使用JDK自带的jax-ws创建并发布一个简单的webservice
- 使用jdk自带webservice发布webservice
- jdk1.6.0.10版本下使用jaxws发布webservice服务
- eclipse中使用axis2插件发布服务(WebService)和生成客户端(Client)及axis2插件的使用
- 使用JDK发布一个简单WebService
- 使用jdk自带的keytool工具生成数字证书过程
- 使用jdk自带的webservice
- 用JDK自带的工具生成客户端调用Webservice的代码
- webservice 整合spring 使用接口发布服务
- JDK自带的JVM性能监控工具jconsole的使用
- 关于使用webService框架cxf自带工具将wsdl文件生成本地类
- JDK自带工具jps,jstat,jmap,jconsole使用
- JDK自带工具jps,jstat,jmap,jconsole使用
- JDK自带的JVM性能监控工具jconsole的使用
- Maven搭建webService (一) 创建服务端---使用main函数发布服务
- Maven搭建webService (二) 创建服务端---使用web方式发布服务