1. 程式人生 > >webService的常見的呼叫和釋出

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載入方式。