1. 程式人生 > >WebService(一) JDK實現WebService

WebService(一) JDK實現WebService

重點:

1.WebService簡介
2、JDK開發WebServrice
3、Web專案釋出WebService

重點解析:

1.概述

Web Service——也叫XML Web Service WebService,是一種跨程式語言和跨作業系統平臺的遠端呼叫技術。
各個應用程式之間的交流就需要Web Service來作為相互交流的橋樑。
Web Service是:通過SOAP在Web上提供的軟體服務,使用WSDL檔案進行說明,並通過UDDI進行註冊。

XML:(Extensible Markup Language)擴充套件型可標記語言。面向短期的臨時資料處理、面向全球資訊網絡,是Soap的基礎。

Soap:(Simple Object Access Protocol)簡單物件存取協議。是XML Web Service 的通訊協議。當用戶通過UDDI找到你的WSDL描述文件後,他通過可以SOAP呼叫你建立的Web服務中的一個或多個操作。SOAP是XML文件形式的呼叫方法的規範,它可以支援不同的底層介面,像HTTP(S)或者SMTP。

WSDL:(Web Services Description Language) WSDL 檔案是一個 XML 文件,用於說明一組 SOAP 訊息以及如何交換這些訊息。大多數情況下由軟體自動生成和使用。

XML+XSD、SOAP和WSDL就是構成WebService平臺的三大技術。
在這裡插入圖片描述

所謂跨程式語言和跨操作平臺,就是說服務端程式採用java編寫,客戶端程式則可以採用其他程式語言編寫,反之亦然!跨作業系統平臺則是指服務端程式和客戶端程式可以在不同的作業系統上執行。

所謂遠端呼叫,就是一臺計算機a上的一個程式可以呼叫到另外一臺計算機b上的一個物件的方法,譬如,天氣預報系統,淘寶網,校內網,百度等把自己的系統服務以Web Service服務的形式暴露出來,讓第三方網站和程式可以呼叫這些服務功能,這樣擴充套件了自己系統的市場佔有率。

1.2.WebService的開發手段
使用JDK開發(1.6以上版本) ✔
使用Axis2框架開發(工作中使用)

2.JDK開發WebServrice
在JDK1.6時,Oracle公司就將Web Service集入到了JDK,通過Endpoint類來實現。
2.1.開發WebService伺服器端

第一步:建立Java工程 ,建立相應的包(服務端)
第二步:建一個介面Person,建立方法:

/**
 *  定義SEI(WebService EndPoint Interface(終端))
 */
@WebService		//使用@WebService註解標註WebServiceI介面
public interface WebServiceI{
@WebMethod	      //使用WebMethod註解標註WebService介面中的方法
public String say(String what);
}

第三步:編寫WebServiceI介面的實現類WebServiceImpl,使用@WebService註解標註實現類,並實現介面所有方法:

/**
 *  SEI的具體實現
 */
@WebService    //使用@WebService註解標註WebServiceI介面的實現類
public class PersonImpl implements WebServiceI{
@Override
public String say(String what){
System.out.println("服務端:"+what);
return "正在說"+what;
}
}

第四步:寫釋出類WebServicePublish,使用Endponit(終端)類釋出WebService
將eat()方法暴露出去,確保客戶端可以訪問eat()方法:

/**
 *  釋出WebService
 */
public class WebServicePublish{

	public static void main(String[] args){
	    /**
* 釋出服務:
* 通過Endpoint類提供的publish()方法釋出WebService,
* 釋出時要保證使用的埠號沒有被其他應用程式佔用。
* Endpoint類是端點類,用來標識網路地址。
*/
	    String address = "http://172.20.10.5:6868/WS_Service/webService";
//IP地址是本機動態地址
	    Endpoint.publish(address, new WebServiceImpl());
	    System.out.println("服務端釋出WebService成功....");
	}
}

執行測試類,即將編寫好的WebService釋出好了。
WebService的訪問URL是:http://172.20.10.5:6868/WS_Service/webService

第五步:使用Eclipse自帶的工具測試服務端
MyEclipse集成了Web Service,在地球的小圖示旁邊。
在這裡插入圖片描述
開啟後,如果想要看上面釋出的,就在右上角找到WSDL page,點選後看右側

輸入http://172.20.10.5:6868/WS_Service/webService?wsdl,開發檔案後發現是xml檔案。

在這裡插入圖片描述

輸入服務端的地址後,顯示暴露出來的say()方法:
在這裡插入圖片描述

點選say()方法,在顯示項中選擇Add:
在這裡插入圖片描述
在下面的輸入框中輸入文字,Body處就顯示結果。

在這裡插入圖片描述

2.2.客戶端(終端)訪問WebService
藉助JDK的wsimport.exe工具生成客戶端程式碼,wsimport.exe工具位於JDK的bin目錄下,如下圖所示:
在這裡插入圖片描述

在cmd命令視窗執行下述命令生成客戶端程式碼:
wsimport -keep url(url為wsdl檔案的路徑)

wsimport -keep url(url為wsdl檔案的路徑)

具體步驟:
第一步:建立終端工程,主要用來實現接收服務端的暴露。
第二步:找到客戶端原始碼路徑,如果不知道顯示 在此處開啟命令視窗 ,就按住shift 加滑鼠右鍵 ,就ok了
在這裡插入圖片描述
在命令框中輸入:
wsimport -keep http://172.20.10.5:6868/WS_Service/webService?wsdl
在這裡插入圖片描述
回車後會解析產生很多的檔案,在客戶端com/…下面
建議:在src中右擊操作輸入命令,讓產生的檔案都生成在src中。

第三步:建立Test.java測試類,在main方法中:

PersonImpService  personImpService =new  PersonImpService();
PersonImp personImp=personImpService.getPersonImpPort();
String str=personImp.eat("米田共");
System.out.println(str);

3.Web專案釋出WebService

如果是Web專案,我們可以使用監聽器或Servlet來發布WebService。

3.1.使用ServletContextListener監聽器釋出WebService

/**
* 用於釋出WebService的監聽器
*/
//使用Servlet3.0提供的@WebListener註解將實現了ServletContextListener介面WebServicePublishListener類標註為一個Listener
@WebListener
public class WebServicePublishListener implements ServletContextListener {

	@Override
	public void contextDestroyed(ServletContextEvent sce) {
	
	}
	
	@Override
	public void contextInitialized(ServletContextEvent sce) {
		//WebService的釋出地址
		String address = "http://192.168.1.100:8080/WS_Server/WebService";
		//釋出WebService,WebServiceImpl類是WebServie介面的具體實現類
		Endpoint.publish(address, new WebServiceImpl());
		System.out.println("使用WebServicePublishListener釋出webservice成功!");
	}
}

將Web應用部署到伺服器執行時,在初始化Web應用上下文時,就會發布WebService了。
接著我們可以使用釋出的URL地址訪問WebService,如下圖所示:
在這裡插入圖片描述

3.2.使用Servlet釋出WebService

/**
* 用於釋出WebService的Servlet
*/
//使用Servlet3.0提供的@WebServlet註解將繼承HttpServlet類的普通Java類標註為一個Servlet
//將value屬性設定為空字串,這樣WebServicePublishServlet就不提供對外訪問的路徑
//loadOnStartup屬性設定WebServicePublishServlet的初始化時機
@WebServlet(value="", loadOnStartup=0)
public class WebServicePublishServlet extends HttpServlet {

	/* 
	* 在WebServicePublishServlet初始化時釋出WebService
	*/
	public void init() throws ServletException {
		//WebService的釋出地址
		String address = "http://192.168.1.100:8888/WebService";
		//釋出WebService,WebServiceImpl類是WebServie介面的具體實現類
		Endpoint.publish(address , new WebServiceImpl());
		System.out.println("使用WebServicePublishServlet釋出webservice成功!");
	}
}

將Web應用部署到伺服器執行時,在初始化WebServicePublishServlet時,就會發布WebService了。如下圖所示:
在這裡插入圖片描述
接著我們可以使用釋出的URL地址訪問WebService,如下圖所示:
在這裡插入圖片描述

關於釋出WebService主要就是通過javax.xml.ws.Endpoint類提供的靜態方法publish()進行釋出,如果是普通的Java專案,那麼可以專門寫一個類用於釋出WebService,如果是Web專案,那麼可以使用ServletContextListener或者Servlet進行釋出。

使用ServletContextListener進行釋出:

public class InitListener implements ServletContextListener {  
	@Override 
	public void contextDestroyed(ServletContextEvent context) {  
   
	}  

	@Override 
	public void contextInitialized(ServletContextEvent context) {  
		// 上下文初始化執行  
		System.out.println("=======>[ServletContextListener]自動載入啟動開始."); 
	}  
}

然後在web.xml檔案配置該監聽器:

<listener>
<listener-class>com.test.init.InitListener</listener-class>  
</listener>