`

深入了解java WebService

阅读更多

       前言:WebService就目前来讲已经是一种成熟的技术了,优缺点也相当明显,本文旨在入门webService,详解其使用场景,结合具体demo进行分析。

本篇文章重点关注以下问题:

  • WebService的优缺点及使用场景?
  • 了解WebService的基本概念,Soap、WSDL、XML、HTTP、UDDI指什么,在WebService中扮演什么样的角色?
  • 服务端如何发布服务,客户端如何调用服务,具体步骤怎样?

 1、WebService的特点及使用场景

       WebService是很常见的远程调用方法,其最大的优势就是跨平台语言,无论客户端是Java还是.NET都能轻松的调用。它采用SOAP(Simple Object Access Protocol)协议来封装序列化的消息,实际上是形成一个xml文件,可以通过http进行网络传输。WebService的客户端调用其实是使用生成文件的方式,只要知道发布接口的URL即可,而不需要额外传递jar包或者class文件。

      WebService 的主要目标是跨平台的可互操作性

       优点:

  • 跨防火墙的通信:一般要访问的Web服务器以及要访问的Web Service的客户端很可能位于防火墙后面,都默认关闭其它端口而开放HTTP端口,而Web service 正是基于HTTP的,所以它可以穿越防火墙;
  • 应用程序集成:可以实现不同应用程序和在不同系统平台上开发出来的应用程序之间通信。与RMI、DOCM、CORBA最大的不同就是:Web Service 以 SOAP 作为基本通信协议从而避免了复杂的协议转换;
  • B2B 的集成:跨公司的商务交易集成通常叫做B2B 集成。通过WebService ,公司可以把关键的商务应用“ 暴露” 给指定的供应商和客户,只要把商务逻辑“ 暴露” 出来,成为WebService ,就可以让任何指定的合作伙伴调用这些商务逻辑,而不管他们的系统在什么平台上运行,使用什么 开发语言。这样就大大减少了花在B2B 集成上的时间和成本,让许多原本无法承受EDI 的中小企业也能实现B2B 集成。

        缺点:

  • 单机应用程序:单机应用程序只要与本机上的其他程序通讯,这种情况下使用WebService消耗太大,而且不会带来任何好处;
  • 局域网的同构应用程序:简言之,还是性能问题。只要从应用程序结构的角度看,有别的方法比WebService更有效、更可行,那就不要用WebService。

2、WebService初了解

        先给WebService下个定义:WebService是一种跨编程语言和跨操作系统平台的远程调用技术。定义中有两个关键点:

  • 一是跨语言跨平台,说明它有广为接受的协议,是标准。类似于SQL,不同语言不同平台通过sql操作数据库,而不同语言不同平台通过WebService发布、使用服务。Sql搭载的是数据,WebService搭载的是服务。
  • 二是远程调用,说明它涉及网络通信,整个调用过程涉及不同模块,不同角色。

       下面先介绍实现一个完整WebService功能需要的组成成员与流程。首先上图:

 

这幅图描述了完整WebService服务的整个过程以及发布、调用WebService的整个流程,大致流程如下:

  1. 服务发布:服务提供者设计服务的接口(功能A)并予以实现,本地调试通过后想服务注册中心发布,向UDDI注册;
  2. 查询服务:服务请求者需要使用功能A时,可以向UDDI查询,UDDI则会返回能满足请求者的服务(WSDL);
  3. 分析服务:服务请求者收到UDDI反馈的WSDL服务描述信息,予以分析,生成客户端所需的模块准备发起WebService请求;
  4. 发起服务:分析WSDL服务描述,生成相应的SOAP消息,发送给服务提供者,以期待获得服务;
  5. 完成服务:服务提供者按SOAP消息执行指定的服务,并将服务结果反馈给请求者。
由上图和前面的流程介绍,WebService的体系结构及各自扮演的角色也很明确:
  • 服务提供者:即服务的提供者,它一直等待接收客户端的请求并反馈服务响应。(发布服务)
  • 服务请求者:即服务的使用者,它利用SOAP消息向服务提供者发送请求并获得服务。(使用服务)
  • 服务中介者:即UDDI,充当管理员的角色,其主要职责就是将服务请求者和合适的服务提供者联系起来,当然这个角色并不是必须的,尤其是客户端知道服务端的情况下。(绑定服务)
在了解WebService各模块及工作流程之后,我们接下来需要了解各模块之间如何交互,跨平台跨语言的协议标准是怎样的。
  • XML:(Extensible Markup Language)扩展型可标记语言。xml与语言无关、与平台无关,经常作为信息载体用于保存数据,是Soap的基础。
  • SOAP:(Simple Object Access Protocol)简单对象存取协议。是XML Web Service 的通信协议。当客户端通过UDDI找到服务WSDL描述文档后,它可以通过SOAP调用你建立的Web服务中的一个或多个操作。SOAP是XML文档形式的调用方法的规范,它可以支持不同的底层接口,像HTTP(S)或者SMTP,可以这样描述:SOAP=在HTTP的基础上+XML数据
  • WSDL:(Web Services Description Language) WSDL 文件是一个 XML 文档,用于说明一组 SOAP 消息:服务在什么地方(地址),提供什么样的方法(如何调用)。大多数情况下由软件自动生成和使用。
  • UDDI:(Universal Description, Discovery, and Integration) UDDI是一种根据描述文档来引导系统查找相应服务的机制。UDDI利用SOAP消息机制(标准的XML/HTTP)来发布,编辑,浏览以及查找注册信息。它采用XML格式来封装各种不同类型的数据,并且返回需要的数据。

 3、WebService样例输出

3.1 利用JAX-WS发布发布、调用WebService服务

3.1.1 发布WebService服务

        直接上代码:

@WebService // @WebService : 用在类上,将此类发布成一个WebService服务
public class HelloService {
    
    public String sayHello(String name) {
        System.err.println("hello " + name);
        return "hello, " + name;
    }
    
    /**
     * @WebMethod(exclude=true)注解用于方法上,阻止对完公开此方法
     */
    @WebMethod(exclude=true)
    public void notPublish() {
        System.out.println("@WebMethod(exclude=true)注解用于方法上,阻止对完公开此方法");
    }
    
    /**
     * final方法不能对外发布
     */
    public final void finalMethod() {
        System.out.println("final方法不能对外开放");
    }
    
    /**
     * static方法不能对外发布
     */
    public static void staticMethod() {
        System.out.println("静态方法不能对外开放");
    }
    
    public static void main(String[] args) {
        // Endpoint : 此类为端点服务类,它的publish方法用于将一个已经添加了@WebService注解的对象绑定到一个地址的端口上发布。
        // 注意:EndPoint发布服务之后,将会以独立的线程运行,所以publish之后的代码可以正常运行。
        Endpoint.publish("http://localhost:9999/sayHello", new HelloService());
    }
}

        注释中已解释JAX-WS基本用法,最后提一点:如果一个类上被添加了@WebService注解,则此类至少有一个公开发布的方法,否则启动失败。

        EndPoint在指定地址的一个端口上发布服务后,在浏览器中输入http://localhost:9999/sayHello?wsdl,如若可以获得WebService的说明文件,即WSDL文件,则说明服务发布成功。有关WSDL的具体说明可以查阅相关资料,这里不做阐述。

 

3.1.2 使用WebService服务

客户端调用WebService的方式:

  • 通过wsimport生成客户端代码;
  • 通过客户端编程的方式调用;
  • 通过ajax调用(js + XML);
  • 通过URLConnection调用;
1、通过wsimport生成客户端代码

      WSDL文档不易阅读,但是JDK自带wsimoport命令可以根据WSDL文档生成客户端调用服务代码,无论服务端的WebService是用什么语言写的,都将在客户端生成java代码。对于上述发布的服务,在控制开输入命令:

      wsimport –s . http://localhost:9999/sayHello?wsdl

      -s用于指定生成java文件,后面的点指明源代码生成后所在的目录,点为当前目录

      

       拷贝java代码至客户端的工程中,可以对照WSDL文件学习如何调用,下面上代码:

/**
 * 利用wsImport方式生成客户端调用WebService服务
 * @author Administrator
 */
public class ClientMain {

    public static void main(String[] args) {
        // HelloServiceService 对应于WSDL文档中绑定的的Service节点
        HelloServiceService helloServiceService = new HelloServiceService();
        // HelloService 对应于WSDL中的portType节点,代表着WebService发布的一个函数库或是类
        HelloService        helloService        = helloServiceService.getHelloServicePort();
        // 下面的方法即为服务类HelloService发布的一个服务或方法
        String result = helloService.sayHello("熊燕子");
        System.out.println(result);
    }

}
 2、通过客户端编程的方式调用

      通过JAX-WS生成客户端代码,并因此为基础调用WebService服务,其缺点是导致依赖的文件太多,而通过客户端编程的方式调用WebService可避免无必要的文件。当然,客户端编程也可以利用JAX-WS生成必要的服务接口。(如上述生成的HelloService.java接口)

       

/**
 * 以客户端编程的方式调用
 * @author Administrator
 */
public class ClientInvoke {

    public static void main(String[] args) throws MalformedURLException {
        // 声明WSDL地址
        URL wsdlUrl = new URL("http://localhost:9999/sayHello?wsdl");
        // 客户端创建Service对象
        // 第一个参数:WSDL中types节点下定义的命名空间
        // 第二个参数:WSDL中Service节点的name属性定义的服务名
        String nameSpace   = "http://webService.wj.com/";
        String serviceName = "HelloServiceService";
        Service s = Service.create(wsdlUrl, new QName(nameSpace, serviceName));
        // 获得WebService服务的接口
        // 第一个参数:WSDL中types节点下定义的命名空间
        // 第二个参数:WSDL中portType节点的name属性定义的服务
        HelloService hs = s.getPort(new QName("http://webService.wj.com/","HelloServicePort"), HelloService.class);
        // 调用发布的服务或者说是方法
        String ret = hs.sayHello("熊燕子");
        System.out.println(ret);
    }

}

     对上述客户端调用WebService的方式做几点说明:

  1. QName对象意为全限定名,通过WSDL(本质是XML文件)中的命名空间和节点即可定位所需的Service对象;
  2. 客户端编程需要一个与服务端接口完全相同的类(仍然可以使用工具生成,但是只需要一个接口),如果返回的是一个POJO类,也需要一并放入客户端;
  3. 上述过程本质上寻找WSDL的具体节点元素,如下图所示:

 

3、通过AJAX的方式调用

       因不符合项目使用场景就没输出demo,见谅。

4、通过URLConnection调用

      URLConnection调用WebService本质上其实就是和Ajax方式类似,都是手动完善HTTP请求并发送,所以比较麻烦,这边也简单做了个样例展示一下:

 

/**
 * 通过UrlConnection调用Webservice服务
 */
public class App {

    public static void main(String[] args) throws Exception {
        // 以服务的地址生成URL
        URL wsUrl = new URL("http://localhost:9999/sayHello");
        // 打开URL的链接
        HttpURLConnection conn = (HttpURLConnection) wsUrl.openConnection();
        
        conn.setDoInput(true);
        conn.setDoOutput(true);
        conn.setRequestMethod("POST");    // WebService的提交方式都是"POST"
        conn.setRequestProperty("Content-Type", "text/xml;charset=UTF-8");// MIME类型固定
        
        OutputStream os = conn.getOutputStream();
        
        // 自己构造SOAP的请求体
        String soap = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:q0=\"http://webService.wj.com/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" + 
                      "<soapenv:Body> <q0:sayHello><arg0>aaa</arg0>  </q0:sayHello> </soapenv:Body> </soapenv:Envelope>";
        
        // 发送消息
        os.write(soap.getBytes());
        
        InputStream is = conn.getInputStream();
        
        byte[] b = new byte[1024];
        int len = 0;
        String s = "";
        while((len = is.read(b)) != -1){
            String ss = new String(b,0,len,"UTF-8");
            s += ss;
        }
        System.out.println(s);
        
        is.close();
        os.close();
        conn.disconnect();
    }
}

      通过上述过程不难看出,这种方式比较麻烦,不仅需要手动构造SOAP消息体的内容,还需要自己解析收到的服务反馈。到这里又人可能会问,消息体需要自己一个一个字的敲?其实不然,eclipse有支持的,下面详细说明。

3.2 CXF发布、调用WebService服务

      请转看同主题下对CXF的详细介绍介绍。

4、补充说明:Eclipse对WebService开发的支持

 1、打开Web Service Explorer,输入WSDL地址,单击运行,如下图所示:

 

 2、确认后左侧导航会显示已发布的WebService服务信息,右侧为详细服务信息,输入相应参数后调用WebService服务,如下图所示:

 

 3、调用服务后,在结果输出界面你会发现服务端反馈的结果,并可点击"source"查看详细收发的报文,如下图所示:

 

 4、查看收发的报文

 

      我在URLConnection方式中填充发送消息的SOAP内容就是直接拷贝过来的,是不是很方便。用这种方式也可以测试WebService服务是否发布成功。

 

代码地址:http://pan.baidu.com/s/1dFDz7rF,密码:mbyx

 

  • 大小: 14.6 KB
  • 大小: 23.3 KB
  • 大小: 14.8 KB
  • 大小: 22.6 KB
  • 大小: 19.3 KB
  • 大小: 26.6 KB
  • 大小: 6.2 KB
  • jwx.rar (20.9 KB)
  • 下载次数: 1
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    java webService接口开发案例

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

    JavaWebService.rar

    Java WebService是基于Java平台的一种服务导向架构(Service-Oriented ...通过对`WebServiceClient`和`WebServiceDemo`的分析和实践,可以深入理解Java WebService的工作流程和实现细节,进一步提升开发能力。

    java 利用webservice传输文件

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

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

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

    java Webservice 简单实例

    本教程将通过一个简单的Java WebService实例,帮助你理解其工作原理和实现过程。 1. **了解WebService** WebService是一种通过网络进行通信的软件系统,使用SOAP(简单对象访问协议)进行消息传输,WSDL描述了服务...

    Java webservice cxf客户端调用demo和服务端

    首先,让我们深入理解CXF的核心概念。CXF允许开发者使用Java编程模型来创建和消费Web服务,这包括JAX-WS(Java API for XML Web Services)和JAX-RS(Java API for RESTful Web Services)。在本示例中,我们关注的...

    java webservice教程

    10. **API文档和Example**:提供的API文档将帮助你深入理解各种接口和类的用途,而example文件将提供实际应用的实例,帮助你快速上手。 通过这个英文版的Java WebService教程,你将能够全面掌握Web服务的开发和使用...

    Java WebService大讲堂(1-10集,完整版)

    这个完整版包括了1-10集的内容,旨在帮助开发者全面理解和掌握Java WebService的开发与实现。 首先,让我们从基础开始。WebService是一种基于开放标准的、平台和语言无关的服务提供和消费方式,主要利用SOAP...

    PB调用JAVA WEBSERVICE实例

    标题中的“PB调用JAVA WEBSERVICE实例”指的是使用PowerBuilder(PB)应用程序调用由Java编写的Web服务。在企业级应用开发中,不同语言之间的互操作性是非常重要的,而Web服务提供了一种标准的方式来实现这一点。让...

    Java Webservice开发实例(简要说明)

    Java Web服务(Webservice...这个Java Webservice开发实例提供了完整的服务端和客户端代码,可以帮助开发者快速理解和实践Java Web服务的开发过程。通过学习和实践,可以熟练掌握使用Java构建和调用Web服务的基本技能。

    Java Webservice Axis2 Client(含soapheader验证)

    本教程将深入探讨如何在Java中使用Axis2构建一个包含SOAP Header验证的客户端。 首先,理解SOAP Header至关重要。SOAP Header是SOAP消息的一部分,用于传递非处理信息,如认证、交易、安全等。与SOAP Body不同,...

    JAVA调用webservice并解析xml

    本教程将深入讲解如何在Java环境中,利用Eclipse或MyEclipse IDE调用Web服务并解析返回的XML数据。 首先,理解Web服务的基本概念是关键。Web服务是一种通过HTTP协议传输数据的应用程序接口(API)。SOAP是基于XML的...

    Java webservice服务动态配置

    在这个主题中,我们将深入探讨Java WebService服务的动态配置,以及与Oracle数据库备份和后台配置界面相关的知识点。 首先,Java WebService基于标准如SOAP(Simple Object Access Protocol)和WSDL(Web Services ...

    myeclipse开发Java WebService.zip

    通过对"TestHelloWorldWebService"和"HelloWorld"的实践,开发者可以深入理解Web服务的工作原理,并扩展到更复杂的实际应用。在实际工作中,掌握这些技能对于构建分布式系统和实现跨平台数据交换至关重要。

    java webservice的发布以及调用

    ### Java WebService 的发布与调用 #### 一、前言 随着互联网技术的发展,不同系统之间的通信变得...通过这个过程,读者可以深入了解WebService的工作原理和技术细节,为进一步开发复杂的应用系统打下坚实的基础。

    java webservice flash在domino中的使用

    Java Web服务(Webservice)与Flash技术在IBM Lotus Domino环境中的整合是一个复杂而有趣的主题,它涉及了多种技术的交互。让我们深入探讨一下这个话题。 首先,Java Web服务是一种通过HTTP协议提供和消费的标准化...

    java注解webservice学习第一篇

    本文将深入探讨如何使用Java注解来构建Web服务,并结合给出的“lib”压缩包文件,推测可能包含了一些用于支持Web服务的库文件。 首先,让我们了解什么是Web服务。Web服务是一种基于互联网的软件应用,允许不同的...

    深入浅出WebService

    【深入浅出WebService】这篇文章是面向初学者的指南,旨在帮助读者理解并熟悉WebService的基本概念和技术。WebService是一种基于Web的服务,允许不同系统间通过网络进行通信和数据交换,以实现跨平台、跨语言的互...

    java调用webservice.pdf

    综上所述,本文档涵盖了JavaWebService开发的多个方面,包括接口定义、端点发布、客户端调用、工具使用以及部署容器整合等,这些都是在实际开发中不可或缺的关键知识点。通过深入理解和运用这些知识,可以帮助开发者...

Global site tag (gtag.js) - Google Analytics