java開發webService完整例子

java 調用webservice的各類方法總結 
    如今webservice加xml技術已經逐漸成熟,但要真正要用起來還需時日!!
    因爲畢業設計緣故,我看了不少關於webservice方面的知識,今天和你們一塊兒來研究研究webservice的各類使用方法。
    
1、利用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;  java

@WebService 
public class Hello {web

@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就會出現下列顯示apache

   4.使用wsimport 生成客戶端 
    
     使用以下:wsimport -p . -keep http://localhost:8080/hello?wsdlapi

    這時,會在當前目錄中生成以下文件:
          
       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}

     以上方法還稍顯繁瑣,還有更加簡單的方法數組

2、使用xfire,我這裏使用的是myeclipse集成的xfire進行測試的
    利用xfire開發WebService,能夠有三種方法:
      1一種是從javabean 中生成;
      2 一種是從wsdl文件中生成;
      3 還有一種是本身創建webservice
    步驟以下:
    用myeclipse創建webservice工程,目錄結構以下:瀏覽器

    首先創建webservice接口,
     代碼以下: 
    tomcat

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} 
3、使用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}
304、使用axis2開發webservice(這裏首先感謝李寧老師)    
使用axis2 須要先下載 
   axis2-1.4.1-bin.zipapp

   axis2-1.4.1-war.zipeclipse

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目錄中,該文件的內容以下: <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文件1<service name="HelloWorld">2    <description>3       HelloWorld service4    </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        <messageReceiver13            class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />14    </operation>15</service>16若是要發佈多個webservice,能夠在文件兩段加上<serviceGroup><service></service>...<service></service></serviceGroup>發佈

相關文章
相關標籤/搜索