文档章节

使用JDK自带的WebService工具发布WebService服务

帅得拖网速
 帅得拖网速
发布于 2016/08/21 15:31
字数 2594
阅读 409
收藏 1

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

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工具正常。

我们输入以下命令,根据wsdl文件自动生成class文件:

wsimport http://127.0.0.1:7777/wwss/phoneService?wsdl -d F:\ws -p at.ws.phone

如果要生成原文件,即.java文件,可加入 -s 参数.

这时在F盘的ws目录下可以看一下生成的文件。

wsimport各种命令的用法和解释,使用wsimport -help查询。

然后使用如下命令把生成的.class和.java文件打成jar包,放到工程jar包依赖目录下。

关于将代码打成Jar包可参见该篇博客:http://my.oschina.net/u/2608182/blog/724756

以下是测试代码:

  @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的时候不要引错。

以下是输出结果:

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>

 

 

在这个例子中,<portType> 元素把 "glossaryTerms" 定义为某个端口的名称,把 "getTerm" 定义为某个操作的名称。

 

操作 "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());
	}
}

 

© 著作权归作者所有

帅得拖网速

帅得拖网速

粉丝 12
博文 71
码字总数 49604
作品 0
成都
私信 提问
Web Services 学习笔记(二) - java 基础实践

1.服务端 首先编写曝露方法 import javax.jws.WebMethod; import javax.jws.WebService; @WebService public class HelloWebService { @WebMethod public String hello(String name) { Syst......

晨猫
2018/01/30
21
0
webService简单开发步骤

----------------------------服务端---------cxf框架------------------------------------------------ 导入jar包 写一个webservice接口 @WebService public interface WebService01 { } ......

李永china
2016/04/27
139
0
WebService教程详解(一)

Web Services 可以将应用程序转换为网络应用程序。 通过使用 Web Services,您的应用程序可以向全世界发布信息,或提供某项功能。 Web Services 可以被其他应用程序使用。 通过 Web Services...

snowing1990
2016/06/29
47
0
认识一下WebService应用的简单开发

在开发中,不免遇到两个不同系统交互的问题,比如数据信息同步、数据信息获取等,解决问题的途径有多种,今天带大家认识一下 WebService,看看它在实际应用中的处理。 一、什么是WebService ...

海岸线的曙光
2018/07/09
694
1
webservice之通过wsdl文件生成客户端

通过前面我们了解的内容,我们来简单的编写一个webservice的实例 环境:eclipse+jdk1.6 那么,我们如何用java发布一个webservice服务呢? 1)用jdk1.6以后的版本发布; (2)与Web服务相关的类,...

monster_nian
2016/01/14
3.3K
0

没有更多内容

加载失败,请刷新页面

加载更多

密码加密与微服务鉴权JWT详细使用教程

[TOC] 1.1、了解微服务状态 微服务集群中的每个服务,对外提供的都是Rest风格的接口,而Rest风格的一个最重要的规范就是:服务的无状态性。 什么是无状态? 1.服务端不保存任何客户端请求者信...

庭前云落
21分钟前
6
0
Xamarin.FormsShell基础教程(9)Shell相关类体系

Xamarin.FormsShell基础教程(9)Shell相关类体系 在Shell中,最为主要的类是Shell类。Shell类实现了大多数应用程序所需的基本UI功能的页面。除此以外,常用的类还有ShellContent、Tab、Fly...

大学霸
22分钟前
4
0
聊聊MVC、MVP、MVVM吧

先来介绍下本文结构: 三种框架的具体概念 在安卓开发上的写法、优缺点 1.概念 1.1 MVC MVC模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模...

二营长的意大利炮手
39分钟前
4
0
如果解释Python,什么是.pyc文件?

我已经了解Python是一种解释型语言......但是,当我查看我的Python源代码时,我看到.pyc文件,Windows将其识别为“编译的Python文件”。 这些来自哪里? #1楼 Python代码经历了两个阶段。 第...

javail
45分钟前
4
0
.NET Core初览

初览的应用场景为游戏服务器开发。所以测试在侧重点上更强于IO和密集型计算 TODO

梦想游戏人
47分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部