zoukankan      html  css  js  c++  java
  • WebService入门(1)

    WebService即“基于Web的服务”,服务提供方对外发布服务,服务需求方调用服务提供方所发布的服务。WS是建立在Http协议上的,也就是说,数据是通过Http进行传输的。有了WS,异构系统之间的通讯不再是遥不可及的梦想,比如:可以在Php系统中调用Java系统对外发布的WS,获取Java系统中的数据,或者把数据推送到Java系统中。下面介绍在Java中如何发布与调用WS。(注:以下内容都是基于另外一篇博客整理的,特此声明,原文出处:https://my.oschina.net/huangyong/blog/286155)

    使用Jdk发布WebService

    第一步:写一个服务接口,在接口上放一个WebService注解,说明该接口是一个WS接口(称为”Endpoint,端点“),其中的方法是WS方法(称为”Operation,操作“)。

    package demo.ws.soap_jdk;
     
    import javax.jws.WebService;
    
    @WebService
    public interface HelloService {
     
        String say(String name);
    }

    第二步:实现这个WS接口,在实现类中完成具体业务逻辑。

    package demo.ws.soap_jdk;
     
    import javax.jws.WebService;
     
    @WebService(
        serviceName = "HelloService",
        portName = "HelloServicePort",
        endpointInterface = "demo.ws.soap_jdk.HelloService"
    )
    public class HelloServiceImpl implements HelloService {
     
        public String say(String name) {
            return "hello " + name;
        }
    }

    第三步:写一个Server类,用于发布WS,直接使用Jdk提供的工具即可实现。只需要使用Jdk提供的java.xml.ws.Endpoint 即可发布WS,只需提供一个WS的地址(address),还需要提供一个服务实例(helloService)。运行下面的main方法,会在控制台里看到”ws is published",则说明WS已成功发布了。

    package demo.ws.soap_jdk;
     
    import javax.xml.ws.Endpoint;
     
    public class Server {
     
        public static void main(String[] args) {
            String address = "http://localhost:8080/ws/soap/hello";
            HelloService helloService = new HelloServiceImpl();
     
            Endpoint.publish(address, helloService);
            System.out.println("ws is published");
        }
    }
    

    第四步:打开浏览器,在地址栏中输入下面地址:

    http://localhost:8080/ws/soap/hello?wsdl

    注意:以上地址后面有个?wsdl后缀,在Server类中的address里却没有这个后缀,此时,在浏览器中会看到如下xml文档:

    当看到这份WSDL文档时,也就意味着发布的WS服务可以被别人使用了。

    通过客户端调用WS

    第一步:使用Jdk提供的命令行工具生成WS客户端jar包

    Jdk安装目录下有个bin目录,里面存放了大量的命令行工具,只要您的Path环境变量指向了改路径,就能在cmd窗口上使用jdk提供的相关命令。其中有一个名为wsimport的命令行工具,正是用来通过wsdl生成客户端代码的,只需要输入以下命令即可:

    //通过 WSDL 地址生成 class 文件
    wsimport http://localhost:8080/ws/soap/hello?wsdl
    //通过 jar 命令将若干 class 文件压缩为一个 jar 包
    jar -cf client.jar .
    //删除生成的 class 文件(删除根目录即可)
    rmdir /s/q demo

    最终会得到一份名为client.jar的jar包,将这个jar包配置到classpath中,方便在下面的代码中使用其中的类。(技巧:可以将以上三行命令放入一个bat文件中,在Windows中双击即可运行。

    第二步:写一个Client类,用于调用WS,需要使用上一步生成的WS客户端jar包。

    package demo.ws.soap_jdk;
     
    public class Client {
     
        public static void main(String[] args) {
            HelloService_Service service = new HelloService_Service();
     
            HelloService helloService = service.getHelloServicePort();
            String result = helloService.say("world");
            System.out.println(result);
        }
    }

    上面这段代码中,HelloService_Service是jar包中的类,可以将其理解为WS的工厂类,通过它可以生成具体的WS接口,比如,调用service.getHelloServicePort()方法,就获取了一个HelloService实例,正是通过这个实例来调用其中的方法。运行Client类的main方法,就会看到控制台打印“hello world”了。

    这个一个典型的“代理模式”应用场景,实际是面向代理对象来调用WS的,并且这是一种“静态代理”,下面介绍如何使用“动态代理”方式来调用WS.

    其实Jdk已经具备了动态代理的功能,对于WS而言,Jdk同样也提供了很好的工具,如下代码所示:

    package demo.ws.soap_jdk;
     
    import java.net.URL;
    import javax.xml.namespace.QName;
    import javax.xml.ws.Service;
     
    public class DynamicClient {
     
        public static void main(String[] args) {
            try {
                URL wsdl = new URL("http://localhost:8080/ws/soap/hello?wsdl");
                QName serviceName = new QName("http://soap_jdk.ws.demo/", "HelloService");
                QName portName = new QName("http://soap_jdk.ws.demo/", "HelloServicePort");
                Service service = Service.create(wsdl, serviceName);
     
                HelloService helloService = service.getPort(portName, HelloService.class);
                String result = helloService.say("world");
                System.out.println(result);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    此时,只需在本地提供一个HelloService的接口,无需client.jar,直接面向WSDL编程。这种方式需要分别定义出serviceName与portName,最后才能调用Jdk提供的javax.xml.ws.Service类生成的service对象,它同样是一个工厂对象,通过该工厂对象获取我们需要的HelloService实例。

  • 相关阅读:
    ASP.NET MVC中防止跨站请求攻击(CSRF)
    C#操作JSON学习
    C# 产生随机密码
    博客园上好的技术系列收藏
    OWIN学习
    bzoj1068: [SCOI2007]压缩
    bzoj1012: [JSOI2008]最大数maxnumber
    bzoj1055: [HAOI2008]玩具取名
    bzoj1011: [HNOI2008]遥远的行星
    bzoj1008: [HNOI2008]越狱
  • 原文地址:https://www.cnblogs.com/yuanzhi1996/p/9265000.html
Copyright © 2011-2022 走看看