分布式系列六: WebService简介
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简介的更多相关文章
- 爬虫系列(六) 用urllib和re爬取百度贴吧
这篇文章我们将使用 urllib 和 re 模块爬取百度贴吧,并使用三种文件格式存储数据,下面先贴上最终的效果图 1.网页分析 (1)准备工作 首先我们使用 Chrome 浏览器打开 百度贴吧,在输入 ...
- Spring 系列: Spring 框架简介 -7个部分
Spring 系列: Spring 框架简介 Spring AOP 和 IOC 容器入门 在这由三部分组成的介绍 Spring 框架的系列文章的第一期中,将开始学习如何用 Spring 技术构建轻量级 ...
- CSS 魔法系列:纯 CSS 绘制各种图形《系列六》
我们的网页因为 CSS 而呈现千变万化的风格.这一看似简单的样式语言在使用中非常灵活,只要你发挥创意就能实现很多比人想象不到的效果.特别是随着 CSS3 的广泛使用,更多新奇的 CSS 作品涌现出来. ...
- WCF编程系列(六)以编程方式配置终结点
WCF编程系列(六)以编程方式配置终结点 示例一中我们的宿主程序非常简单:只是简单的实例化了一个ServiceHost对象,然后调用open方法来启动服务.而关于终结点的配置我们都是通过配置文件来 ...
- 分布式缓存BeIT Memcached简介
分布式缓存BeIT Memcached简介 或许你还没有用到过分布式缓存,在web集群的情况下,它可以很好的让一部分常用数据常驻服务器内存而不用担心各台web不同步.下面稍微介绍一下beitmemca ...
- SQL Server 2008空间数据应用系列六:基于SQLCRL的空间数据可编程性
原文:SQL Server 2008空间数据应用系列六:基于SQLCRL的空间数据可编程性 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 ...
- Spring 系列: Spring 框架简介(转载)
Spring 系列: Spring 框架简介 http://www.ibm.com/developerworks/cn/java/wa-spring1/ Spring AOP 和 IOC 容器入门 在 ...
- [渣译文] SignalR 2.0 系列: SignalR简介
原文:[渣译文] SignalR 2.0 系列: SignalR简介 英文渣水平,大伙凑合着看吧,并不是逐字翻译的…… 这是微软官方SignalR 2.0教程Getting Started with ...
- R语言数据分析系列六
R语言数据分析系列六 -- by comaple.zhang 上一节讲了R语言作图,本节来讲讲当你拿到一个数据集的时候怎样下手分析,数据分析的第一步.探索性数据分析. 统计量,即统计学里面关注的数据集 ...
随机推荐
- 11-page分页原理
创建一个分页对象PageBean<T>来存储分页信息+实体信息, 客户端请求时传递分页信息, 服务端将实体信息+分页信息放进分页对象返回给客户端. 实例如下: listStudent.js ...
- python3 json模块
import json '''把python对象转化为json串(字符串), ensure_ascii处理中文乱码'''dic = {"复联4": "好看吗", ...
- (一) Getting Started
Elasticsearch is a highly scalable open-source full-text search and analytics engine. It allows you ...
- c++面经积累<2>
4.类成员初始化方式:列表初始化和赋值初始化 赋值初始化通过在函数体内进行赋值,列表初始化,在构造函数后面加上冒号,使用初始化列表进行初始化.在函数体内进行初始化,是在所有的数据成员被分配内存空间后进 ...
- 【原创】讲讲亿级PV的负载均衡架构
引言 本来没想写这个题材的,为了某某童鞋能够更好的茁壮成长,临时写一篇负载均衡的.负载均衡,大家可能听过什么3层负载均衡.4层负载均衡.7层负载均衡什么的?那这是怎么分的呢,ok,是根据osi七层网络 ...
- idea免费破解
1.下载破解补丁. https://pan.baidu.com/s/1pWCr_HIHURSAbGvvo70wKA 密码:pxkv 2.下载idea网址: https://www.jetbrain ...
- c提高第三次作业
1. char buf[] = "abcdef"; //下面有啥区别? const char *p = buf; //p指向的内存不能变 char const *p = buf; ...
- jsp篇 之 脚本元素
jsp的脚本元素 : 第一种:表达式 (类似输出语句) 表达式 形式:<%= %> 看源码发现[翻译]到java文件中的位置: [out.print(..)]里面的参数. 所以System ...
- python之函数初识
一.函数的初识1.如何定义函数:def 函数名(): 代码... 例如:def my_len(): l = [1, 2, 3, 4] count = 0 for i in l: count += 1 ...
- python之装饰器初识
一.@abstractmethod 1.抽象类的作用:规范编程模式 多人开发.复杂的需求.后期的扩展 是一种用来帮助我们完成规范化的手段 2.如何定义抽象类 1,from abc import ABC ...