WebService学习(一)

一、WebService简介
(1)简介----百度百科(注意标识的重点)

        Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。
        Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。Web Service是自描述、 自包含的可用网络模块, 可以执行具体的业务功能。Web Service也很容易部署, 因为它们基于一些常规的产业标准以及已有的一些技术,诸如标准通用标记语言下的子集XML、HTTP。Web Service减少了应用接口的花费。Web Service为整个企业甚至多个组织之间的业务流程的集成提供了一个通用机制。
(2)WebService三元素

UDDI:UDDI 的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。---简单点说,就是一套规则,方便使用;

WSDL:Web Service描述语言WSDL 就是用机器能阅读的方式提供的一个正式描述文档而基于XML(标准通用标记语言下的一个子集)的语言,用于描述Web Service及其函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的。----简单点说,就是使用规则,方便人和机器进行阅读;

SOAP协议:基于Http,基于XML,SOAP即简单对象访问协议(Simple Object Access Protocol),它是用于交换XML(标准通用标记语言下的一个子集)编码信息的轻量级协议。它有三个主要方面:XML-envelope为描述信息内容和如何处理内容定义了框架,将程序对象编码成为XML对象的规则,执行远程过程调用(RPC)的约定。SOAP可以运行在任何其他传输协议上。例如,你可以使用 SMTP,即因特网电子邮件协议来传递SOAP消息,这可是很有诱惑力的。在传输层之间的头是不同的,但XML有效负载保持相同。----简单点说,就是传输协议,方便进行传输;

(3)WebService与Socket的区别(两种通信的方式)
      1. Socket是基于TCP/IP的传输层协议。 
            Webservice是基于HTTP协议传输数据,http是基于tcp的应用层协议。 
            Webservice采用了基于http的soap协议传输数据。
      2.Socket接口通过流传输,不支持面向对象。 
            Webservice 接口支持面向对象,最终webservice将对象进行序列化后通过流传输。 
            Webservice采用soap协议进行通信,不需专门针对数据流的发送和接收进行处理,是一种跨平台的面向对象远程调用技术。
      3.Socket适用于高性能大数据的传输,传输的数据需要手动处理,socket通信的接口协议需要自定义。

二、建一个简单的webservice

     1.   服务端代码(因为webservice已经作为了java SE里面自带的内容,所以建一个Java工程项目即可,而不需要是web项目)

        

 1 package com.sunshine.myWebservice;
 2 import javax.jws.WebService;
 3 import javax.xml.ws.Endpoint;
 4 
 5 @WebService
 6 public class MyFristWebService {
 7     /**
 8      * 定义webservice服务器中的方法
 9      * @param content
10      * @return
11      */
12     public String testWebService(String content){
13         System.out.println("我收到了你发的信息:" + content);
14         return "服务器:我转发信息给你";
15     }
16     
17     public static void main(String[] args){
18         //定义自己的webservice服务器发布的地址
19         String address = "http://localhost:9090/MyFirstWebService"; //这个9090端口随便定义,只要不冲突即可
20         //通过该方法进行发布
21         Endpoint.publish(address, new MyFristWebService());
22         //打印一句话,表示一下服务器进行了开启
23         System.out.println("my webservcie starting");
24     }
25 
26 }

温馨提示:1:必须加@WebService注解或者@WebServiceProvider

                  2:至少有一个方法是public,并且不可以用static 和 final进行修饰;原因很明显,因为webservice就是提供给别人各自进行使用的,而不是保持同一个,所以不能是static ,而对于final修饰的话就是不可继承,这也是没有意义的。大家可以试试,将方法进行修改,看会不会报错。

        2)解析WebService服务器的内容,生成webservice代码

             注:需要先启动刚刚我们创建的服务端,然后在浏览器输入我们设置的地址+?wsdl,如:http://localhost:9090/MyFirstWebService?wsdl,如果显示如下则成功(也可以telnet localhost 9090 看地址是否通)

              

             

             然后在cmd命令行中执行:wsimport -s . http://localhost:9090/MyFirstWebService?wsdl 如下则成功

          

          我的项目是在E盘,所以会生成如下代码,地址其实就是我们在服务端创建的包

 

     3)创建客户端(和服务端一样,java项目即可)将刚才生成的服务端代码复制进客户端项目   注:仅限java文件不包含class文件

 1 package com.sunshine.mywebservice;
 2 
 3 import org.junit.Test;
 4 
 5 public class MyTestWebService {
 6     @Test
 7     public void testWebService(){
 8         //获取webservice服务器对象(这里的类名,其实是从wsdl文件中的servicename标签中进行获取的)
 9         MyFristWebServiceService myFirstWebServiceService = new MyFristWebServiceService();
10         //获取到我们自定义的webservice的对象
11         MyFristWebService myFirstWebServicePort = myFirstWebServiceService.getMyFristWebServicePort();
12         //调用service服务器中的方法
13         String receivedInfo = myFirstWebServicePort.testWebService("您好,webservice 服务器");
14         //打印从服务器的方法中得到的返回值,测试表示收到了服务器返回的内容
15         System.out.println("服务器返回的内容是:" + receivedInfo);        
16     }
17 
18 }

在保证服务端启动的情况下,启动我们的测试类(成功如下)

 

 转载://https://blog.csdn.net/cs_hnu_scw/article/details/80181762

原文地址:https://www.cnblogs.com/huangchunbao/p/11202439.html