轉(zhuǎn)載請(qǐng)注明出處:http://www.cnblogs.com/Starshot/p/7050084.html

 

Soap即簡(jiǎn)單對(duì)象訪問協(xié)議,也可理解為一種用于程序之間通訊的規(guī)范,它主要基于XML和http,也正因?yàn)榛赬ML和http,所以這個(gè)協(xié)議具有很強(qiáng)的通用性,能夠很好地實(shí)現(xiàn)不同語言平臺(tái)之間的交流通訊。缺點(diǎn)是相對(duì)比較重量級(jí)。

Java的Soap框架有很多,例如xfire,CXF。說到soap不得不提一下rest,因?yàn)檫@些概念很容易弄混。

rest是一種結(jié)構(gòu)風(fēng)格,而實(shí)現(xiàn)了rest風(fēng)格的程序設(shè)計(jì)就叫做restful。它提倡更加輕量級(jí)、無狀態(tài)、自描述,更充分地利用http本身的特性,例如get,post,put,delete,以獲得更加高效的性能,使交互更加簡(jiǎn)潔易懂。例如要獲取圖書集合中的某本書AAA,可以直接通過uri:/books/AAA來表示。

而soap則都是通過post來請(qǐng)求的,沒有充分利用http的其它方法,僅將http作為傳輸協(xié)議來使用,而具體需要獲取的資源信息則包含在post的xml報(bào)文中。

需要注意的是,rest是一種風(fēng)格,它不限制于某個(gè)程序某個(gè)框架。例如CXF框架,它既可以實(shí)現(xiàn)rest風(fēng)格的webService,也可以實(shí)現(xiàn)SOAP規(guī)范的webService。例如在我另一篇博文中的CXF簡(jiǎn)單例子(http://www.cnblogs.com/Starshot/p/6889751.html),就可以看做是rest風(fēng)格的webService。

 

現(xiàn)在就先以JAX-WS這個(gè)輕量級(jí)的框架 (后面再和Spring合在一起) 來實(shí)現(xiàn)一個(gè)soap規(guī)范的超簡(jiǎn)單的webService。

首先建一個(gè)WebService的web工程,這個(gè)作為服務(wù)的提供方。然后建一個(gè)HelloService類,如下所示:

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

然后類的代碼如下:

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

package com.webService;import javax.jws.WebService;import javax.xml.ws.Endpoint;

@WebServicepublic class HelloService {    public String sayIt(String str){        return "say it:"+str;
    }    
    public static void main(String[] args) {
        Endpoint.publish("http://localhost:9009/hello/HelloService", new HelloService());
        System.out.println("publish done!");
    }
}

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

是不是很簡(jiǎn)單,是不是很驚喜,然后直接執(zhí)行,出現(xiàn)publish done!然后打開瀏覽器,輸入http://localhost:9009/hello/HelloService?wsdl,出現(xiàn)wsdl文件信息的話,就算是成功了。

接下來再建一個(gè)客戶端工程,如下所示:

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

這個(gè)時(shí)候需要生成wsdl的客戶端,對(duì)這工程點(diǎn)擊右鍵,然后新建WebService client:

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

點(diǎn)下一步,輸入剛剛在瀏覽器輸入的地址:

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

然后再點(diǎn)擊下一步設(shè)置了代碼的路徑之后按確定就可以了,成功之后如下圖所示:

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

其中com.webService里面的就是客戶端程序了。然后再如上圖新建一個(gè)測(cè)試類test1,內(nèi)容如下:

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

package com.test;import java.rmi.RemoteException;import javax.xml.rpc.ServiceException;import com.webService.HelloService;import com.webService.HelloServiceProxy;import com.webService.HelloServiceServiceLocator;public class test1 {    public static void main(String[] args) throws ServiceException, RemoteException {
        HelloService hs=new HelloServiceProxy();
         System.out.println(hs.sayIt("Yohoo!!"));
    }
}

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

執(zhí)行,該程序,控制臺(tái)輸出:Yohoo!!,這就表示成功了。

通過查看客戶端代碼可以知道,HelloServiceProxy,HelloServiceServiceLocator,HelloServicePortBindingStub三個(gè)類其實(shí)都可以用來調(diào)用服務(wù)。而所有類最終都是通過HelloServicePortBindingStub類中的sayIt方法來實(shí)現(xiàn)的,HelloServiceProxy和HelloServiceServiceLocator其實(shí)是對(duì)HelloServicePortBindingStub進(jìn)行了進(jìn)一步的加工,這也是代理模式的一種體現(xiàn)。

再然后,上面這種方式發(fā)布服務(wù)雖然簡(jiǎn)單,但在實(shí)際應(yīng)用中肯定不是這樣子發(fā)布服務(wù)的,實(shí)際肯定是要發(fā)布在web中的。JAX-WS和Spring結(jié)合起來發(fā)布一個(gè)WebService服務(wù):

 首先在原來的WebServiec工程加入以下jar包:

commons-logging-1.0.4.jar
gmbal-api-only.jar
ha-api.jar
jaxb-impl.jar
jaxws-api.jar
jaxws-rt.jar
jaxws-spring-1.8.jar
management-api.jar
policy.jar
spring-beans-3.2.14.RELEASE.jar
spring-context-3.2.14.RELEASE.jar
spring-core-3.2.14.RELEASE.jar
spring-expression-3.2.14.RELEASE.jar
spring-web-3.2.14.RELEASE.jar
stax-ex.jar
streambuffer.jar
xbean-spring-3.0.jar

因?yàn)樯婕癹ar包比較多,如果有需要的話,可以留下郵箱,我發(fā)過去。

然后建一個(gè)SpeakingService類,Component注解是表示這個(gè)類將被spring容器管理,如下所示,

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

package com.webService;import javax.jws.WebService;import org.springframework.stereotype.Component;



@Component
@WebServicepublic class SpeakingService  {    
    public String speak(String content) {        return "speaking:"+content;
    }

}

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

然后在WEB-INF下建web.xml文件,內(nèi)容如下:

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)


    
        contextConfigLocation
        classpath:applicationContext.xml
    
    
        org.springframework.web.context.ContextLoaderListener
    

   
  jwsService
  
  1
  jwsService
  /SpeakingService

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

然后在src路徑下建立applicationContext.xml文件,內(nèi)容如下:

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ws="http://jax-ws.dev.java.net/spring/core"
 xmlns:wss="http://jax-ws.dev.java.net/spring/servlet" xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

http://jax-ws.dev.java.net/spring/core
http://jax-ws.dev.java.net/spring/core.xsd
http://jax-ws.dev.java.net/spring/servlet
http://jax-ws.dev.java.net/spring/servlet.xsd
http://www.springframework.org/schema/context  
http://www.springframework.org/schema/context/spring-context-3.0.xsd
">

  <context:component-scan base-package="*"/> 

 <wss:binding url="/SpeakingService">
  <wss:service>
   <ws:service bean="#speakingService" />
  </wss:service>
 </wss:binding></beans>

Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn),云培訓(xùn)培訓(xùn)

這里有個(gè)細(xì)節(jié)要注意的是<ws:service bean="#speakingService" />這里的speakingService首字母記得要小寫,雖然原來的類名是大寫開頭,但是默認(rèn)加載進(jìn)spring容器之后,bean的id就是一小寫開頭了。

最后就是用tomcat將這個(gè)工程啟動(dòng)就可以了,訪問的ip和端口以及資源名稱就以tomcat容器的設(shè)定為準(zhǔn)了。生成客戶端的方法和剛開始說的一樣。

如果有問題,歡迎指出交流。

轉(zhuǎn)載請(qǐng)注明出處:http://www.cnblogs.com/Starshot/p/7050084.html

http://www.cnblogs.com/Starshot/p/7050084.html