天天看點

使用JAX-WS開發簡單webservice

     webservice的技術有很多,現在流行的有JAX-WS、XFile、CXF、Axis1、Axis2等。不過JAX-WS是webservice技術最輕量級的,不需要引入額外jar包。

 在伺服器端,使用者隻需要通過Java語言定義遠端調用所需要實作的接口SEI(service endpoint interface),并提供相關的實作,通過調用JAX-WS的服務釋出接口就可以将其釋出為WebService接口。

 在用戶端,使用者可以通過JAX-WS的API建立一個代理(用本地對象來替代遠端的服務)來實作對于遠端伺服器端的調用。當然 JAX-WS 也提供了一組針對底層消息進行操作的API調用,你可以通過Dispatch 直接使用SOAP消息或XML消息發送請求或者使用Provider處理SOAP或XML消息。

 我們使用JAX-WS開發WebService隻需要很簡單的幾個步驟:寫接口和實作=>釋出=>生成用戶端。

 開發webservice服務端我們可以先編寫接口,接口中隻需要把類注明為@WebService,把要暴露給用戶端的方法注明為@WebMethod即可。

 1:編寫webservice服務端接口 

package service;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;

/**
 * 測試webservice接口
 * @author 
 *
 */
@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface TestService {
	
	/**
	 * 測試接口
	 */
	@WebMethod
    void SayHiDefault();
	
	@WebMethod
    void SayHi(@WebParam(name = "name") String name);
	
	@WebMethod
	String sayHello(String userName);

}
           

 2:編寫接口的實作類

package service.imp;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;

import service.TestService;

@WebService(endpointInterface = "service.TestService")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class TestServiceImp implements TestService {

	@Override
	public void SayHiDefault() {
		System.out.println("Hi,wangql!");
	}

	@Override
	public void SayHi(String name) {
		System.out.println("Hi,"+name+"!");
	}

	@WebMethod
	public String sayHello(@WebParam(name = "userName") String userName) {
		return "hi," + userName + " welcome to wangql";
	}

}
           

 3:釋出

 方法一:(此方式隻能作為調試,有以下BUG:jdk1.6u17?以下編譯器不支援以Endpoint.publish方式釋出document方式的soap,必須在service接口和實作類添加“@SOAPBinding(style = SOAPBinding.Style.RPC)”注解)

package main;

import javax.xml.ws.Endpoint;

import service.TestService;
import service.imp.TestServiceImp;


public class ServerStart {
	
	public static void main(String[] args) {
		System.out.println("start publish jax-ws ...");
		TestService service = new TestServiceImp();
		Endpoint.publish("http://localhost:8080/jaxwsTest/TestService", service);
		System.out.println("publish webservice successful");
	}

}
           

 方法二:(基于web伺服器Servlet方式,使用tomcat釋出)

 以Tomcat為例,首先編寫sun-jaxws.xml檔案并放到WEB-INF下:

<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0">
<endpoint name="TestService"
        implementation="service.imp.TestServiceImp"
        url-pattern="/service/test" />
</endpoints>
           

 然後編輯web.xml,添加listener和servlet(url-pattern要保持一緻):

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
	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 
	http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name>	
  
  <listener>  
        <listener-class>
            com.sun.xml.ws.transport.http.servlet.WSServletContextListener  
        </listener-class>
  </listener>
  <servlet>
        <servlet-name>TestService</servlet-name>  
        <servlet-class>
            com.sun.xml.ws.transport.http.servlet.WSServlet  
        </servlet-class>
  </servlet>  
  <servlet-mapping>  
        <servlet-name>TestService</servlet-name>  
        <url-pattern>/service/test</url-pattern>  
  </servlet-mapping>
  
  
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
           

 完成之後啟動tomcat,通路http://localhost:8080/jaxwsTest/service/test?wsdl

使用JAX-WS開發簡單webservice

 成功通路wsdl檔案,服務端可以正常運作。

 注:@SOAPBinding(style = SOAPBinding.Style.RPC)一定要加上

 http://www.micmiu.com/soa/webservice/jdk6-webservice-doc-rpc/ 可以看一下這篇文章,我再研究一下這個東西。

 3:生成webservice用戶端

 方法一:使用jdk自帶工具wsimport生成用戶端

 一般情況下直接輸入wsimport指令行直接生成用戶端,因為我是用java開發的,是以我是先在MyEclipse上建立一個webservice項目,然後在通過wsimport指令生成用戶端,這樣可以盡量避免因為編寫造成的不必要麻煩。

 (1)在Eclipse或者MyEclipse上建立一個webservice項目

使用JAX-WS開發簡單webservice

 (2)我們先通路到項目的src目錄下,然後執行"wsimport -keep http://localhost:8080/jaxwsTest/TestService?wsdl"生成用戶端代碼。

  注:我們通路的http://localhost:8080/jaxwsTest/TestService?wsdl是wsdl檔案的路徑

使用JAX-WS開發簡單webservice

 我們檢視我們的項目,如圖

使用JAX-WS開發簡單webservice

 這樣就自動生成webservice用戶端了。

 我們在用戶端編寫測試代碼

package main;

import service.imp.TestServiceImpService;


public class WSClient {
	
	public static void main(String[] args) {
		TestServiceImpService test = new TestServiceImpService();
		String name = test.getTestServiceImpPort().sayHello("123213");
		System.out.println(name);
	}

}
           

 如圖調用成功

 方法二:使用MyEclipse建立webservice Client

 在webservice服務端工程中 右擊 new----> other ---->web service client建立用戶端

使用JAX-WS開發簡單webservice

 在WSDL URL添加位址就可以了

使用JAX-WS開發簡單webservice

 如果出錯檢查自己的位址和tomcat服務是否已開啟

 方法三:自己建立webservice用戶端,因為webservice可以跨平台,我們可以用任何語言編寫用戶端,是以自己編寫用戶端是最好的選擇。

繼續閱讀