java原生实现webservice

来源:互联网 发布:c语言中stdlib 编辑:程序博客网 时间:2024/06/05 13:23

1、webservice概述

     WebService是基于xml做消息传输的web应用程序。他支持跨平台,跨语言。既可以用.net实现也可以用java实现。

     WSDL:webservice描述语言,使用xml描述对象的函数,参数,返回值,即是机器可以阅读,也是人可以阅读的。

     SOAP:简单对象访问协议,webservice就是利用soap,在应用程序之间实现通信。

2、java原生实现代码

这里会建立四个java文件,分别是BaseService.java,BusinessService.java,WSServer.java,WSClient.java,前面两个文件用来建立webservice的接口,后面两个用来测试。

BaseService.java

package com.xxx.webservice;import javax.jws.WebService;@WebServicepublic interface BaseService {       public int add(int a,int b);       public String sayHello(String name);}

BusinessService.java

package com.xxx.webservice;import javax.jws.WebService;@WebService(endpointInterface="com.xxx.webservice.BaseService")public class BusinessService implements BaseService {    @Override    public int add(int a, int b) {return a + b ;    }    @Override    public String sayHello(String name) {return "hello, " + name;    }}

WSServer.java

package com.xxx.webservice;import javax.xml.ws.Endpoint;public class WSServer {    public static void main(String[] args) {Endpoint.publish("http://localhost:8080/ns", new BusinessService());System.out.println("webservice publish success.");    }}

WSClient.java

package com.xxx.webservice;import java.net.MalformedURLException;import java.net.URL;import javax.xml.namespace.QName;import javax.xml.ws.Service;public class WSClient {    public static void main(String[] args) {  try {    URL url = new URL("http://localhost:8080/ns?wsdl");    QName qName = new QName("http://webservice.xxx.com/","BusinessServiceService");    Service service = Service.create(url,qName);    BaseService baseService = service.getPort(BaseService.class);    System.out.println(baseService.add(5, 8));    System.out.println(baseService.sayHello("xxx"));} catch (MalformedURLException e) {    e.printStackTrace();}    }}

3、测试结果及说明

线运行WSServer.java,再运行WSClient.java,结果会先启动webservice,并监听。

等待客户端连接,客户端连接并调用对应的方法,然后返回结果,客户端打印结果。

这里有几个需要注意的问题,第一个是QName qName = new QName("http://webservice.xxx.com","BusinessServiceService");,一个是namespaceURI这个正好是和包名反着的,再一个就是localPart这个参数,默认就是类名+Service,这个可以在启动server端之后,在它发布的服务中可以看到,确实如此命名。

在service.getPort(interface.class)函数中,必须要传入接口,而不能使用实现类。否则会报XXX不是一个interface,如下图: