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

标签: 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
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.在浏览器中搜索发布的地址
这里写图片描述
6.wsdl文档
这里写图片描述

生成代码方式调用服务 :
第一种:
jdk文件中bin文件里面有一个wsimport.exe应用程序,是用来给客户端生成调用代码的
1.新建webprogect,作为客户端
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服务

原文链接:加载失败,请重新获取