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实例。

原文地址:https://www.cnblogs.com/yuanzhi1996/p/9265000.html