一、WebService的開發手段
使用Java開發WebService時可以使用以下兩種開發手段
1、 使用JDK開發(1.6及以上版本)
2、使用CXF框架開發(工作中)
二、使用JDK開發WebService
2.1、開發WebService服務器端
1、定義一個interface,使用@WebService注解標注接口,使用@WebMethod注解標注接口中定義的所有方法,如下所示:
1 package me.gacl.ws; 2 3 import javax.jws.WebMethod; 4 import javax.jws.WebService; 5 6 /** 7 * @author gacl 8 * 定義SEI(WebService EndPoint Interface(終端)) 9 */ 10 //使用@WebService注解標注WebServiceI接口 11 @WebService 12 public interface WebServiceI { 13 14 //使用@WebMethod注解標注WebServiceI接口中的方法 15 @WebMethod 16 String sayHello(String name); 17 18 @WebMethod 19 String save(String name,String pwd); 20 }
2、編寫interface的實現類,使用@WebService注解標注實現類,實現接口中定義的所有方法,如下所示:
1 package me.gacl.ws; 2 3 import javax.jws.WebService; 4 5 /** 6 * @author gacl 7 * SEI的具體實現 8 */ 9 //使用@WebService注解標注WebServiceI接口的實現類WebServiceImpl 10 @WebService 11 public class WebServiceImpl implements WebServiceI { 12 13 @Override 14 public String sayHello(String name) { 15 System.out.println("WebService sayHello "+name); 16 return "sayHello "+name; 17 } 18 19 @Override 20 public String save(String name, String pwd) { 21 System.out.println("WebService save "+name+", "+pwd); 22 return "save Success"; 23 } 24 }
3、使用Endpoint(終端)類發布webservice,代碼如下:
1 package me.gacl.ws.test; 2 3 import javax.xml.ws.Endpoint; 4 5 import me.gacl.ws.WebServiceImpl; 6 7 /** 8 * @author gacl 9 * 10 * 發布Web Service 11 */ 12 public class WebServicePublish { 13 14 public static void main(String[] args) { 15 //定義WebService的發布地址,這個地址就是提供給外界訪問Webervice的URL地址,URL地址格式為:http://ip:端口號/xxxx 16 //String address = "http://192.168.1.100:8989/";這個WebService發布地址的寫法是合法的 17 //String address = "http://192.168.1.100:8989/Webservice";這個WebService發布地址的是合法的 18 String address = "http://192.168.1.100:8989/WS_Server/Webservice"; 19 //使用Endpoint類提供的publish方法發布WebService,發布時要保證使用的端口號沒有被其他應用程序占用 20 Endpoint.publish(address , new WebServiceImpl()); 21 System.out.println("發布webservice成功!"); 22 } 23 }
運行WebServicePublish類,就可以將編寫好的WebService發布好了,WebService的訪問URL是:http://192.168.1.100:8989/WS_Server/Webservice ,如下圖所示:

這里我們編寫了一個WebServicePublish類來發布WebService,如果是Web項目,那么我們可以使用監聽器或者Servlet來發布WebService,如下:
1、使用ServletContextListener監聽器發布WebService
1 package me.gacl.listener; 2 3 import javax.servlet.ServletContextEvent; 4 import javax.servlet.ServletContextListener; 5 import javax.servlet.annotation.WebListener; 6 import javax.xml.ws.Endpoint; 7 import me.gacl.ws.WebServiceImpl; 8 9 /** 10 * @author gacl 11 * 用於發布WebService的監聽器 12 */ 13 //使用Servlet3.0提供的@WebListener注解將實現了ServletContextListener接口的WebServicePublishListener類標注為一個Listener 14 @WebListener 15 public class WebServicePublishListener implements ServletContextListener { 16 17 @Override 18 public void contextDestroyed(ServletContextEvent sce) { 19 20 } 21 22 @Override 23 public void contextInitialized(ServletContextEvent sce) { 24 //WebService的發布地址 25 String address = "http://192.168.1.100:8080/WS_Server/WebService"; 26 //發布WebService,WebServiceImpl類是WebServie接口的具體實現類 27 Endpoint.publish(address , new WebServiceImpl()); 28 System.out.println("使用WebServicePublishListener發布webservice成功!"); 29 } 30 }
將Web應用部署到服務器運行時,在初始化Web應用上下文時,就會發布WebService了。
接着我們可以使用發布的URL地址訪問WebService,如下圖所示:

2、使用Servlet發布WebService
1 package me.gacl.web.controller; 2 3 import javax.servlet.ServletException; 4 import javax.servlet.annotation.WebServlet; 5 import javax.servlet.http.HttpServlet; 6 import javax.xml.ws.Endpoint; 7 import me.gacl.ws.WebServiceImpl; 8 9 /** 10 * @author gacl 11 * 用於發布WebService的Servlet 12 */ 13 //使用Servlet3.0提供的@WebServlet注解將繼承HttpServlet類的普通Java類標注為一個Servlet 14 //將value屬性設置為空字符串,這樣WebServicePublishServlet就不提供對外訪問的路徑 15 //loadOnStartup屬性設置WebServicePublishServlet的初始化時機 16 @WebServlet(value="",loadOnStartup=0) 17 public class WebServicePublishServlet extends HttpServlet { 18 19 /* (non-Javadoc) 20 * @see javax.servlet.GenericServlet#init() 21 * 在WebServicePublishServlet初始化時發布WebService 22 */ 23 public void init() throws ServletException { 24 //WebService的發布地址 25 String address = "http://192.168.1.100:8888/WebService"; 26 //發布WebService,WebServiceImpl類是WebServie接口的具體實現類 27 Endpoint.publish(address , new WebServiceImpl()); 28 System.out.println("使用WebServicePublishServlet發布webservice成功!"); 29 } 30 }
將Web應用部署到服務器運行時,在初始化WebServicePublishServlet時,就會發布WebService了。如下圖所示:

接着我們可以使用發布的URL地址訪問WebService,如下圖所示:

關於發布WebService主要就是通過javax.xml.ws.Endpoint類提供的靜態方法publish進行發布,如果是普通的java項目,那么可以專門寫一個類用於發布WebService,如果是Web項目,那么可以使用ServletContextListener或者Servlet進行發布。
2.2、開發WebService客戶端
1、借助jdk的wsimort.exe工具生成客戶端代碼,wsimort.exe工具位於Jdk的bin目錄下,如下圖所示:

執行命令:wsimport -keep url(url為wsdl文件的路徑)生成客戶端代碼。
創建一個WebService客戶端測試項目,如下圖所示:

打開命令行窗口,切換到src目錄,執行"wsimport -keep http://192.168.1.100:8888/WebService?wsdl"生成客戶端代碼,如下圖所示:

執行命令的過程中沒有出現任何錯誤,那么代碼就生成成功了,刷新一下src目錄,就可以看到生成的代碼了,如下圖所示:

2、 借助生成的代碼編寫調用WebService對外提供的方法
wsimport工具幫我們生成了好幾個java類,但我們只需要關心WebServiceImplService類和WebServiceImpl接口的使用即可,如下所示:
1 package me.gacl.ws.client; 2 3 import me.gacl.ws.WebServiceImpl; 4 import me.gacl.ws.WebServiceImplService; 5 6 /** 7 * @author gacl 8 * 調用WebService的客戶端 9 */ 10 public class WSClient { 11 12 public static void main(String[] args) { 13 //創建一個用於產生WebServiceImpl實例的工廠,WebServiceImplService類是wsimport工具生成的 14 WebServiceImplService factory = new WebServiceImplService(); 15 //通過工廠生成一個WebServiceImpl實例,WebServiceImpl是wsimport工具生成的 16 WebServiceImpl wsImpl = factory.getWebServiceImplPort(); 17 //調用WebService的sayHello方法 18 String resResult = wsImpl.sayHello("孤傲蒼狼"); 19 System.out.println("調用WebService的sayHello方法返回的結果是:"+resResult); 20 System.out.println("---------------------------------------------------"); 21 //調用WebService的save方法 22 resResult = wsImpl.save("孤傲蒼狼","123"); 23 System.out.println("調用WebService的save方法返回的結果是:"+resResult); 24 } 25 }
客戶端調用服務器端的WebService方法運行結果如下:

從調用返回的結果顯示,借助wsimport工具生成的客戶端代碼已經成功調用到了WebService中的方法。以上就是使用JDK開發WebService的相關內容。
