Java WebService

1,312 阅读5分钟

这是我参与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分为两种 

  1. 基于HTTP协议,REST方式的WebService。 
  2. 基于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进行发布。