• 一、利用jdk web服务api实现,这里使用基于 SOAP message 的 Web 服务
  • 1.首先建立一个Web services EndPoint:
  • package Hello;
  • import javax.jws.WebService;
  • import javax.jws.WebMethod;
  • import javax.xml.ws.Endpoint;
  • @WebService
  • public class Hello {
  • @WebMethod
  • public String hello(String name) {
  • return "Hello, " + name + "\n";
  • }
  • public static void main(String[] args) {
  • // create and publish an endpoint
  • Hello hello = new Hello();
  • Endpoint endpoint = Endpoint.publish("http://localhost:8080/hello", hello);
  • }
  • }
  • 2.使用 apt 编译 Hello.java(例:apt -d [存放编译后的文件目录] Hello.java ) ,会生成 jaws目录
  • 3.使用java Hello.Hello运行,然后将浏览器指向http://localhost:8080/hello?wsdl就会出现下列显示
  • 4.使用wsimport 生成客户端
  • 使用如下:wsimport -p . -keep http://localhost:8080/hello?wsdl
  • 这时,会在当前目录中生成如下文件:
  • 5.客户端程序:
  • 1class HelloClient{
  • 2public static void main(String args[]) {
  • 3  HelloService service = new HelloService();
  • 4  Hello helloProxy = service.getHelloPort();
  • 5  String hello = helloProxy.hello("你好");
  • 6  System.out.println(hello);
  • 7  }
  • 8}
  • 9
  • 以上方法还稍显繁琐,还有更加简单的方法
  • 二、使用xfire,我这里使用的是myeclipse集成的xfire进行测试的
  • 利用xfire开发WebService,可以有三种方法:
  • 1一种是从javabean 中生成;
  • 2 一种是从wsdl文件中生成;
  • 3 还有一种是自己建立webservice
  • 步骤如下:
  • 用myeclipse建立webservice工程,目录结构如下:
  • 首先建立webservice接口,
  • 代码如下:
  • 1package com.myeclipse.wsExample;
  • 2//Generated by MyEclipse
  • 3
  • 4public interface IHelloWorldService {
  • 5
  • 6    public String example(String message);
  • 7
  • 8}
  • 接着实现这个借口:
  • 1package com.myeclipse.wsExample;
  • 2//Generated by MyEclipse
  • 3
  • 4public class HelloWorldServiceImpl implements IHelloWorldService {
  • 5
  • 6    public String example(String message) {
  • 7        return message;
  • 8    }
  • 9
  • 10}
  • 修改service.xml 文件,加入以下代码:
  • 1<service>
  • 2        <name>HelloWorldService</name>
  • 3        <serviceClass>
  • 4            com.myeclipse.wsExample.IHelloWorldService
  • 5        </serviceClass>
  • 6        <implementationClass>
  • 7            com.myeclipse.wsExample.HelloWorldServiceImpl
  • 8        </implementationClass>
  • 9        <style>wrapped</style>
  • 10        <use>literal</use>
  • 11        <scope>application</scope>
  • 12    </service>
  • 把整个项目部署到tomcat服务器中 ,打开浏览器,输入http://localhost:8989/HelloWorld/services/HelloWorldService?wsdl,可以看到如下:
  • 然后再展开HelloWorldService后面的wsdl可以看到:
  • 客户端实现如下:
  • 1package com.myeclipse.wsExample.client;
  • 2
  • 3import java.net.MalformedURLException;
  • 4import java.net.URL;
  • 5
  • 6import org.codehaus.xfire.XFireFactory;
  • 7import org.codehaus.xfire.client.Client;
  • 8import org.codehaus.xfire.client.XFireProxyFactory;
  • 9import org.codehaus.xfire.service.Service;
  • 10import org.codehaus.xfire.service.binding.ObjectServiceFactory;
  • 11
  • 12import com.myeclipse.wsExample.IHelloWorldService;
  • 13
  • 14public class HelloWorldClient {
  • 15public static void main(String[] args) throws MalformedURLException, Exception {
  • 16// TODO Auto-generated method stub
  • 17Service s=new ObjectServiceFactory().create(IHelloWorldService.class);
  • 18XFireProxyFactory xf=new XFireProxyFactory(XFireFactory.newInstance().getXFire());
  • 19String url="http://localhost:8989/HelloWorld/services/HelloWorldService";
  • 20
  • 21        try
  • 22        {
  • 23
  • 24            IHelloWorldService hs=(IHelloWorldService) xf.create(s,url);
  • 25            String st=hs.example("zhangjin");
  • 26            System.out.print(st);
  • 27        }
  • 28        catch(Exception e)
  • 29        {
  • 30            e.printStackTrace();
  • 31        }
  • 32    }
  • 33
  • 34}
  • 35
  • 这里再说点题外话,有时候我们知道一个wsdl地址,比如想用java客户端引用.net 做得webservice,使用myeclipse引用,但是却出现无法通过验证的错误,这时我们可以直接在类中引用,步骤如下:
  • 1public static void main(String[] args) throws MalformedURLException, Exception {
  • 2        // TODO Auto-generated method stub
  • 3        Service s=new ObjectServiceFactory().create(IHelloWorldService.class);
  • 4        XFireProxyFactory xf=new XFireProxyFactory(XFireFactory.newInstance().getXFire());
  • 5
  • 6
  • 7//远程调用.net开发的webservice
  • 8Client c=new Client(new URL("http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl"));
  • 9        Object[] o=c.invoke("qqCheckOnline", new String[]{"531086641","591284436"});
  • 10
  • 11//调用.net本机开发的webservice
  • 12Client c1=new Client(new URL("http://localhost/zj/Service.asmx?wsdl"));
  • 13Object[] o1=c1.invoke("HelloWorld",new String[]{});
  • 14
  • 15}
  • 三、使用axis1.4调用webservice方法
  • 前提条件:下载axis1.4包和tomcat服务器   ,并将axis文件夹复制到tomcat服务器的webapp文件夹中
  • 这里我就说一下最简单的方法:
  • 首先建立一个任意的java类(例如:HelloWorld.java),复制到axis文件夹下,将其扩展名改为jws,然后重新启动tomcat,在浏览器中输入http://localhost:8989/axis/HelloWorld.jws?wsdl,就会得到一个wsdl文件,其客户端调用方法如下:
  • 1import javax.xml.rpc.Service;
  • 2import javax.xml.rpc.ServiceException;
  • 3import javax.xml.rpc.ServiceFactory;
  • 4
  • 5import java.net.MalformedURLException;
  • 6import java.net.URL;
  • 7import java.rmi.RemoteException;
  • 8
  • 9import javax.xml.namespace.QName;
  • 10
  • 11public class TestHelloWorld {
  • 12
  • 13
  • 14    public static void main(String[] args) throws MalformedURLException, ServiceException, RemoteException {
  • 15        // TODO Auto-generated method stub
  • 16
  • 17        String wsdlUrl ="http://localhost:8989/axis/HelloWorld.jws?wsdl";
  • 18        String nameSpaceUri ="http://localhost:8989/axis/HelloWorld.jws";
  • 19        String serviceName = "HelloWorldService";
  • 20        String portName = "HelloWorld";
  • 21
  • 22        ServiceFactory serviceFactory = ServiceFactory.newInstance();
  • 23        Service afService =serviceFactory.createService(new URL(wsdlUrl),new QName(nameSpaceUri, serviceName));
  • 24        HelloWorldInterface proxy = (HelloWorldInterface)afService.getPort(new QName(nameSpaceUri, portName),HelloWorldInterface.class);
  • 25        System.out.println("return value is "+proxy.getName("john") ) ;
  • 26
  • 27    }
  • 28
  • 29}
  • 30
  • 四、使用axis2开发webservice(这里首先感谢李宁老师)
  • 使用axis2 需要先下载
  • axis2-1.4.1-bin.zip
  • axis2-1.4.1-war.zip
  • http://ws.apache.org/axis2/
  • 同理,也需要将axis2复制到webapp目录中
  • 在axis2中部署webservice有两种方法,
  • 第一种是pojo方式,这种方式比较简单,但是有一些限制,例如部署的类不能加上包名
  • 第二种方式是利用xml发布webservice,这种方法比较灵活,不需要限制类的声明
  • 下面分别说明使用方法:
  • 1.pojo方式:在Axis2中不需要进行任何的配置,就可以直接将一个简单的POJO发布成WebService。其中POJO中所有的public方法将被发布成WebService方法。先实现一个pojo类:
  • 1public class HelloWorld{
  • 2    public String getName(String name)
  • 3    {
  • 4        return "你好 " + name;
  • 5    }
  • 6    public int add(int a,int b)
  • 7    {
  • 8        return a+b;
  • 9    }
  • 10}
  • 11
  • 由于这两个方法都是public类型,所以都会发布成webservice。编译HelloWorld类后,将HelloWorld.class文件放到%tomcat%\webapps\axis2\WEB-INF\pojo目录中(如果没有pojo目录,则建立该目录),然后打开浏览器进行测试:
  • 输入一下url:
  • http://localhost:8080/axis2/services/listServices
  • 会列出所有webservice
  • 这是其中的两个webservice列表,接着,在客户端进行测试:
  • 首先可以写一个封装类,减少编码,代码如下:
  • 1package MZ.GetWebService;
  • 2import javax.xml.namespace.QName;
  • 3
  • 4import org.apache.axis2.AxisFault;
  • 5import org.apache.axis2.addressing.EndpointReference;
  • 6import org.apache.axis2.client.Options;
  • 7import org.apache.axis2.rpc.client.RPCServiceClient;
  • 8
  • 9
  • 10public class GetWSByAxis2 {
  • 11      private static String EndPointUrl;
  • 12      private static String QUrl="http://ws.apache.org/axis2";
  • 13      private QName opAddEntry;
  • 14      public String WSUrl;
  • 15      public RPCServiceClient setOption() throws AxisFault
  • 16      {
  • 17          RPCServiceClient serviceClient = new RPCServiceClient();
  • 18          Options options = serviceClient.getOptions();
  • 19          EndpointReference targetEPR = new EndpointReference(WSUrl);
  • 20          options.setTo(targetEPR);
  • 21          return serviceClient;
  • 22      }
  • 23
  • 24      public QName getQname(String Option){
  • 25
  • 26          return new QName (QUrl,Option);
  • 27      }
  • 28 //返回String
  • 29      public String getStr(String Option) throws AxisFault
  • 30      {
  • 31          RPCServiceClient serviceClient =this.setOption();
  • 32
  • 33          opAddEntry =this.getQname(Option);
  • 34
  • 35         String str = (String) serviceClient.invokeBlocking(opAddEntry,
  • 36                          new Object[]{}, new Class[]{String.class })[0];
  • 37         return str;
  • 38     }
  • 39// 返回一维String数组
  • 40      public String[] getArray(String Option) throws AxisFault
  • 41      {
  • 42          RPCServiceClient serviceClient =this.setOption();
  • 43
  • 44          opAddEntry =this.getQname(Option);
  • 45
  • 46         String[] strArray = (String[]) serviceClient.invokeBlocking(opAddEntry,
  • 47                          new Object[]{}, new Class[]{String[].class })[0];
  • 48         return strArray;
  • 49     }
  • 50      //从WebService中返回一个对象的实例
  • 51     public Object getObject(String Option,Object o) throws AxisFault
  • 52     {
  • 53        RPCServiceClient serviceClient =this.setOption();
  • 54         QName qname=this.getQname(Option);
  • 55         Object object = serviceClient.invokeBlocking(qname, new Object[]{},new Class[]{o.getClass()})[0];
  • 56         return object;
  • 57     }
  • 58
  • 59/////////////////////////////////////////       读者可以自己封装数据类型,如int,byte,float等数据类型
  • 60}
  • 61
  • 客户端调用方法:
  • MZ.GetWebService.GetWSByAxis2 ws=new MZ.GetWebService.GetWSByAxis2();
  • ws.WSUrl="http://localhost:8989/axis2/services/HelloWorld";
  • HelloWorld hello= (HelloWorld)ws.getObject("getName", HelloWorld.class);
  • System.out.println(hello.getName("zhangjin"));
  • 2.使用service.xml发布webservice,这种方式和直接放在pojo目录中的POJO类不同。要想将MyService类发布成Web Service,需要一个services.xml文件,这个文件需要放在META-INF目录中,该文件的内容如下:
  • <description>
  • HelloWorld webservice
  • </description>
  • <parameter name="ServiceClass">
  • service.HelloWorld
  • </parameter>
  • <messageReceivers>
  • <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
  • class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
  • <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
  • class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
  • </messageReceivers>
  • </service>
  • 其中<service>元素用于发布Web Service,一个<service>元素只能发布一个WebService类,name属性表示WebService名,如下面的URL可以获得这个WebService的WSDL内容:
  • http://localhost:8080/axis2/services/myService?wsdl
  • 除此之外,还有直接可以在其中制定webservice操作方法:可以这样些service.xml文件
  • 2    <description>
  • 3       HelloWorld service
  • 4    </description>
  • 5    <parameter name="ServiceClass">
  • 6        service.HelloWorld
  • 7    </parameter>
  • 8    <operation name="getName">
  • 9        <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
  • 10    </operation>
  • 11    <operation name="add">
  • 12        <messageReceiver
  • 13            class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
  • 14    </operation>
  • 15</service>
  • 16
  • 如果要发布多个webservice,可以在文件两段加上<serviceGroup><service></service>...<service></service></serviceGroup>发布

Webservice相关的知识的更多相关文章

  1. .NET同步与异步之相关背景知识(六)

    在之前的五篇随笔中,已经介绍了.NET 类库中实现并行的常见方式及其基本用法,当然.这些基本用法远远不能覆盖所有,也只能作为一个引子出现在这里.以下是前五篇随笔的目录: .NET 同步与异步之封装成T ...

  2. Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->Spring Framework中web相关的知识(概述)

    Spring Framework中web相关的知识 1.概述: 参考资料:官网documentation中第22小节内容 关于spring web mvc:  spring framework中拥有自 ...

  3. iOS蓝牙开发(二)蓝牙相关基础知识

    原文链接: http://liuyanwei.jumppo.com/2015/07/17/ios-BLE-1.html iOS蓝牙开发(一)蓝牙相关基础知识: 蓝牙常见名称和缩写 MFI ====== ...

  4. iOS网络相关零散知识总结

    iOS网络相关零散知识总结 1. URL和HTTP知识 (1) URL的全称是Uniform Resource Locator(统一资源定位符). URL的基本格式 = 协议://主机地址/路径   ...

  5. 深入理解mysql之BDB系列(1)---BDB相关基础知识

        深入理解mysql之BDB系列(1) ---BDB相关基础知识 作者:杨万富   一:BDB体系结构 1.1.BDB体系结构 BDB总体的体系结构如图1.1所看到的,包括五个子系统(见图1.1 ...

  6. 【RAC】RAC相关基础知识

    [RAC]RAC相关基础知识 1.CRS简介    从Oracle 10G开始,oracle引进一套完整的集群管理解决方案—-Cluster-Ready Services,它包括集群连通性.消息和锁. ...

  7. Linux实战教学笔记19:Linux相关网络知识梳理

    第十九节 Linux相关网络知识梳理 标签(空格分隔): Linux实战教学笔记-陈思齐 一,前言 一个运维有时也要和网络打交道,所以具备最基本的网络知识,对一个运维人员来说是必要的.但,对于我们的工 ...

  8. day 28 网络基础相关的知识

    1.网络基础相关的知识 架构 C/S 架构:  client 客户端  server服务器端 优势: 能充分发挥PC机的性能 B/S 架构: browser 浏览器 server服务器       隶 ...

  9. apache系统故障排查方案及相关操作知识

    apache系统故障排查方案及相关操作知识 1.查看系统开的apache服务在哪个端口监听,有几个apache在服务,它的初始pid是多少 netstat -alop |grep LISTEN |gr ...

随机推荐

  1. HihoCoder1576 子树中的最小权值( dfs序 +线段树 || 树剖)

    给定一棵N个节点的树,编号1~N.其中1号节点是根,并且第i个节点的权值是Vi. 针对这棵树,小Hi会询问小Ho一系列问题.每次小Hi会指定一个节点x,询问小Ho以x为根的子树中,最小的权值是多少.为 ...

  2. UNP总结 Chapter 12~14 IPv4与IPv6的互操作性、守护进程和inet超级服务器、高级I/O函数

    一.IPv4与IPv6的互操作性 1.IPv4客户与IPv6服务器 拥有双重协议栈的主机的一个基本特性就是:其上运行的IPv6服务器既能应付IPv4客户,又能应付IPv6客户.这是通过使用IPv4映射 ...

  3. phpStorm的远端部署

    首先远端服务器的路径: /var/www -rwxrwxrwx jiangzhaowei jiangzhaowei 6月 index.html* lr-xr-xr-x root root 2月 php ...

  4. Git简单教程

    该笔记总结廖雪峰Git教程, 参考网站: https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017 ...

  5. python在三引号中使用变量

  6. Struts过滤器

    StrutsPrepareAndExecuteFilter过滤器其实是包含2部分的 StrutsPrepareFilter:做准备 StrutsExecuteFilter:进入Struts2的核心处理 ...

  7. 运用Eclipse的Working Set,界面清爽多了

    使用Eclipse的Working Set,界面清爽多了 想必大家的Eclipse里也会有这么多得工程...... 每次工作使用到的项目肯定不会太多...... 每次从这么大数量的工程当中找到自己要使 ...

  8. 关于git被误删除的分支还原问题

    在开发过程中, 有可能会将正在开发的本地分支误删, 本地分支被删除时, 如果已经将本地分支的变更推送到了远端, 还没有问题, 如果被删除的本地分支只提交了没有推送到远端, 就悲剧了, 相当于在你上一次 ...

  9. CF 345A Mike and Frog

    题目 自己歪歪的做法WA了好多发. 原题中每一秒都相当于 $x1 = f1(x1)$ $x2 = f2(x2)$ 然后这是一个定义域和值域都在[0,m-1]的函数,显而易见其会形成一个环. 而且环长不 ...

  10. 3.1 HiveServer2.Beeline JDBC使用

    https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients 一.HiveServer2.Beeline 1.HiveSer ...