这是我参与8月更文挑战的第25天,活动详情查看:8月更文挑战
概念
WebService是为跨平台访问提供的一种通信机制。平台可以理解为不同的业务系统(不是操作系统)。
既然带上Web字眼难么就是走http协议。
示意图:
WebService特点:
1)自包含的。意思是客户端不需要包含任何附加的软件,只要客户端支持Http和XML。
2)自我描述的。客户端和服务端除了消息的格式和内容外不需要知道任务其他数据。
3)夸平台和夸语言。无论是java,c++都可以通过通信。
4)是基于开发和标准的。xml和http是WebService的主要技术,而xml和http早就成为行业内的标准。
5)可以组合的。可以通过各种WebService服务组合成负责的系统。
6)松散耦合的。像一些分布式中间件DCOM等,客户端和服务端是紧耦合的,当服务端挂后,客户端会崩溃。
7)提供编程访问的能力。这个好理解,只要是接口一定是提供了编程访问能力。
8)通过网络进行发布,查找和使用。
WebService的发布方式
1)JWS发布
2)Axis2发布
3)CXF发布
4)ksoap2-andriod发布。
相关的术语
1)XML:扩展型标记语言
2)SOAP:简单对象访问协议,是一个xml调用规范,它支持http,https,smtp通信协议。
3)WSDL:web描述性语言。wsdl文件是一个xml文档。用于说明一组SOAP消息以及如何交换这些消息。
4)UDDI:通用描述、发现与集成服务。
比喻:WebService就像一个服务提供商,SOAP就像双方签的合同,约束双方按规律和标准来办事。WSDL就像一个说明书,你能给别人提供说明服务。UUDI就像是公司在工商局注册,说明公司经营什么内容,方便别人查询。
WebService分为两种
- 基于HTTP协议,REST方式的WebService。
- 基于SOAP协议(HTTP协议之上),RPC方式的WebService。 通常所说的WebService是指RPC方式的WebService。
Java三种WebService规范: JAX-WS(JAX-RPC)、JAX-RS、JAXM&SAAJ。
- JAX-WS(Java API For XML-WebService),JDK1.6 自带的版本为JAX-WS2.1,其底层支持为JAXB。早期的JAVA Web服务规范JAX-RPC(Java API ForXML-Remote Procedure Call)目前已经被JAX-WS 规范取代,JAX-WS 是JAX-RPC 的演进版本,但JAX-WS 并不完全向后兼容JAX-RPC。
- JAX-RS 是Java针对 REST(Representation State Transfer)风格制定的一套 Web 服务规范,由于推出的较晚,该规范(JSR 311,目前JAX-RS的版本为 1.0)并未随JDK1.6 一起发行,你需要到JCP 上单独下载JAX-RS 规范的接口,其API位于 javax.ws.rs.*包。
- JAXM(Java API For XML Message)主要定义了包含了发送和接收消息所需的 API,相当于 Web 服务的服务器端,其 API位于 javax.messaging.*包,它是JAVA EE 的可选包,因此你需要单独下载。
- SAAJ(SOAP With Attachment API For Java,JSR 67)是与JAXM搭配使用的API,为构建SOAP 包和解析SOAP 包提供了重要的支持,支持附件传输,它在服务器端、客户端都需要使用。这里还要提到的是SAAJ规范,其API位于 javax.xml.soap.*包。 JAXM&SAAJ与JAX-WS都是基于SOAP的Web服务,相比之下JAXM&SAAJ暴漏了SOAP更多的底层细节,编码比较麻烦,而 JAX-WS 更加抽象,隐藏了更多的细节,更加面向对象,实现起来你基本上不需要关心 SOAP 的任何细节。
使用JDK开发WebService
1、开发WebService服务器端
1、定义一个interface,使用@WebService注解标注接口,使用@WebMethod注解标注接口中定义的所有方法,如下所示:
package Your Internet Address For Life™;
import javax.jws.WebMethod;
import javax.jws.WebService;
/**
* @author gacl
* 定义SEI(WebService EndPoint Interface(终端))
*/
//使用@WebService注解标注WebServiceI接口
@WebService
public interface WebServiceI {
//使用@WebMethod注解标注WebServiceI接口中的方法
@WebMethod
String sayHello(String name);
@WebMethod
String save(String name,String pwd);
}
2、编写interface的实现类,使用 @WebService注解标注实现类,实现接口中定义的所有方法,如下所示:
package me.gacl.ws;
import javax.jws.WebService;
/**
* @author gacl
* SEI的具体实现
*/
//使用@WebService注解标注WebServiceI接口的实现类WebServiceImpl
@WebService
public class WebServiceImpl implements WebServiceI {
@Override
public String sayHello(String name) {
System.out.println("WebService sayHello "+name);
return "sayHello "+name;
}
@Override
public String save(String name, String pwd) {
System.out.println("WebService save "+name+", "+pwd);
return "save Success";
}
}
3、使用Endpoint(终端)类发布webservice,代码如下:
package me.gacl.ws.test;
import javax.xml.ws.Endpoint;
import me.gacl.ws.WebServiceImpl;
/**
* @author gacl
*
* 发布Web Service
*/
public class WebServicePublish {
public static void main(String[] args) {
//定义WebService的发布地址,这个地址就是提供给外界访问Webervice的URL地址,URL地址格式为:http://ip:端口号/xxxx
//String address = "http://192.168.1.100:8989/";这个WebService发布地址的写法是合法的
//String address = "http://192.168.1.100:8989/Webservice";这个WebService发布地址的是合法的
String address = "http://192.168.1.100:8989/WS_Server/Webservice";
//使用Endpoint类提供的publish方法发布WebService,发布时要保证使用的端口号没有被其他应用程序占用
Endpoint.publish(address , new WebServiceImpl());
System.out.println("发布webservice成功!");
}
}
使用Servlet发布WebService
package me.gacl.web.controller;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.xml.ws.Endpoint;
import me.gacl.ws.WebServiceImpl;
/**
* @author gacl
* 用于发布WebService的Servlet
*/
//使用Servlet3.0提供的@WebServlet注解将继承HttpServlet类的普通Java类标注为一个Servlet
//将value属性设置为空字符串,这样WebServicePublishServlet就不提供对外访问的路径
//loadOnStartup属性设置WebServicePublishServlet的初始化时机
@WebServlet(value="",loadOnStartup=0)
public class WebServicePublishServlet extends HttpServlet {
/* (non-Javadoc)
* @see javax.servlet.GenericServlet#init()
* 在WebServicePublishServlet初始化时发布WebService
*/
public void init() throws ServletException {
//WebService的发布地址
String address = "http://192.168.1.100:8888/WebService";
//发布WebService,WebServiceImpl类是WebServie接口的具体实现类
Endpoint.publish(address , new WebServiceImpl());
System.out.println("使用WebServicePublishServlet发布webservice成功!");
}
}
关于发布WebService主要就是通过javax.xml.ws.Endpoint类提供的静态方法publish进行发布,如果是普通的java项目,那么可以专门写一个类用于发布WebService,如果是Web项目,那么可以使用ServletContextListener或者Servlet进行发布。