WebService入門詳解
先來考慮一個問題,如果我們要在自己的程式裡面展示天氣預報,那怎麼弄?正确的做法是我們發送一個請求到一個系統,他會給我們傳回來天氣情況。這個就是一個webservice。天氣預報系統就相當于webservice的服務端,我們的系統就相當于用戶端。如http://www.webxml.com.cn這個網站上面就列舉了多個webservice服務站點
wsdl跟java一樣,也是一種語言,是通過xml的形式說明該webservice如何調用。
通過在webservice的url後面加?wsdl的方式,比如天氣預報的的就是http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl
Wsdl文檔從下往上讀
Types - 資料類型定義的容器,它使用某種類型系統(一般地使用XML Schema中的類型系統)。(入參和出參的資料類型)
Message - 通信消息的資料結構的抽象類型化定義。使用Types所定義的類型來定義整個消息的資料結構(入參和出參)。
Operation - 對服務中所支援的操作的抽象描述,一般單個Operation描述了一個通路入口的請求/響應消息對(方法)。
PortType - 對于某個通路入口點類型所支援的操作的抽象集合,這些操作可以由一個或多個服務通路點來支援(服務類)。
Binding - 特定服務通路點與具體服務類的綁定(不看内容,看關系)。
Port - 定義為webservice單個服務通路點。
Service- 相關服務通路點的集合。
配置java環境變量後在指令視窗中輸入wsimport –s . http://xxxx.xx.xx/xxx?wsdl即可生成java代碼
注意:-s不能分開,-s後面有個小點,用于指定源代碼生成的目錄。點即目前目錄。如果使用了-s參數則會在目錄下生成兩份代碼,一份為.class代碼。一份為.java代碼。.class代碼,可以經過打包以後使用。.java代碼可以直接Copy到我們的項目中運作
先把生成的代碼複制到項目中,然後通過讀wsdl文檔來調用
注意:用Jdk1.6.0_21以後的版本釋出一個WebService服務.與Web服務相關的類,都位于javax.xml.ws.*包中。
主要類有:
a) @WebService - 它是一個注解,用在類上指定将此類釋出成一個webservice服務.
b) Endpoint – 此類為端點服務類,它的方法publish用于将一個已經添加了@WebService注解對象綁定到一個位址的端口上。Endpoint是jdk提供的一個專門用于釋出服務的類,它的publish方法接收兩個參數,一個是本地的服務位址,二是提供服務的類。它位于javax.xml.ws.*包中。
static Endpoint.publish(String address, Object implementor) 在給定位址處針對指定的實作者對象建立并釋出端點。stop方法用于停止服務。
其他注意事項:
1) 給類添加上@WebService注解後,類中所有的非靜态方法都将會對外公布。不支援靜态方法,final方法。
2) 如果希望某個方法(非static,非final)不對外公開,可以在方法上添加@WebMethod(exclude=true),阻止對外公開。
3) 如果一個類上,被添加了@WebService注解,則必須此類至少有一個可以公開的方法,否則将會啟動失敗。
4) 服務類中不能沒有方法
5) @WebMethod(exclude=true)屏蔽方法
自動生成的文檔的名字有時不規範,可以手動進行修改。
@WebService(
portName=”myHelloService”,修改端口名字
serviceName=”HelloServices”,修改服務通路點集合名字
name=”HelloService”,修改服務類的名字
targetNamespace=”hello.rl.com” 修改命名空間名字
)
@WebResult(name=”sirHello”)修改傳回值的元素的父标簽名字
@WebParam(name=”sir”)修改傳入參數的元素的父标簽名字
說到webservice那麼cxf是不得不說的一個東西
可以了解為使用webservice的一種架構,用了cxf,可以讓釋出和調用更加簡單并且功能豐富
Apache CXF = Celtix + Xfire
支援多種協定:
a) SOAP1.1,1,2
b) HTTP
c) CORBA(Common Object Request Broker Architecture公共對象請求代理體系結構,早期語言使用的WS。C,c++,C#)
d) 并可以與Spring進行快速無縫的整合
e) 靈活的部署:可以運作有Tomcat,Jboss,Jetty(内置),IBMWS,BeaWS上面。
bin(目錄)
bin 目錄中是 CXF 架構中所提供的代碼生成、校驗、管理控制台工具(可執行指令)
docs(目錄)
CXF 所有類(class)對應的 API 文檔,為開發者使用 CXF 完成應用開發提供應有的幫助。
etc(目錄)
包含一個基本的 Service 暴露所需要的 web.xml 檔案,及其它的配置檔案。
lib(目錄)
lib 目錄中包含 CXF 及其運作時所需要的和可選的第三方支援類包(.jar 檔案),可以根據不同項目所需的 CXF 特性選擇所需要的支援類包。如果不想一一去區分的話,可
以直接在 Web 項目中包含所有的 CXF 及其運作時所需要的第三方支援類包(.jar 檔案)即可。
其中 cxf-2.0.2-incubator.jar 是 CXF 架構的二進制封包件,包含了全部的子產品(modules),cxf-manifest-incubator.jar 是清單清單檔案 manifest jar 。
以下的 jar 包是所有 CXF 項目所必需的:
cxf.jar
commons-logging.jar
geronimo-activation.jar (Or the Sun equivalent)
geronimo-annotation.jar (Or the Sun equivalent)
geronimo-javamail.jar (Or the Sun equivalent)
neethi.jar
jaxb-api.jar
jaxb-impl.jar
stax-api.jar
XmlSchema.jar
wstx-asl.jar
xml-resolver.jar
對于 Java2WSDL 和 WSDL2Java,除了必需的之外,還需要再增加如下 jar 包:
jaxb-xjc.jar
veliocity.jar
velocity-dep.jar
為了支援 JAX-WS ,除了必需的之外,還需要再增加如下 jar 包:
jaxws-api.jar
saaj-api.jar
saaj-impl.jar
asm.jar (可選的,但是可以提升包裝類型的性能)
為了支援 XML 配置,除了必需的之外,還需要再增加如下 jar 包:aopalliance.jar
spring-beans.jar
spring-context.jar
spring-core.jar
spring.web.jar
為了獨立的 HTTP 服務支援,除了必需的之外,還需要再增加如下 jar 包:geronimo-servlet.jar
jetty.jar
jetty-sslengine.jar
jetty-util.jar
sl4j.jar & sl4j-jdk14.jar (可選的,但是可以提升日志 logging)
為了支援 Aegis ,除了必需的之外,還需要再增加如下 jar 包:
jaxen.jar
jdom.jar
stax-utils.jar
為了支援 WS-Security ,除了必需的之外,還需要再增加如下 jar 包:bcprov-jdk14.jar
wss4j.jar
xalan.jar
xmlsec.jar
為了支援 HTTP Binding ,除了必需的之外,還需要再增加如下 jar 包:jra.jar
jettison.jar (僅為 JSON 服務所需的)
licenses(目錄)
清單了引用第三方 jar 包的相關許可協定。
modules(目錄)
modules 目錄中包含了 CXF 架構根據不同特性分開進行編譯的二進制封包件。釋出基于 CXF 架構的 Web 項目時,可以選擇使用該目錄下的所有 .jar 檔案,也可以選擇 lib 目 錄中的 cxf-2.0.2-incubator.jar 檔案。
samples(目錄)
samples 目錄中包含了所有随 CXF 二進制包釋出的示例,包含這些示例的源代碼和相關 Web 應用配置檔案,可以友善地用 Ant 來編譯運作測試這些示例,來了解 CXF 的開發和
使用的方法。可以通過 samples 目錄和它各個子目錄下的 README.txt 的檔案來詳細了解示例的編譯與運作的步驟。
wsdl2java –d . http://127.0.0.1:6666/helloworld?wsdl
調用方式不變
建立服務接口在接口上加@webservice
建立服務接口的實作類
在web.xml中配置CXFServlet
配置cxf-servlet.xml
使用wsdl2java生成用戶端代碼
調用webservice