WebSerice盛行的时代已经过去, 这里只是简单介绍下其基本概念, 并用JDK自带的API实现一个简单的服务.

WebSerice的概念

WebService是一种跨平台和跨语言的远程调用(RPC)技术. 它基于Http和Xml. 而上一篇分布式系列五: RMI通信中提到的RMI是基于Socket的, 底层协议是JRMP协议.

特点

跨语言, 自描述, 开放性

几个术语

  • WSDL(Web Service Definition Language): 服务定义语言, 描述服务特征, 服务可以对外提供什么服务, 并定义了交互的数据格式.
  • SOAP(Simple Object Access Protocol) 简单对象访问协议: 基于http , 发送的格式是xml.
  • SEI(Webservice Endpoint Interface) 服务终端接口: 服务端用来处理请求的接口.

实现方式

使用JDK提供的API

先定义服务端使用的接口和实现, 并启动一个服务

一. 定义服务接口, 并用@WebService标记接口, 使用@WebMethod标记接口方法

@WebService
public interface ICar {
@WebMethod
String getName();
}

二. 定义接口实现, 使用@WebService标记实现类

@WebService
public class BMWCar implements ICar {
@Override
public String getName() {
return "宝马汽车...";
}
}

三. 启动服务端

public class WsServer {
public static void main(String[] args) {
Endpoint.publish("http://localhost:8090/car",new Car());
}
}

服务端已经完成, 接下来是客户端调用的部分

四. 生成调用

需要使用jdk的工具wsimport.exe生成调用文件, 首先启动服务, 然后在服务端代码所在路径运行命令: wsimport -keep http://localhost:8090/car?wsdl. 这时会在包内生成客户端所需调用文件.

五. 定义客户端调用

public class Client {
public static void main(String[] args) {
BMWCarService service = new BMWCarService();
com.xlx.ws.client.BMWCar car = (com.xlx.ws.client.BMWCar) service.getBMWCarPort();
System.out.println(car.getCarName());
}
}

上面使用JDK的API实现一个简单的WebService.

在浏览器中输入http://localhost:8090/car?wsdl 可以查看wsdl文档, 可以看到这个xml的内容还是很多的.对于复杂对象的定义这个文档会变得越来越大, 甚至有些对象无法用其表述导致丢失. 另外xml本身传输量要大于json, 因此现在WebService目前已经逐渐退出主流的技术框架.

Spring 使用的是CFX框架集成了WebService.可以实现rest形式的webservice服务.

分布式系列六: WebService简介的更多相关文章

  1. 爬虫系列(六) 用urllib和re爬取百度贴吧

    这篇文章我们将使用 urllib 和 re 模块爬取百度贴吧,并使用三种文件格式存储数据,下面先贴上最终的效果图 1.网页分析 (1)准备工作 首先我们使用 Chrome 浏览器打开 百度贴吧,在输入 ...

  2. Spring 系列: Spring 框架简介 -7个部分

    Spring 系列: Spring 框架简介 Spring AOP 和 IOC 容器入门 在这由三部分组成的介绍 Spring 框架的系列文章的第一期中,将开始学习如何用 Spring 技术构建轻量级 ...

  3. CSS 魔法系列:纯 CSS 绘制各种图形《系列六》

    我们的网页因为 CSS 而呈现千变万化的风格.这一看似简单的样式语言在使用中非常灵活,只要你发挥创意就能实现很多比人想象不到的效果.特别是随着 CSS3 的广泛使用,更多新奇的 CSS 作品涌现出来. ...

  4. WCF编程系列(六)以编程方式配置终结点

    WCF编程系列(六)以编程方式配置终结点   示例一中我们的宿主程序非常简单:只是简单的实例化了一个ServiceHost对象,然后调用open方法来启动服务.而关于终结点的配置我们都是通过配置文件来 ...

  5. 分布式缓存BeIT Memcached简介

    分布式缓存BeIT Memcached简介 或许你还没有用到过分布式缓存,在web集群的情况下,它可以很好的让一部分常用数据常驻服务器内存而不用担心各台web不同步.下面稍微介绍一下beitmemca ...

  6. SQL Server 2008空间数据应用系列六:基于SQLCRL的空间数据可编程性

    原文:SQL Server 2008空间数据应用系列六:基于SQLCRL的空间数据可编程性 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 ...

  7. Spring 系列: Spring 框架简介(转载)

    Spring 系列: Spring 框架简介 http://www.ibm.com/developerworks/cn/java/wa-spring1/ Spring AOP 和 IOC 容器入门 在 ...

  8. [渣译文] SignalR 2.0 系列: SignalR简介

    原文:[渣译文] SignalR 2.0 系列: SignalR简介 英文渣水平,大伙凑合着看吧,并不是逐字翻译的…… 这是微软官方SignalR 2.0教程Getting Started with ...

  9. R语言数据分析系列六

    R语言数据分析系列六 -- by comaple.zhang 上一节讲了R语言作图,本节来讲讲当你拿到一个数据集的时候怎样下手分析,数据分析的第一步.探索性数据分析. 统计量,即统计学里面关注的数据集 ...

随机推荐

  1. 11-page分页原理

    创建一个分页对象PageBean<T>来存储分页信息+实体信息, 客户端请求时传递分页信息, 服务端将实体信息+分页信息放进分页对象返回给客户端. 实例如下: listStudent.js ...

  2. python3 json模块

    import json '''把python对象转化为json串(字符串), ensure_ascii处理中文乱码'''dic = {"复联4": "好看吗", ...

  3. (一) Getting Started

    Elasticsearch is a highly scalable open-source full-text search and analytics engine. It allows you ...

  4. c++面经积累<2>

    4.类成员初始化方式:列表初始化和赋值初始化 赋值初始化通过在函数体内进行赋值,列表初始化,在构造函数后面加上冒号,使用初始化列表进行初始化.在函数体内进行初始化,是在所有的数据成员被分配内存空间后进 ...

  5. 【原创】讲讲亿级PV的负载均衡架构

    引言 本来没想写这个题材的,为了某某童鞋能够更好的茁壮成长,临时写一篇负载均衡的.负载均衡,大家可能听过什么3层负载均衡.4层负载均衡.7层负载均衡什么的?那这是怎么分的呢,ok,是根据osi七层网络 ...

  6. idea免费破解

    1.下载破解补丁. https://pan.baidu.com/s/1pWCr_HIHURSAbGvvo70wKA   密码:pxkv 2.下载idea网址: https://www.jetbrain ...

  7. c提高第三次作业

    1. char buf[] = "abcdef"; //下面有啥区别? const char *p = buf; //p指向的内存不能变 char const *p = buf; ...

  8. jsp篇 之 脚本元素

    jsp的脚本元素 : 第一种:表达式 (类似输出语句) 表达式 形式:<%= %> 看源码发现[翻译]到java文件中的位置: [out.print(..)]里面的参数. 所以System ...

  9. python之函数初识

    一.函数的初识1.如何定义函数:def 函数名(): 代码... 例如:def my_len(): l = [1, 2, 3, 4] count = 0 for i in l: count += 1 ...

  10. python之装饰器初识

    一.@abstractmethod 1.抽象类的作用:规范编程模式 多人开发.复杂的需求.后期的扩展 是一种用来帮助我们完成规范化的手段 2.如何定义抽象类 1,from abc import ABC ...