java 调用webservice的各种方法总结
现在webservice加xml技术已经逐渐成熟,但要真正要用起来还需时日!!
由于毕业设计缘故,我看了很多关于webservice方面的知识,今天和大家一起来研究研究webservice的各种使用方法。

一、利用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.客户端程序:

class HelloClient
{
public static void main(String args[])
{
HelloService service = new HelloService();
Hello helloProxy = service.getHelloPort();
String hello = helloProxy.hello("你好");
System.out.println(hello);
}
}

以上方法还稍显繁琐,还有更加简单的方法

二、使用xfire,我这里使用的是myeclipse集成的xfire进行测试的
利用xfire开发WebService,可以有三种方法:

1一种是从javabean 中生成;

2 一种是从wsdl文件中生成;

3 还有一种是自己建立webservice

步骤如下:

用myeclipse建立webservice工程,目录结构如下:

首先建立webservice接口,代码如下:

package com.myeclipse.wsExample;
//Generated by MyEclipse
public interface IHelloWorldService
{
public String example(String message);
//接着实现这个借口: 1package com.myeclipse.wsExample;
//Generated by MyEclipse
public class HelloWorldServiceImpl implements IHelloWorldService
{
public String example(String message)
{
return message;
}
}
}

修改service.xml 文件,加入以下代码:

<service>
<name>HelloWorldService</name>
<serviceClass>com.myeclipse.wsExample.IHelloWorldService</serviceClass>
<implementationClass>com.myeclipse.wsExample.HelloWorldServiceImpl</implementationClass>
<style>wrapped</style>
<use>literal</use>
<scope>application</scope>
</service>

把整个项目部署到tomcat服务器中 ,打开浏览器,输入http://localhost:8989/HelloWorld/services/HelloWorldService?wsdl,可以看到如下:
然后再展开HelloWorldService后面的wsdl可以看到:

客户端实现如下:

package com.myeclipse.wsExample.client;
import java.net.MalformedURLException;
import java.net.URL; import org.codehaus.xfire.XFireFactory;
import org.codehaus.xfire.client.Client;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
import com.myeclipse.wsExample.IHelloWorldService; public class HelloWorldClient
{
public static void main(String[] args) throws MalformedURLException, Exception
{
// TODO Auto-generated method stub
Service s=new ObjectServiceFactory().create(IHelloWorldService.class);
XFireProxyFactory xf=new XFireProxyFactory(XFireFactory.newInstance().getXFire());
String url="http://localhost:8989/HelloWorld/services/HelloWorldService";
try
{
IHelloWorldService hs=(IHelloWorldService) xf.create(s,url);
String st=hs.example("zhangjin");
System.out.print(st);
}
catch(Exception e)
{
e.printStackTrace();
}
} }

这里再说点题外话,有时候我们知道一个wsdl地址,比如想用java客户端引用.net 做得webservice,使用myeclipse引用,但是却出现无法通过验证的错误,这时我们可以直接在类中引用,步骤如下:

public static void main(String[] args) throws MalformedURLException, Exception
{
// TODO Auto-generated method stub
Service s=new ObjectServiceFactory().create(IHelloWorldService.class);
XFireProxyFactory xf=new XFireProxyFactory(XFireFactory.newInstance().getXFire()); //远程调用.net开发的webservice
Client c=new Client(new URL("http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl"));
Object[] o=c.invoke("qqCheckOnline", new String[]{"531086641","591284436"}); //调用.net本机开发的webservice
Client c1=new Client(new URL("http://localhost/zj/Service.asmx?wsdl"));
Object[] o1=c1.invoke("HelloWorld",new String[]{});
}

三、使用axis1.4调用webservice方法
前提条件:下载axis1.4包和tomcat服务器   ,并将axis文件夹复制到tomcat服务器的webapp文件夹中

这里我就说一下最简单的方法:

首先建立一个任意的java类(例如:HelloWorld.java),复制到axis文件夹下,将其扩展名改为jws,然后重新启动tomcat,在浏览器中输入http://localhost:8989/axis/HelloWorld.jws?wsdl,就会得到一个wsdl文件,其客户端调用方法如下:

import javax.xml.rpc.Service;
import javax.xml.rpc.ServiceException;
import javax.xml.rpc.ServiceFactory; import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException; import javax.xml.namespace.QName; public class TestHelloWorld
{
public static void main(String[] args) throws MalformedURLException, ServiceException, RemoteException
{
// TODO Auto-generated method stub
String wsdlUrl ="http://localhost:8989/axis/HelloWorld.jws?wsdl";
String nameSpaceUri ="http://localhost:8989/axis/HelloWorld.jws";
String serviceName = "HelloWorldService";
String portName = "HelloWorld"; ServiceFactory serviceFactory = ServiceFactory.newInstance();
Service afService =serviceFactory.createService(new URL(wsdlUrl),new QName(nameSpaceUri, serviceName));
HelloWorldInterface proxy = (HelloWorldInterface)afService.getPort(new QName(nameSpaceUri, portName),HelloWorldInterface.class);
System.out.println("return value is "+proxy.getName("john") ) ; }
}

四、使用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类:

public class HelloWorld
{
public String getName(String name)
{
return "你好 " + name;
} public int add(int a,int b)
{
return a+b;
}
}

由于这两个方法都是public类型,所以都会发布成webservice。编译HelloWorld类后,将HelloWorld.class文件放到%tomcat%\webapps\axis2\WEB-INF\pojo目录中(如果没有pojo目录,则建立该目录),然后打开浏览器进行测试:
输入一下url:

http://localhost:8080/axis2/services/listServices

会列出所有webservice

这是其中的两个webservice列表,接着,在客户端进行测试:

首先可以写一个封装类,减少编码,代码如下:

package MZ.GetWebService;
import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient; public class GetWSByAxis2
{
private static String EndPointUrl;
private static String QUrl="http://ws.apache.org/axis2";
private QName opAddEntry;
public String WSUrl;
public RPCServiceClient setOption() throws AxisFault
{
RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
EndpointReference targetEPR = new EndpointReference(WSUrl);
options.setTo(targetEPR);
return serviceClient;
} public QName getQname(String Option)
{
return new QName (QUrl,Option);
} //返回String
public String getStr(String Option) throws AxisFault
{
RPCServiceClient serviceClient =this.setOption(); opAddEntry =this.getQname(Option); String str = (String) serviceClient.invokeBlocking(opAddEntry,
new Object[]{}, new Class[]{String.class })[0];
return str;
} // 返回一维String数组
public String[] getArray(String Option) throws AxisFault
{
RPCServiceClient serviceClient =this.setOption(); opAddEntry =this.getQname(Option); String[] strArray = (String[]) serviceClient.invokeBlocking(opAddEntry,
new Object[]{}, new Class[]{String[].class })[0];
return strArray;
} //从WebService中返回一个对象的实例
public Object getObject(String Option,Object o) throws AxisFault
{
RPCServiceClient serviceClient =this.setOption();
QName qname=this.getQname(Option);
Object object = serviceClient.invokeBlocking(qname, new Object[]{},new Class[]{o.getClass()})[0];
return object;
} ///////////////////////////////////////// 读者可以自己封装数据类型,如int,byte,float等数据类型
}

客户端调用方法:

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"));

使用service.xml发布webservice,这种方式和直接放在pojo目录中的POJO类不同。要想将MyService类发布成Web Service,需要一个services.xml文件,这个文件需要放在META-INF目录中,该文件的内容如下:

<service name="HelloWorld">
<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文件

<service name="HelloWorld">
<description>
HelloWorld service
</description>
<parameter name="ServiceClass">
service.HelloWorld
</parameter>
<operation name="getName">
<messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</operation>
<operation name="add">
<messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</operation>
</service>

如果要发布多个webservice,可以在文件两段加上<serviceGroup><service></service>...<service>< /service></serviceGroup>发布

[Java] webservice soap,wsdl 例子的更多相关文章

  1. 彻底理解webservice SOAP WSDL

    WebServices简介 先给出一个概念 SOA ,即Service Oriented Architecture ,中文一般理解为面向服务的架构, 既然说是一种架构的话,所以一般认为 SOA 是包含 ...

  2. 理解WebService SOAP WSDL

    WebServices简介 先给出一个概念 SOA ,即Service Oriented Architecture ,中文一般理解为面向服务的架构, 既然说是一种架构的话,所以一般认为 SOA 是包含 ...

  3. 【🉐】 彻底理解webservice SOAP WSDL

    原文: http://wenku.baidu.com/view/f87b55f19e31433239689314.html WebServices简介 先给出一个概念 SOA ,即Service Or ...

  4. webservice SOAP WSDL UDDI简介

    WebServices简介 先给出一个概念 SOA ,即Service Oriented Architecture ,中文一般理解为面向服务的架构, 既然说是一种架构的话,所以一般认为 SOA 是包含 ...

  5. webservice soap wsdl简介

    先给出一个概念 SOA ,即Service Oriented Architecture ,中文一般理解为面向服务的架构, 既然说是一种架构的话,所以一般认为 SOA 是包含了运行环境,编程模型, 架构 ...

  6. java webservice简单的例子

    开发环境:eclipse .jdk 创建服务端 demo-webservice 创建类 HelloService.java package com.hundsun.ws.service; import ...

  7. Webservice soap wsdl区别之个人见解

    原文:http://blog.csdn.net/pautcher_0/article/details/6798351 Web Service实现业务诉求:Web Service是真正“办事”的那个,提 ...

  8. WebService SOAP WSDL UDDI 使用php的curl、PHP5的SoapClient实现同步

    一.基本名词 WebService: WebService是一种跨编程语言和跨操作系统平台的远程调用技术.不同系统,不同语言的数据交换方法都是不同的,这就导致在不同系统,不同语言之间传递数据很麻烦,基 ...

  9. (文摘)彻底理解webservice SOAP WSDL

    WebServices特点介绍 WebServices 提供一个建立分布式应用的平台,使得运行在不同操作系统和不同设备上的软件,或者是用不同的程序语言和不同厂商的软件开发工具开发的软件,所有可能的已开 ...

随机推荐

  1. Bash's ArithmeticExpression

    [Bash's ArithmeticExpression] let command: let a=17+23 echo "a = $a" # Prints a = 40 let a ...

  2. .net 配置ueditor

    添加引用如下: <script src="../Ueditor/ueditor.config.js" type="text/javascript"> ...

  3. POJ3321 Apple Tree (树状数组)

    Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16180   Accepted: 4836 Descr ...

  4. Weka中EM算法详解

    private void EM_Init (Instances inst) throws Exception { int i, j, k; // 由于EM算法对初始值较敏感,故选择run k mean ...

  5. IOS深入学习(19)之View object

    1 前言 本章主要介绍了View视图对象,包括了其属性,视图间关系和CALayer的简介. 英文原文:http://blog.csdn.net/developer_zhang/article/deta ...

  6. easyui datagrid 的分页刷新按钮

    datagrid  刷新bug: 情形: 当用户A,B  同时操作 datagrid时(记录1,记录2.记录3).如果A如果删除记录1,  B此时已选中了记录1 ,记录2 , 这时B点击分页中的刷新按 ...

  7. Uva10474 - Where is the Marble?

      两种解法: 1.计数排序 //计数排序 #include<cstdio> #include<iostream> #include<vector> #includ ...

  8. IOS 手机助手及越狱助手推荐

    快装系列 1 快装助手(PC版) http://pc.kuaiapp.cn/ 2 快装越狱助手(PC版)http://www.kuaiapp.cn 3 快装商店(手机版)http://yueyu.ku ...

  9. sql注入在线检測(sqlmapapi)

    之前一搞渗透的同事问我.sqlmapapi.py是干啥的,我猜非常多人都玩过sqlmap,但玩过sqlmapapi的应该比較少,今天就和大家一起看看怎样使用以及一些美的地方. 说白了.sqlmapap ...

  10. 从零开始学android开发-项目重命名

    --修改项目名称 选中项目-[refactor]-[rename] --修改package名称 选中需要重命名的包-[refactor]-[rename] --修改gen下面的名称 打开Android ...