The important thing in life is to have a great aim , and the determination

          常用鏈接

          統(tǒng)計(jì)

          IT技術(shù)鏈接

          保險(xiǎn)相關(guān)

          友情鏈接

          基金知識(shí)

          生活相關(guān)

          最新評(píng)論

          java 調(diào)用webservice的各種方法總結(jié)

          一、利用jdk web服務(wù)api實(shí)現(xiàn),這里使用基于 SOAP message 的 Web 服務(wù)
          1.首先建立一個(gè)Web services EndPoint:
          Java代碼
          1. package Hello;      
          2. import javax.jws.WebService;      
          3. import javax.jws.WebMethod;      
          4. import javax.xml.ws.Endpoint;      
          5.      
          6. @WebService     
          7. public class Hello {     
          8.     
          9. @WebMethod     
          10. public String hello(String name) {      
          11. return "Hello, " + name + "\n";      
          12. }      
          13.        
          14.  public static void main(String[] args) {      
          15.    // create and publish an endpoint      
          16.        Hello hello = new Hello();      
          17.        Endpoint endpoint = Endpoint.publish("http://localhost:8080/hello", hello);       
          18.         }      
          19. }   

          2.使用 apt 編譯 Hello.java(例:apt -d [存放編譯后的文件目錄] Hello.java ) ,會(huì)生成 jaws目錄
          3.使用java Hello.Hello運(yùn)行,然后將瀏覽器指向http://localhost:8080/hello?wsdl就會(huì)出現(xiàn)下列顯示
          4.使用wsimport 生成客戶端
          使用如下:wsimport -p . -keep http://localhost:8080/hello?wsdl
          5.客戶端程序:
          Java代碼
          1. class HelloClient{      
          2. public 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. }  



          二、使用xfire,我這里使用的是myeclipse集成的xfire進(jìn)行測(cè)試的
          利用xfire開發(fā)WebService,可以有三種方法:
                1一種是從javabean 中生成;
                2 一種是從wsdl文件中生成;
                3 還有一種是自己建立webservice
          步驟如下:
              用myeclipse建立webservice工程,目錄結(jié)構(gòu)如下:
           
              首先建立webservice接口,
               代碼如下:
          Java代碼
          1. package com.myeclipse.wsExample;   
          2. //Generated by MyEclipse   
          3.   
          4. public interface IHelloWorldService {   
          5.        
          6.     public String example(String message);   
          7.        
          8. }  

          Java代碼
          1. package com.myeclipse.wsExample;   
          2.  //Generated by MyEclipse   
          3.     
          4.  public class HelloWorldServiceImpl implements IHelloWorldService {   
          5.         
          6.      public String example(String message) {   
          7.          return message;   
          8.      }   
          9.         
          10. }  


          修改service.xml 文件,加入以下代碼:
          Xml代碼
          1.   
          2. <service>  
          3.         <name>HelloWorldService</name>  
          4.         <serviceClass>  
          5.              com.myeclipse.wsExample.IHelloWorldService   
          6.          </serviceClass>  
          7.          <implementationClass>  
          8.             com.myeclipse.wsExample.HelloWorldServiceImpl   
          9.          </implementationClass>  
          10.          <style>wrapped</style>  
          11.          <use>literal</use>  
          12.          <scope>application</scope>  
          13. </service>  


          把整個(gè)項(xiàng)目部署到tomcat服務(wù)器中 ,打開瀏覽器,輸入http://localhost:8989/HelloWorld/services/HelloWorldService?wsdl

          客戶端實(shí)現(xiàn)如下:
          Java代碼
          1. package com.myeclipse.wsExample.client;   
          2. import java.net.MalformedURLException;   
          3. import java.net.URL;   
          4.   
          5. import org.codehaus.xfire.XFireFactory;   
          6. import org.codehaus.xfire.client.Client;   
          7. import org.codehaus.xfire.client.XFireProxyFactory;   
          8. import org.codehaus.xfire.service.Service;   
          9. import org.codehaus.xfire.service.binding.ObjectServiceFactory;   
          10.   
          11. import com.myeclipse.wsExample.IHelloWorldService;   
          12.   
          13. public class HelloWorldClient {   
          14. public static void main(String[] args) throws MalformedURLException, Exception {   
          15. // TODO Auto-generated method stub   
          16. Service s=new ObjectServiceFactory().create(IHelloWorldService.class);   
          17. XFireProxyFactory xf=new XFireProxyFactory(XFireFactory.newInstance().getXFire());   
          18. String url="http://localhost:8989/HelloWorld/services/HelloWorldService";   
          19.   
          20.         try  
          21.         {               
          22.                
          23.             IHelloWorldService hs=(IHelloWorldService) xf.create(s,url);   
          24.             String st=hs.example("zhangjin");   
          25.             System.out.print(st);   
          26.         }   
          27.         catch(Exception e)   
          28.         {   
          29.             e.printStackTrace();   
          30.         }   
          31.    }   
          32.   
          33. }  

          這里再說點(diǎn)題外話,有時(shí)候我們知道一個(gè)wsdl地址,比如想用java客戶端引用.net 做得webservice,使用myeclipse引用,但是卻出現(xiàn)無(wú)法通過驗(yàn)證的錯(cuò)誤,這時(shí)我們可以直接在類中引用,步驟如下:
          Java代碼
          1. public 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. //遠(yuǎn)程調(diào)用.net開發(fā)的webservice   
          7. Client c=new Client(new URL("http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl"));   
          8.         Object[] o=c.invoke("qqCheckOnline"new String[]{"531086641","591284436"});   
          9.            
          10. //調(diào)用.net本機(jī)開發(fā)的webservice   
          11. Client c1=new Client(new URL("http://localhost/zj/Service.asmx?wsdl"));   
          12. Object[] o1=c1.invoke("HelloWorld",new String[]{});   
          13.            
          14. }  

          三、使用axis1.4調(diào)用webservice方法
             前提條件:下載axis1.4包和tomcat服務(wù)器   ,并將axis文件夾復(fù)制到tomcat服務(wù)器的webapp文件夾中
             這里我就說一下最簡(jiǎn)單的方法:
                   首先建立一個(gè)任意的java類(例如:HelloWorld.java),復(fù)制到axis文件夾下,將其擴(kuò)展名改為jws,然后重新啟動(dòng)tomcat,在瀏覽器中輸入http://localhost:8989/axis/HelloWorld.jws?wsdl,就會(huì)得到一個(gè)wsdl文件,其客戶端調(diào)用方法如下:
          Java代碼
          1. import javax.xml.rpc.Service;   
          2. import javax.xml.rpc.ServiceException;   
          3. import javax.xml.rpc.ServiceFactory;   
          4. import java.net.MalformedURLException;   
          5. import java.net.URL;   
          6. import java.rmi.RemoteException;   
          7. import javax.xml.namespace.QName;   
          8.   
          9. public class TestHelloWorld {   
          10.   
          11.   
          12.     public static void main(String[] args) throws MalformedURLException, ServiceException, RemoteException {   
          13.         // TODO Auto-generated method stub   
          14.            
          15.         String wsdlUrl ="http://localhost:8989/axis/HelloWorld.jws?wsdl";   
          16.         String nameSpaceUri ="http://localhost:8989/axis/HelloWorld.jws";   
          17.         String serviceName = "HelloWorldService";   
          18.         String portName = "HelloWorld";   
          19.            
          20.         ServiceFactory serviceFactory = ServiceFactory.newInstance();   
          21.         Service afService =serviceFactory.createService(new URL(wsdlUrl),new QName(nameSpaceUri, serviceName));   
          22.         HelloWorldInterface proxy = (HelloWorldInterface)afService.getPort(new QName(nameSpaceUri, portName),HelloWorldInterface.class);   
          23.         System.out.println("return value is "+proxy.getName("john") ) ;   
          24.            
          25.     }   
          26.   
          27. }  

          四、使用axis2開發(fā)webservice(這里首先感謝李寧老師)   
            使用axis2 需要先下載 

             axis2-1.4.1-bin.zip

             axis2-1.4.1-war.zip
            http://ws.apache.org/axis2/  
            同理,也需要將axis2復(fù)制到webapp目錄中
          在axis2中部署webservice有兩種方法,
              第一種是pojo方式,這種方式比較簡(jiǎn)單,但是有一些限制,例如部署的類不能加上包名
              第二種方式是利用xml發(fā)布webservice,這種方法比較靈活,不需要限制類的聲明
              下面分別說明使用方法:
              1.pojo方式:在Axis2中不需要進(jìn)行任何的配置,就可以直接將一個(gè)簡(jiǎn)單的POJO發(fā)布成WebService。其中POJO中所有的public方法將被發(fā)布成WebService方法。先實(shí)現(xiàn)一個(gè)pojo類:
          Java代碼
          1. public 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. }  

          由于這兩個(gè)方法都是public類型,所以都會(huì)發(fā)布成webservice。編譯HelloWorld類后,將HelloWorld.class文件放到%tomcat%\webapps\axis2\WEB-INF\pojo目錄中(如果沒有pojo目錄,則建立該目錄),然后打開瀏覽器進(jìn)行測(cè)試:
          輸入一下url: 

          http://localhost:8080/axis2/services/listServices
          會(huì)列出所有webservice
           
          這是其中的兩個(gè)webservice列表,接著,在客戶端進(jìn)行測(cè)試:
          首先可以寫一個(gè)封裝類,減少編碼,代碼如下:
           
          Java代碼
          1. package MZ.GetWebService;   
          2. import javax.xml.namespace.QName;   
          3.   
          4. import org.apache.axis2.AxisFault;   
          5. import org.apache.axis2.addressing.EndpointReference;   
          6. import org.apache.axis2.client.Options;   
          7. import org.apache.axis2.rpc.client.RPCServiceClient;   
          8.   
          9.   
          10. public 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數(shù)組   
          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中返回一個(gè)對(duì)象的實(shí)例   
          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. /////////////////////////////////////////       讀者可以自己封裝數(shù)據(jù)類型,如int,byte,float等數(shù)據(jù)類型   
          60. }  

          客戶端調(diào)用方法:
          Java代碼
          1. MZ.GetWebService.GetWSByAxis2 ws=new MZ.GetWebService.GetWSByAxis2();   
          2. ws.WSUrl="http://localhost:8989/axis2/services/HelloWorld";   
          3. HelloWorld hello= (HelloWorld)ws.getObject("getName", HelloWorld.class);   
          4.                
          5.               
          6.  System.out.println(hello.getName("zhangjin"));  

          2.使用service.xml發(fā)布webservice,這種方式和直接放在pojo目錄中的POJO類不同。要想將MyService類發(fā)布成Web Service,需要一個(gè)services.xml文件,這個(gè)文件需要放在META-INF目錄中,該文件的內(nèi)容如下:
          Xml代碼
          1. <service name="HelloWorld">  
          2.     <description>  
          3.         HelloWorld webservice   
          4.     </description>  
          5.     <parameter name="ServiceClass">  
          6.         service.HelloWorld     
          7.     </parameter>  
          8.     <messageReceivers>  
          9.         <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"  
          10.             class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />  
          11.         <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"  
          12.             class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />  
          13.     </messageReceivers>  
          14. </service>  

          其中<service>元素用于發(fā)布Web Service,一個(gè)<service>元素只能發(fā)布一個(gè)WebService類,name屬性表示W(wǎng)ebService名,如下面的URL可以獲得這個(gè)WebService的WSDL內(nèi)容:
          http://localhost:8080/axis2/services/myService?wsdl
            除此之外,還有直接可以在其中制定webservice操作方法:可以這樣些service.xml文件
          Java代碼
          1. <service name="HelloWorld">   
          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>  

          如果要發(fā)布多個(gè)webservice,可以在文件兩段加上<serviceGroup><service></service>...<service></service></serviceGroup>發(fā)布

          posted on 2014-04-30 13:37 鴻雁 閱讀(104) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 宁远县| 东阳市| 澄迈县| 无为县| 涞源县| 鄂伦春自治旗| 凤凰县| 峡江县| 伽师县| 福建省| 株洲县| 合作市| 威宁| 乌海市| 额尔古纳市| 江城| 阿克苏市| 兴和县| 巨鹿县| 庄浪县| 台南县| 洛隆县| 和平县| 衡阳县| 嘉定区| 义乌市| 苗栗市| 眉山市| 辽源市| 台湾省| 化州市| 油尖旺区| 施秉县| 明水县| 武定县| 沁源县| 松阳县| 栾川县| 封开县| 苍溪县| 改则县|