使用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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • startActivityForResult 参数限制[通俗易懂]

    startActivityForResult 参数限制[通俗易懂]publicvoidstartActivityForResult(Intentintent,intrequestCode)ParametersintentTheintenttostart.requestCodeIf>=0,thiscodewillbereturnedinonActivityResult()whentheactivity

    2022年7月11日
    15
  • 丢失的手机关机了怎么找回_maven clean报错

    丢失的手机关机了怎么找回_maven clean报错最近比较忙,忙的都没时间更新博客了.所以今天要一口气写两篇.WebPart中DropDownList丢失状态的解决方案,十分头痛.现象就是DropDownList老是为空.当时有些晕,上网搜了好久,要么没答案,要么含糊其词。当有些网友说用HiddenField保存状态给我一些启发,于是我朝HiddenField的方向去想。原理:HiddenField的是可以直接反映…

    2022年10月9日
    2
  • pad图和n-s图_N S W

    pad图和n-s图_N S W(未完成_N-S图、PAD图概念未写)1、记录StudentRecord给出即将大学毕业的学生的姓名和平均分(GPA)。我们的目的是建立一个参加毕业典礼的学生表。候选毕业的学生表从文件”StudRecs”读入。因为学校规定:GPA低于minGPA的学生不能毕业,因此那些平均分低于minGPA的学生不参加毕业典礼。另外,记录那些选择不参加毕业典礼的学生名单,将名单保存至文件”NoAttend”中,按每行一个学生姓名保存。删除这些选择不参加毕业典礼的学生,最终生成参加毕业典礼的学生表。2、画出下列程序流

    2022年8月13日
    4
  • futex验证_fulvic

    futex验证_fulvic1,验证代码转载#include#include#include#include#includesem_tsem_a;void*task1();intmain(void){ intret=0; pthread_tthrd1; sem_init(&sem_a,0,1);  //createchildrenpr

    2022年9月21日
    2
  • NPS是什么?「建议收藏」

    NPS是什么?「建议收藏」当谈到客户体验管理时,NPS就是一个绕不开的话题。今天就来聊聊NPS落地应用必须了解的8个关键点:一、NPS是什么二、NPS如何计算三、NPS得分如何评估四、NPS如何帮助企业做增长五、如何提升NPS六、NPS问卷设计七、NPS问卷发放八、NPS问卷分析一、NPS是什么NPS(NetPromoterScore),中文名为净推荐值,是客户对品牌/产品的忠诚度得分。由美国贝恩公司FredReichheld(2003)提出,是最流行的顾客忠诚度分析指标,专注于研究客户口碑如何为企业带来良

    2022年6月10日
    41
  • mysql java uuid_Java生成UUID 与 MySQL数据库如何生成uuid数据

    mysql java uuid_Java生成UUID 与 MySQL数据库如何生成uuid数据一、Java1.UUID简介UUID含义是通用唯一识别码(UniversallyUniqueIdentifier),这是一个软件建构的标准。也是被开源软件基金会(OpenSoftwareFoundation,OSF)的组织应用在分布式计算环境(DistributedComputingEnvironment,DCE)领域的一部分。UUID的目的,是让分布式系统中的所有…

    2022年9月22日
    3

发表回复

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

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