WebService基础学习(二)—三要素
一、Java中WebService规范
JAVA 中共有三种WebService 规范,分别是JAX-WS、JAX-RS、JAXM&SAAJ(废弃)。
1.JAX-WS规范
JAX-WS 的全称为Java API for XML-Based Webservices ,早期的基于SOAP 的JAVA 的Web 服务规范JAX-RPC(Java API For XML-Remote Procedure Call)目前已经被JAX-WS 规范取代。从java5开始支持JAX-WS2.0版本,Jdk1.6.0_13以后的版本支持2.1版本,jdk1.7支持2.2版本。
采用标准SOAP(Simple Object Access Protocol) 协议传输,soap属于w3c标准。Soap协议是基于http的应用层协议,soap协议传输是xml数据。
采用wsdl作为描述语言即webservice使用说明书,wsdl属w3c标准。
xml是webservice的跨平台的基础,XML主要的优点在于它既与平台无关,又与厂商无关。
XSD,W3C为webservice制定了一套传输数据类型,使用xml进行描述,即XSD(XML Schema Datatypes),任何编程语言写的webservice接口在发送数据时都要转换成webservice标准的XSD发送。
2.JAX-RS规范
JAX-RS 是JAVA 针对REST(Representation State Transfer)风格制定的一套Web 服务规范,由于推出的较晚,该规范(JSR 311,目前JAX-RS 的版本为1.0)并未随JDK1.6 一起发行。
支持JAX-RS服务规范的框架有:
CXF——XFire和Celtix的合并(一个由IONA赞助的开源ESB,最初寄存在ObjectWeb上)。
Jersey——Sun公司的JAX-RS参考实现。
RESTEasy——JBoss的JAX-RS项目。
Restlet——也许是最早的REST框架了,它JAX-RS之前就有了。
注:REST 是一种软件架构模式,只是一种风格,rest服务采用HTTP 做传输协议。
二、WebService(jax-ws)三要素
SOAP: 基于HTTP协议,采用XML格式,用来传递信息的格式。
WSDL: 用来描述如何访问具体的服务。
UDDI: 用户自己可以按UDDI标准搭建UDDI服务器,用来管理,分发,查询WebService 。其他用户可以自己注册发布WebService调用。
1.SOAP(通讯协议)
Simple Object Accrss Protocol,简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML的协议,它包括四个部分:
(1)SOAP封装(envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它,以及如何处理它们的框架;
(2)SOAP编码规则,用于表示应用程序需要使用的数据类型的实例。
(2)SOAP RPC 表示远程过程调用和应答的协定。
(4)SOAP绑定(binding),使用底层协议交换信息。
(1)请求的协议体
POST /weather HTTP/1.1
Accept: text/xml, multipart/related
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://weather.itheima.com/WeatherInterface/getWeatherByCityNameRequest"
User-Agent: JAX-WS RI 2.2.4-b01
Host: 127.0.0.1:54321
Connection: keep-alive
Content-Length: 235
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:getWeatherByCityName xmlns:ns2="http://weather.itheima.com">
<cityName>北京</cityName>
</ns2:getWeatherByCityName>
</S:Body>
</S:Envelope>
(2)响应的协议体
HTTP/1.1 200 OK
Transfer-encoding: chunked
Content-type: text/xml; charset=utf-8
Date: Fri, 09 Oct 2015 07:23:29 GMT
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:getWeatherByCityNameResponse xmlns:ns2="http://weather.itheima.com">
<WeatherInfo>今天风很大</WeatherInfo>
</ns2:getWeatherByCityNameResponse>
</S:Body>
</S:Envelope>
(3)发布基于soap1.2协议的服务
在SEI实现类上添加如下注解
@BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING)
发布基于soap1.2协议的服务,需要jax-ws包要求2.2.8以上版本。
(4)soap1.2请求的协议体
POST /weather HTTP/1.1
Accept: application/soap+xml, multipart/related
Content-Type: application/soap+xml; charset=utf-8;
action="http://weather.itheima.com/WeatherInterface/getWeatherByCityNameRequest"
User-Agent: JAX-WS RI 2.2.4-b01
Host: 127.0.0.1:54321
Connection: keep-alive
Content-Length: 233
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
<S:Body>
<ns2:getWeatherByCityName xmlns:ns2="http://weather.itheima.com">
<cityName>北京</cityName>
</ns2:getWeatherByCityName>
</S:Body>
</S:Envelope>
(5)soap1.2响应的协议体
HTTP/1.1 200 OK
Transfer-encoding: chunked
Content-type: application/soap+xml; charset=utf-8
Date: Fri, 09 Oct 2015 07:54:53 GMT
<?xml version='1.0' encoding='UTF-8'?>
<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
<S:Body>
<ns2:getWeatherByCityNameResponse xmlns:ns2="http://weather.itheima.com">
<WeatherInfo>今天风很大</WeatherInfo>
</ns2:getWeatherByCityNameResponse>
</S:Body>
</S:Envelope>
2.WSDL
WSDL(Web Service Description Language),是一个用来描述Web服务(Web Service)和说明如何与Web服务通信的XML语言。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的,这将是一个很大的好处。

(1)wsdl的阅读方法
是从下往上读。
每个wsdl有且只有一个Service节点。
1、先找Service节点
2、Service节点中找port节点。每个port对应一个PortType。
3、Port节点对应一binding节点。每个binding节点对应一个PortType
4、PortType中有operation 节点就是服务的方法。
5、operation 中有Input(参数)和output(返回值)
6、Input(参数)和output(返回值)对应message节点
7、Message对应element节点。Element节点对应complexType节点描述了参数及返回值的数据类型。
(2)使用注解规范wsdl
@WebService: 定义服务,在public class上边。
targetNamespace:指定命名空间。
name:portType的名称。
portName:port的名称。
serviceName:服务名称。
@WebResult:定义返回值。
name:返回结果值的名称。
@WebParam:定义参数。
name:指定参数的名称。
@WebMethod
exclude:排除指定的方法。
默认情况下,SEI实现类中所以的public方法会发布成服务方法。
如果不想把public方法发布成服务方法,需要使用@WebMethod注解。把此方法排除。在实现类中至少有一个方法发布为服务方法。

http://127.0.0.1:12345/weather?wsdl


http://127.0.0.1:12345/weather?xsd=1

作用: 通过注解,可以更加形像的描述Web服务。对自动生成的wsdl文档进行修改,为使用者提供一个更加清晰的wsdl文档。
当修改了WebService注解之后,会影响客户端生成的代码。调用的方法名和参数名也发生了变化。
3.UDDI
UDDI 是一种目录服务,通过它,企业可注册并搜索 Web services。企业将自己提供的Web Service注册在UDDI,也可以使用别的企业在UDDI注册的web service服务,从而达到资源共享。
UDDI旨在将全球的webservcie资源进行共享,促进全球经济合作。
但是使用webservice并不是必须使用UDDI,因为用户通过WSDL知道了web service的地址,可以直接通过WSDL调用webservice。
三、区域查询系统
1.需求分析
创建区域查询服务系统,对外发布WebService服务,供客户端调用,根据parentid查询区域信息,返回区域信息列表,并支持分页。

2.服务端
第一步:创建一java工程
第二步:导入mysql的数据库驱动。
第三步:创建一个dao。根据parentid查询区域列表。返回区域pojo的list。支持分页。
第四步:创建一个SEI
第五步:创建SEI实现类。@Webservice注解不要忘。
第六步:发布服务。
AreaDao.java
public class AreaDao{
public List<Area> getAreaList(String parentId,int page,int rows){
//JDBC查询数据库
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
List<Area> list = new ArrayList<Area>();
try{
//加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//创建一个连接
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/webservice","root","123456");
//创建Preparement
String sql = "SELECT * FROM area WHERE PARENTID=? LIMIT ?,?";
ps = con.prepareStatement(sql);
ps.setString(1,parentId);
ps.setInt(2,(page - 1) * rows);
ps.setInt(3,rows);
//执行查询
rs = ps.executeQuery();
//取查询结果
while(rs.next()){
Area a = new Area();
a.setAreaCode(rs.getString("AREACODE"));
a.setAreaFullName(rs.getString("AREAFULLNAME"));
a.setAreaLevel(rs.getString("AREALEVEL"));
a.setAreaName(rs.getString("AREANAME"));
a.setParentId(rs.getString("PARENTID"));
a.setShortName(rs.getString("SHORTNAME"));
list.add(a);
}
return list;
}catch(Exception e){
e.printStackTrace();
}
finally{
try{
rs.close();
ps.close();
con.close();
}catch(SQLException e){
e.printStackTrace();
}
}
return list;
}
}
AreaInterface.java
/*
* 区域查询SEI
*/
public interface AreaInterface{ List<Area> getAreaList(String parentId,int page,int rows);
}
AreaInterfaceImpl.java
/*
*SEI实现类
*/
@WebService
public class AreaInterfaceImpl implements AreaInterface{ @Override
public List<Area> getAreaList(String parentId,int page,int rows){ //使用Dao查询区域列表
AreaDao dao = new AreaDao();
List<Area> list = dao.getAreaList(parentId,page,rows);
return list;
} }
AreaServer.java
/*
* 区域查询服务发布
*/
public class AreaServer{ public static void main(String[] args){ Endpoint.publish("http://127.0.0.1:12345/area",new AreaInterfaceImpl()); }
}
3.客户端
第一步:创建一个java工程
第二步:基于wsdl生成客户端调用代码
第三步:创建服务视图
第四步:获得PortType对象
第五步:调用服务端方法。
AreaClient.java
/*
* 客户端调用代码
*/
public class AreaClient{ public static void main(String[] args){ //创建服务视图
AreaInterfaceImplService service = new AreaInterfaceImplService();
//从服务视图获取PortType
AreaInterfaceImpl port = service.getAreaInterfaceImplPort();
List<Area> list = port.getAreaList("1.1.",1,5);
for(Area area : list){
System.out.println(area.getAreaName());
}
}
}
WebService基础学习(二)—三要素的更多相关文章
- WebService基础学习
参考 WebService基础学习(一)—基础知识:http://www.cnblogs.com/yangang2013/p/5708647.html WebService基础学习(二)—三要素:ht ...
- Python入门基础学习 二
Python入门基础学习 二 猜数字小游戏进阶版 修改建议: 猜错的时候程序可以给出提示,告诉用户猜测的数字偏大还是偏小: 没运行一次程序只能猜测一次,应该提供多次机会给用户猜测: 每次运行程序,答案 ...
- Python基础学习二
Python基础学习二 1.编码 utf-8编码:自动将英文保存为1个字符,中文3个字符.ASCll编码被囊括在内. unicode:将所有字符保存为2给字符,容纳了世界上所有的编码. 2.字符串内置 ...
- Go基础学习(二)
数组[array] 数组定义[定义后长度不可变] 12 symbol := [...]string{USD: "$", EUR: "€", GBP: " ...
- JavaScript 基础 学习(三)
JavaScript 基础 学习(三) 事件三要素 1.事件源: 绑定在谁身上的事件(和谁约定好) 2.事件类型: 绑定一个什么事件 3.事件处理函数: 当行为发生的时候,要执行哪一个函数 ...
- Web Service基础——规范及三要素
1. Java中的Web Service规范 Java 中共有三种WebService 规范,分别是JAX-WS(JAX-RPC).JAX-RS.JAXM&SAAJ(废弃). 1.1 JAX- ...
- JAVA基础学习-集合三-Map、HashMap,TreeMap与常用API
森林森 一份耕耘,一份收获 博客园 首页 新随笔 联系 管理 订阅 随笔- 397 文章- 0 评论- 78 JAVA基础学习day16--集合三-Map.HashMap,TreeMap与常用A ...
- java网络爬虫基础学习(三)
尝试直接请求URL获取资源 豆瓣电影 https://movie.douban.com/explore#!type=movie&tag=%E7%83%AD%E9%97%A8&sort= ...
- Django基础学习二
今天继续学习django的基础 学习用户提交url如何获得返回值 1.首先需要在工程的urls文件定义指定的urls要路由给哪个函数 在这个例子中,我们定义home的urls路由给views里的tes ...
随机推荐
- MySQL优化二(连接优化和缓存优化)
body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-top: 10 ...
- SqlService性能检测和优化工具
工具概要 如果你的数据库应用系统中,存在有大量表,视图,索引,触发器,函数,存储过程,sql语句等等,又性能低下,而苦逼的你又要对其优化,那么你该怎么办?哥教你,首先你要知道问题出在哪里?如果想知道问 ...
- JavaScript技巧总结和本地存储(一)
类型检测 typeof 一般用于js的基本数据类型(undefined,number,string,boolean.注意null检测的结构是object)检测,引用类型检测不准确. instanceo ...
- 【2-24】for循环嵌套,跳转语句,异常语句,穷举法、迭代法
For循环嵌套与if嵌套相似,是在for中再套for,其结构如下: For(;;) { For(;;){} }经典题型为打印星星例: Console.Write("请输入一个奇数:" ...
- 【解题报告】VijosP1448校门外的树(困难版)
原题: 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的--如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作:K=1,K=1,读入l.r ...
- (六)javascriptJS中定义对象的几种方式(转)
JavaScript学习12 JS中定义对象的几种方式 转自: http://www.cnblogs.com/mengdd/p/3697255.html JavaScript中没有类的概念,只有对象 ...
- python实现视频下载
最近一两年短视频业务风生水起,各个视频网站都有各自特色的短视频内容.如果有这样一个程序,可以把各大视频网站的热门用户最新发布的视频都下载下来,不仅方便自己观看,还可以将没有版权的视频发布在个人社交网站 ...
- 浅谈HTML5中的浮动问题
浮动是我们在前端页面中经常会用到的一种布局方式.那什么是浮动呢? 首先我们先来看一下它的定义.浮动是指让元素脱离文档标准流(脱标),按照指定的方向去横向排列.浮动的取值有两个,分别是float:lef ...
- category类别中添加属性
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #c91b13 } p.p2 { margin: 0.0px 0. ...
- webots自学笔记(三)控制器与电机控制
原创文章,来自“博客园,_阿龙clliu” http://www.cnblogs.com/clliu/,装载请注明原文章出处. 上一次建了四足机器人的模型,模型文件在上一篇有下载地址,这一次用控制器让 ...