webService的常見的呼叫和釋出
1.使用wsimport.exe生成(也可以用cxf)原始碼,通過jdk的方式去呼叫
首先我們要知道,wsimport是jdk自帶的,可以根據wsdl文件生成客戶端呼叫程式碼.當然,無論伺服器端的WebService是用什麼語言寫的,都將在客戶端生成Java程式碼。伺服器端用什麼寫的並不重要。
其次就是了解wsimport的使用方法,其引數如下:
wsimport.exe位於JAVA_HOME\bin目錄下.
常用引數為:
-d<目錄> - 將生成.class檔案。預設引數。
-s<目錄> - 將生成.java檔案。
-p<生成的新包名> -將生成的類,放於指定的包下,自定義包結構。
(wsdlurl) - http://server:port/service?wsdl,必須的引數。
示例:
注意:-s不能分開,-s後面有個小點,用於指定原始碼生成的目錄。點即當前目錄。
如果使用了-s引數則會在目錄下生成兩份程式碼,一份為.class程式碼。一份為.java程式碼。
.class程式碼,可以經過打包以後使用。.java程式碼可以直接Copy到我們的專案中執行。
程式碼生成示例:(jdk生成程式碼不適用1.2,cxf生成時注意用 wsdl2java -autoNameResolution wsdl
2.使用jdk的方式去呼叫。
3.webservice的報文攔截列印。
3.1在專案中引入攔截配置檔案。
如Resources下的配置攔截檔案,命名為:webServiceLogHandlers.xml,新增如下內容:
<?xml version="1.0" encoding="UTF-8"?> <handler-chains xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee"> <handler-chain> <handler> <handler-name>authHandler</handler-name> <handler-class> com.ztesoft.jdkPackage.logPackage.SOAPLoggingHandler </handler-class> </handler> </handler-chain> </handler-chains>
3.2在生成檔案的介面中引入webServiceLogHandlers.xml檔案,進行介面攔截。
3.3攔截報文列印的實現(webServiceLogHandlers.xml中配置攔截的類實現)
4.httpClient的方式呼叫
4.1Eclipse中輸入WebService請求報文
4.2報文的檢視
4.3程式碼呼叫示例(注意DOM4J導包解析,也可以用DOM等方法解析)
5.cxf釋出WebService
Spring MVC是通過DispatcherServlet來載入Spring配置檔案的,因此不需要在web.xml中配置ContextLoaderListener。但是CXF卻需要通過ContextLoaderListener來載入Spring。
這樣就產生了一個矛盾,如果不配置ContextLoaderListener,CXF就無法正常使用。但如果配置ContextLoaderListener,又會造成Spring的重複載入(DispatcherServlet一次,ContextLoaderListener一次)
在網上查了一下資料,只看到一個國外的程式設計師提出不配置ContextLoaderListener,通過寫一個CXFController,來替代預設的CXFServlet。但是這種HACK的方式總是不太好
通過ContextLoaderListener來載入cxf.xml配置檔案的方式。
5.1依賴的新增
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<version>3.0.3</version>
</dependency>
5.2介面編寫
5.3實現編寫
注意:
“@WebService”:標記表示該介面是一個WebService服務;“
@SOAPBinding(style=Style.RPC):表示遵循遠端過程呼叫協議
@WebMethod”表示表示以下方法為WebService服務中的方法,exclude=true表示該方法不被髮布出去.“
@WebParam(name="username")”表示方法中的引數,username屬性限制了引數的名稱,若沒有指定該屬性,引數將被重新命名。
5.4配置application-cxf-server.xml檔案
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<!-- 引入cxf相關的配置檔案 -->
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<!-- 建立服務類 -->
<bean id="userServiceImpl" class="com.ztesoft.server.service.impl.UserServiceImpl" />
<!-- 釋出服務 serviceClass:服務介面全限定名 serviceBean:服務類物件,通過#號在spring容器找到對應id的物件
address:釋出地址. -->
<jaxws:server serviceClass="com.ztesoft.server.service.IUserService"
serviceBean="#userServiceImpl" address="/userService">
</jaxws:server>
</beans>
5.5通過web.xml檔案載入application-cxf-server.xml,這種方式不用重寫CXFServlet載入方式。