使用JAX-WS构建Web Services

使用JAX-WS构建Web Services 使用JAX-WS构建WebServicesJAX-WS简写为JavaApiForXmlWebService。JAX-WS是使用XML构建WebService与Client进行交流通信的技术。在JAX-WS中,WebService操作调用表现为以XML为基础的协议如SOAP协议。SOAP定义了封装架构,编码规则以及WebService中调用和回应表现的规则。这些调用和

大家好,又见面了,我是你们的朋友全栈君。 

使用JAX-WS构建Web Services
JAX-WS简写为 Java Api For Xml Web Service。JAX-WS是使用XML构建Web Service与Client进行交流通信的技术。
在 JAX-WS中,Web Service操作调用表现为以XML为基础的协议如SOAP协议。SOAP定义了封装架构,编码规则以及Web Service中调用和回应表现的规则。这些调用和回应在HTTP基础上以SOAP规范的消息进行传递。
尽管 SOAP协议是很复杂的,但是JAX-WS隐藏了开发人员面对的复杂性。在服务器端,开发者可以通过在使用java语言接口中定义方法来制定Web Service。开发者可以编写一个或者多个类来实现这些方法。客户端程序也很容易编写。客户端会创建一个代理(表现服务器端的本地对象)并且简单的调用代理中的方法即可。在JAX-WS中,开发者不必去创建和解析SOAP消息。JAX-WS运行系统会自动完成调用和回应之间SAOP消息的转换。
使用 JAX-WS,客户端和服务器端都有一个很大的优势:java编程语言的平台独立性。此外,JAX-WS并不限制:JAX-WS客户端程序可以访问不运行在java平台上的Web Servicce。这种灵活性是由于Web Service采用了W3C定义的技术规范:Http,SOAP,WSDL。
 
如何创建一个Web Service和Client并将他们部署。
开发一个 JAX-WS Web Service首先是要定义一个类标示了javax.jws.WebService注释。@WebService注释定义了一个Web Service终端。
Service终端接口或者 Service终端实现(SEI)是一个java接口和类,其中定义了客户端可以调用的方法。建立一个JAX-WS终端时接口并不是必须的。Web Service实现类定义了SEI。
你也可以通过向实现类的 WebService注释中添加endpointInterface 元素来指定外部接口。之后你必须定义一个接口并且将其中需要实现的方法声明为public。
创建Web Service和Client的步骤
1.
   编写实现类
2.
   编译实现类
3.
   添加部署 Web Service必须的文件
4.
   打包成 WAR
5.
   部署 WAR文件
6.
   编写 Client类
7.
   产生和编译连接到 Service需要的文件
8.
   编译 Client类
9.
   运行 Client
JAX-WS
终端要求
² 实现类必须注释为 javax.jws.WebService或者javax.jws.WebServiceProvider。
² 实现类可以参考通过 WebService注释中的endpointInterface元素。但是这不是必须的。如果WebService注释中没有endpointInterface元素的话,SEI会默认的为实现类定义一个。
² 实现类的方法必须是 public,不能使final或者static。
² 被暴露给 Web Service Client的方法必须被注释为javax.jws.WebMethod。
² 实现类不能使 final和abstract。
² 实现类必须有一个默认的构造函数。
² 实现类不能定义 finalize方法。
² 实现类必须在他生命周期回调函数中必须用 javax.annotation.PostConstruct或者javax.annotation.PreDestroy注释。
PostConstruct方法由容器在实现类开始向 Web Service Client做出反应之前调用。
PreDestroy方法由容器在终端移出操作之前调用。
编写Service终端实现类
在这个例子中,实现类 Hello通过@WebService注释被定义为Service终端。Hello中有一个sayHello方法,被注释为@WebMethod。@WebMethod注释向Web Service Client暴露了被注释的方法。sayHello方法向客户段返回一通过参数name进行组装的问候字符串。这个实现类必须有一个默认的声明为public,无参数的构造函数。
package helloservice.endpoint;
import javax.jws.WebService;
@WebService
public class Hello {
private String message = new String(“Hello, “);
public void Hello() {}
@WebMethod
public String sayHello(String name) {
return message + name + “.”;
}
}
简单的JAX-WS客户端
HelloClient是一个可以访问 Hello对象的sayHello方法的独立的客户端程序。这个调用是通过一个本地对象port实现的,当然这个本地对象port是远程Service对象的一个代理。
编写客户端程序
1.
   使用 javax.xml.ws.WebServiceRef注释可以声明一个Web Service的参考。@WebServiceRef注释使用wsdlLocation元素指定一个已经部署的Service的wsdl的URI
@WebServiceRef(wsdlLocation=”http://localhost:8080/helloservice/hello?wsdl”)
2.
   找回 Service的代理,看作一个port,这是通过调用Service的一个函数getHelloPort实现的
Hello port = service.getHelloPort();
Port实现了被 service定义的SEI
3.
   调用 port的sayHello方法,并传入一个参数name。
String response = port.sayHello(name);
类的实现如下
package simpleclient;
 
import javax.xml.ws.WebServiceRef;
import helloservice.endpoint.HelloService;
import helloservice.endpoint.Hello;
 
 
public class HelloClient {
    @WebServiceRef(wsdlLocation = “http://localhost:8080/helloservice/hello?wsdl”)
    static HelloService service;
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
            HelloClient client = new HelloClient();
            client.doTest(args);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
 
    public void doTest(String[] args) {
        try { // Call Web Service Operation
            System.out.println(
                    “Retrieving the port from the following service: ”
                    + service);
 
            Hello port = service.getHelloPort();
 
            System.out.println(“Invoking the sayHello operation on the port.”);
 
            String name;
 
            if (args.length > 0) {
                name = args[0];
            } else {
                name = “No Name”;
            }
 
            String response = port.sayHello(name);
            System.out.println(response);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}
本文参考 Javaee5官方文档,源码在NetBeans6.0中使用,具体可以在sun官方网站下载,或者和我联系
david_qiu_hbu@126.com

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/159707.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 一文读懂BERT(原理篇)

    一文读懂BERT(原理篇)一文读懂BERT(从原理到实践)2018年的10月11日,Google发布的论文《Pre-trainingofDeepBidirectionalTransformersforLanguageUnderstanding》,成功在11项NLP任务中取得stateoftheart的结果,赢得自然语言处理学界的一片赞誉之声。本文是对近期关于BERT论文、相关文章、代码进…

    2022年5月25日
    34
  • DataX使用指南

    DataX使用指南简介DataX是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括MySQL、Oracle、HDFS、Hive、OceanBase、HBase、OTS、ODPS等各种异构数据源之间高效的数据同步功能。DataX采用了框架+插件的模式,目前已开源,代码托管在github。DataX安装部署及小试1.下载压缩包:下载页面地址:https://github.com/a…

    2022年5月16日
    48
  • sql语句 模糊查找like

    sql语句 模糊查找like模糊查找:like语法形式:字段like’要查找字符’说明:1、like模糊查找用于对字符类型的字段进行字符匹配查找。2、要查找的字符中,有两个特殊含义的字符:%,_:2.1:%含义是:代表0或多个的任意字符2.2:_含义是:代表1个任意字符2.3:这里的字符都是指现实中可见的一个“符号”,而不是字节。3、语法:like’%关键字%’SELECT*FROMstudentWHERENAMELIKE’张%’;–…

    2022年6月5日
    37
  • SpringBoot异步调用

    SpringBoot异步调用除了异步请求,一般上我们用的比较多的应该是异步调用。通常在开发过程中,会遇到一个方法是和实际业务无关的,没有紧密性的。比如记录日志信息等业务。这个时候正常就是启一个新线程去做一些业务处理,让主线程异步的执行其他业务。何为异步调用说异步调用前,我们说说它对应的同步调用。通常开发过程中,一般上我们都是同步调用,即:程序按定义的顺序依次执行的过程,每一行代码执行过程必须等待上一行代码执行完毕后才…

    2022年7月11日
    19
  • matplotlib-bilibili,抖音很火的动态数据视频自动生成(第二节)

    matplotlib-bilibili,抖音很火的动态数据视频自动生成(第二节)

    2022年2月20日
    59
  • 与运算(&)、或运算(|)、异或运算(^)、进制转换

    与运算(&)、或运算(|)、异或运算(^)、进制转换参加运算的两个对象,按二进制位进行运算。进制转换地址:http://tool.oschina.net/hexconvert/一:与运算符(&)预算规则:0&0=0;0&1=0;1&0=0;1&1=1即:两个同时为1,结果为1,否则为0例如:3&5十进制3转为二进制的3:00000011十进制5转为二进制的5:0000…

    2022年5月29日
    36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号