1. 程式人生 > >JAX-WS(java WebService程式設計)第一篇

JAX-WS(java WebService程式設計)第一篇

1.通過MyEclipse建立基於JAX-WS的WebService

1.1建立webService服務端專案

如圖中所示建立一個WebService專案

1.1建立服務類

1.1.1建立一個普通類

在建立了WebService專案後,我們便可以在專案中建立我們自己的類了。 我們建立一個Products.java類,在其中有一個public方法通過這個方法,我們可以取得一個書名的list列表
	public List<String> getAllProduct(){
		List<String> product = new ArrayList<String>();
		product.add("java核心技術");
		product.add("javaEE開發速成");
		product.add("SOA面向方面架構");
		return product;
	}


1.1.2將類釋出為webService服務類

選中WebService專案,單擊滑鼠右鍵new一個web service(如下圖所示),因為我們建立的是服務端,所以我們選擇Web Service選項 單擊next,如下圖所示,因為我們建立的是基於JAX-WS的專案,所以在framework處選擇JAX-WS,在Strategy的選擇上,我們選擇從java類建立服務類,所以選擇第二個。 選擇需要轉換成服務的java類,如果我們選中Generate WSDL in project 那麼IDE會在我們專案的WEB-INF下,建立一個wsdl資料夾,其中儲存生成的wsdl檔案和xsd檔案.我們也可以不選。

點選Finish後,我們完成了對服務類的建立。 在完成了對服務類的建立後,我們可以看到在Products.java的源包下多了一個ProductsDelegate.java檔案。 在WEB-INF資料夾中也多了一個sun-jaxws.xml,其程式碼為:
<?xml version = "1.0"?>
<endpoints version="2.0"
	xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime">
	<endpoint name="ProductsPort"
		implementation="cn.ls.webservice.ProductsDelegate"
		url-pattern="/ProductsPort">
	</endpoint>
</endpoints>

同時在web.xml檔案中也自動添加了程式碼:
<servlet>
  	<description>JAX-WS endpoint - ProductsService</description>
  	<display-name>ProductsService</display-name>
  	<servlet-name>ProductsService</servlet-name>
  	<servlet-class>
  		com.sun.xml.ws.transport.http.servlet.WSServlet
  	</servlet-class>
  	<load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
  	<servlet-name>ProductsService</servlet-name>
  	<url-pattern>/ProductsPort</url-pattern>
  </servlet-mapping>
  <listener>
  	<listener-class>
  		com.sun.xml.ws.transport.http.servlet.WSServletContextListener
  	</listener-class>
  </listener>
每新增一個服務類,都需要在這兩個檔案中進行註冊,當然myeclipse會自動幫助我們完成這項工作。

啟動伺服器,在伺服器啟動成功後,在位址列中輸入http://luosheng:8080/WebService/ProductsPort?wsdl就可以看到瀏覽器中顯示:
這是表示我們的服務類啟用成功了。

1.2建立客戶端專案

由於我們只需要檢視能否訪問服務端程式獲取資訊,所以在這裡我們只需要建立一個java專案即可。 在建立了一個java專案後,選中新建立的java專案,按照建立服務類的方式,建立客戶端,不過在選擇建立內容的時候選擇web service client,如下圖所示:
如下圖所示,我們需要選擇WSDl檔案,這裡有兩種方式供我們選擇一種是訪問本地wsdl檔案,一種是通過訪問網路地址來獲取wsdl檔案,圖中我們是以網路地址來獲取wsdl檔案,然後我們需要選擇生成的客戶端類檔案的儲存地址圖中,我們儲存在了cn.ls.client包中,如果我們沒有建立包,那麼可以通過new鍵來建立包。點選next建立客戶端類。 完成建立後,我們可以在client包中看到剛剛生成的java類。 此時,我們可以通過編寫一個main方法來驗證我們能否成功的呼叫服務端的服務程式。main方法的程式碼為:
public class Main {
	/**
 	* @param args
 	*/
	public static void main(String[] args) {
		ProductsDelegate products = new ProductsService().getProductsPort();
		for(String str:products.getAllProduct()){
			System.out.println(str);
		}
	}
}



執行成功後我們可以看到在控制太成功的列印除了產品資訊:
這樣我們就成功的完成了一次簡單的基於JAX-WS的web service程式設計

2.基於手動的編寫JAX-WS的WebService

在第一節中,我們是通過myeclipse來編譯和生成的webService程式碼檔案,那麼怎麼來通過手動的方式來建立web服務呢!接下來我們就來看看。

2.1手動編譯建立服務端類

2.1.1建立編譯服務類

我們還是以剛剛的專案來進行講解。在建立好Products.java類後,如果要通過手動的方式將其變為服務類,還需要對Products.java檔案進行註解。
@WebService
public class Products {
	@WebMethod
	public List<String> getAllProduct(){
		List<String> product = new ArrayList<String>();
		product.add("java核心技術");
		product.add("javaEE開發速成");
		product.add("SOA面向方面架構");
		return product;
	}
}
在程式碼中,@WebService將Products類標註為web服務類,@WebMethod將方法getAllproduct標註為服務類。完成上述步驟後,我們就通過手動的方式來生成相應的wsdl等檔案。開啟系統的cmd介面。進入到專案目錄下。 我們通過命令wsgen來生成相應的wsdl等檔案。如下圖所示:(在執行時需要現在專案下建立wsdl和wssrc兩個資料夾,否則會報錯)
其中:

-wsdl引數代表生成webservice

- s引數代表生成的.java檔案置於何處

-d 引數代表生成的編譯class檔案置於何處(這個可以忽略,我們利用eclipse編譯)

-r 引數代表生成的.wsdl檔案與.xsd檔案生成在何處

-cp引數代表classpath,即Hello.class的所在,為什麼我們的-cp後是這麼長一個路徑呢?請看Eclipse裡工程編譯輸出目錄的路徑就知道了:

完成後,重新整理專案,此時我們可以看到專案中的wsdl資料夾和wssrc資料夾下多出了一些檔案。


我們將wssrc下的檔案拷貝到src下。

2.1.2配置,部署服務類

由於我們是手動生成的服務類,所以我們還需要手動的去修改web.xml和在WEB-INF資料夾下新增sun-jaxws.xml檔案,之前這些工作都是myeclipse幫我們做的。

修改web.xml新增如下程式碼:

<servlet>
  	<servlet-name>ProductsService</servlet-name>
  	<servlet-class>
  		com.sun.xml.ws.transport.http.servlet.WSServlet
  	</servlet-class>
  	<load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
  	<servlet-name>ProductsService</servlet-name>
  	<url-pattern>/ProductsPort</url-pattern>
  </servlet-mapping>
  <listener>
  	<listener-class>
  		com.sun.xml.ws.transport.http.servlet.WSServletContextListener
  	</listener-class>
  </listener>
建立sun-jaxws.xml檔案
<?xml version = "1.0"?>
<endpoints version="2.0"
	xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime">
	<endpoint name="ProductsPort"
		implementation="cn.ls.webservice.Products"
		url-pattern="/ProductsPort">
	</endpoint>
</endpoints>
完成上述步驟後,執行專案,訪問地址相應地址,如http://-luosheng:8080/WebService/ProductsPort?wsdl,能夠在瀏覽器中正確的檢視wsdl檔案,即表示建立成功。

2.2通過服務端的wsdl和xsd檔案生成客戶端java類

將服務端生成的wsdl檔案和xsd檔案拷貝到客戶端專案下,我們通過命令wsimport來完成對客戶端java的生成。 在cmd介面進入客戶端專案資料夾。執行如下圖所示命令:

重新整理專案,即可看到生成的服務端java類。通過main方法執行生成的類:
/**
	 * @param args
	 */
	public static void main(String[] args) {
		Products products = new ProductsService().getProductsPort();
		for(String str:products.getAllProduct()){
			System.out.println(str);
		}
	}


此時執行main方法,程式會報錯,為什麼呢?我們開啟ProductsService.java類,可以看到
@WebServiceClient(name = "ProductsService", targetNamespace = "http://webservice.ls.cn/", wsdlLocation = "file:/F:/workspace/WebClient/wsdl/ProductsService.wsdl")
 static {
        URL url = null;
        try {
            URL baseUrl;
            baseUrl = cn.ls.webservice.ProductsService.class.getResource(".");
            url = new URL(baseUrl, "file:/F:/workspace/WebClient/wsdl/ProductsService.wsdl");
        } catch (MalformedURLException e) {
            logger.warning("Failed to create URL for the wsdl Location: 'file:/F:/workspace/WebClient/wsdl/ProductsService.wsdl', retrying as a local file");
            logger.warning(e.getMessage());
        }
        PRODUCTSSERVICE_WSDL_LOCATION = url;
    }
通過這兩段程式碼,我們看到在第一段的wsdlLocation和第二段的url中,均為file:/F:/workspace/WebClient/wsdl/ProductsService.wsdl,這是表示的程式執行時,程式獲取wsdl檔案的地址,在這裡我們需要對她進行修改,修改為我們伺服器端相應的wsdl地址,如:http://luosheng:8080/WebService/ProductsPort?wsdl,修改後我們再執行程式,即可以成功的看到正確的執行結果了!