【WebService】使用jdk发布webservice及调用

webservice开发---------如何使用jdk发布webservice及调用

第一次见到webservice时,懵,懵,懵,它是什么?主要功能是什么?怎么用?围绕着这些开始webservice学习之旅

一:简介

webService是一种跨编程语言和跨操作系统平台的远程调用技术;
采用HTTP协议传输数据,采用XML格式封装数据(即XML中说明调用远程服务对象的哪个方法,传递的参数是什么,以及服务对象的返回结果是什么)。
比如,我们的应用上需要用到天气信息,我们可以调用互联网上查询天气的web服务,这样用户就可以在我们的网站上看到天气信息, 我们也可以把自己写好的代码发布,这样别人也可以调用;
webservice分为服务端(发布服务)和客户端(调用服务)两部分

二:Jdk发布和调用webservice

这篇文章用Jdk发布一个WebService服务及调用,下一篇介绍如何使用框架cxf发布webservice
发布须知:
@WebService注解(注:此注解是jdk1.6提供的,位于javax.jws.WebService包中)-

  • 将java类标记为实现Web Service,将 Java 接口标记为定义 Web Service 接口。
  • 给类添加@WebService注解后,所有非静态方法都会被发布;
  • 方法上加@WebMethod(exclude=true)后,此方法不被发布;
  • 如果一个类上,被添加了@WebService注解,则必须此类至少有一个可以公开的方法,否则将会启动失败;

通过EndPoint(端点服务类)发布一个WebService

  • EndPoint是jdk提供的一个专门用于发布服务的类,位于 javax.xml.ws.Endpoint包中
  • 该类的publish方法接收两个参数,一个是本地的服务地址,二是提供服务的类。

WSDL(web service definition language)

  • WSDL是webservice定义语言, 对应.wsdl文档, 一个webservice会对应一个唯一的wsdl文档,
    定义了客户端与服务端发送请求和响应的数据格式和过程

发布服务:

1.创建webProject(可以是纯java工程)
2.创建类,加上@WebService注解
3.在类中定义你要发布的方法

@WebService
public class SayWeb {

    public  String sayHello(String name){
        return "hello"+name;
    }

    public void sayBye(){
        System.out.println("bye");
    }

    /**
     * 添加@WebMethod(exclude=true)注解
     */
    @WebMethod(exclude=true)
    public int sayInt(int i){
        return ++i;
    }   

    /**
     * 静态方法
     */
    public static void sayGood(){
        System.out.println("Good");
    }

    /**
     * main方法中发布
     */
    public static void main(String[] args) {
        String address = "http://localhost:9001/service/sayweb";
        Endpoint.publish(address, new SayWeb());
        System.out.println("发布成功");     
    }
}

4.发布webservice
这里写图片描述

5.在浏览器中搜索发布的地址(发布的地址无法访问,可以访问的是发布地址+?wsdl
这里写图片描述
6.wsdl文档
这里写图片描述

生成代码方式调用服务

第一种:

jdk文件中bin文件里面有一个wsimport.exe应用程序,是用来给客户端生成调用代码的

1.新建webprogect(也可以是纯java工程),作为客户端
2.打开cmd命令 输入

wsimport -s E:\workspace\client\src -p com.client -keep http://localhost:9001/service/sayweb?wsdl
-keep:表示生成客户端代码,url为wsdl文档的地址
-p:表示生成的代码所放的包名
-s:表示生成源码(直接调用),src目录

出现以下代码,表示生成代码成功,

parsing WSDL…
Generating code…
Compiling code…

3.刷新项目,看到在指定包下生成调用源码
这里写图片描述

4.编写测试方法,调用代码

public static void main(String[] args) {
    //获取工厂 wsdl文档:<service name="SayWebService">        
    SayWebService swb = new SayWebService();

    //获取服务端口上的对象  wsdl文档:<port name="SayWebPort" binding="tns:SayWebPortBinding">
    SayWeb sw = swb.getSayWebPort();

    sw.sayBye();        
    System.out.println(sw.sayHello("nihao"));
}

第二种:

1.单击项目右键—->new—–>web service client
这里写图片描述

2.输入wsdl文档地址—>finish
这里写图片描述

3.自动生成java代码,主要使用的是***Locator和****Stub
这里写图片描述

4.测试

public static void main(String[] args) {
    try {
        SayWebServiceLocator swst = new SayWebServiceLocator(); 
        java.net.URL url = new java.net.URL("http://localhost:9001/service/sayweb?wsdl");
        SayWebPortBindingStub stub = new SayWebPortBindingStub(url,swst);
        stub.sayBye();          
        System.out.println(stub.sayHello("nihao"));
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

测试结果

服务端:
这里写图片描述
客户端
这里写图片描述

总结:

1.发布服务端除了在main方法中,还可以在servlet容器初始化时,还可以放在监听器中等
2.使用wsimport命令的方式调用webservice,在实际项目中,并不推荐,因为要生成很多java代码文件,如果服务端更改,需要重新生成代码文件,不过使用jdk去发布webservice简单易于操作,只为更好的理解web服务的调用。在后面文章中着重介绍cxf框架以及如何调用如天气等免费的web服务

参考文章

https://blog.csdn.net/cherry_11qianqian/article/details/81531675

猜你喜欢

转载自blog.csdn.net/xiaoxiao_su123/article/details/110872112