JAVA 中共有三种WebService 规范,分别是JAX-WS、JAX-RS、JAXM&SAAJ(废弃)。html
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版本。java
采用标准SOAP(Simple Object Access Protocol) 协议传输,soap属于w3c标准。Soap协议是基于http的应用层协议,soap协议传输是xml数据。mysql
采用wsdl做为描述语言即webservice使用说明书,wsdl属w3c标准。web
xml是webservice的跨平台的基础,XML主要的优势在于它既与平台无关,又与厂商无关。sql
XSD,W3C为webservice制定了一套传输数据类型,使用xml进行描述,即XSD(XML Schema Datatypes),任何编程语言写的webservice接口在发送数据时都要转换成webservice标准的XSD发送。数据库
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参考实现。app
RESTEasy——JBoss的JAX-RS项目。
Restlet——也许是最先的REST框架了,它JAX-RS以前就有了。
注:REST 是一种软件架构模式,只是一种风格,rest服务采用HTTP 作传输协议。
SOAP: 基于HTTP协议,采用XML格式,用来传递信息的格式。
WSDL: 用来描述如何访问具体的服务。
UDDI: 用户本身能够按UDDI标准搭建UDDI服务器,用来管理,分发,查询WebService 。其余用户能够本身注册发布WebService调用。
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>
WSDL(Web Service Description Language),是一个用来描述Web服务(Web Service)和说明如何与Web服务通讯的XML语言。由于是基于XML的,因此WSDL既是机器可阅读的,又是人可阅读的,这将是一个很大的好处。
(1)wsdl的阅读方法
是从下往上读。
每一个wsdl有且只有一个Service节点。
一、先找Service节点
二、Service节点中找port节点。每一个port对应一个PortType。
三、Port节点对应一binding节点。每一个binding节点对应一个PortType
四、PortType中有operation 节点就是服务的方法。
五、operation 中有Input(参数)和output(返回值)
六、Input(参数)和output(返回值)对应message节点
七、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注解以后,会影响客户端生成的代码。调用的方法名和参数名也发生了变化。
UDDI 是一种目录服务,经过它,企业可注册并搜索 Web services。企业将本身提供的Web Service注册在UDDI,也可使用别的企业在UDDI注册的web service服务,从而达到资源共享。
UDDI旨在将全球的webservcie资源进行共享,促进全球经济合做。
可是使用webservice并非必须使用UDDI,由于用户经过WSDL知道了web service的地址,能够直接经过WSDL调用webservice。
建立区域查询服务系统,对外发布WebService服务,供客户端调用,根据parentid查询区域信息,返回区域信息列表,并支持分页。
第一步:建立一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()); } }
第一步:建立一个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()); } } }