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

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

一:简介

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

二: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文档
这里写图片描述svg

生成代码方式调用服务 :
第一种:
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服务