使用java的WebService時可使用一下兩種開發手段java
使用jdk開發(1.6及以上版本)web
使用CXF框架開發(工做中)服務器
一、定義一個interface,使用@WebService註解標註接口,使用@WebMethod註解標註接口中定義的全部方法,以下所示:框架
package com.myl.ws; import javax.jws.WebMethod; import javax.jws.WebService; /** * * @author maoyl * @version 2018.4.14 * 定義SEI(WebService EndPoint Interface(終端)) * */ //使用@WebService註解標註WebServiceI接口 @WebService public interface WebServiceInf { @WebMethod public String sayHello(String name); @WebMethod public String save(String name, String pwd); }
二、編寫interface的實現類,使用@WebService註解標註實現類,實現接口中定義的全部方法,以下所示:eclipse
package com.myl.ws.impl; import javax.jws.WebService; import com.myl.ws.WebServiceInf; /** * * @author myl * 具體實現 * */ @WebService public class WebServiceInfImpl implements WebServiceInf { @Override public String sayHello(String name) { System.out.println("WebService :" + name + ", 歡迎您"); return name + "歡迎您"; } @Override public String save(String name, String pwd) { System.out.println("name:" + name + ",password:" + pwd + "登陸成功"); return name + "登陸成功"; } }
三、使用Endpoint(終端)類發佈webservice,代碼以下:編輯器
package com.myl.ws; import javax.xml.ws.Endpoint; import com.myl.ws.impl.WebServiceInfImpl; /** * * @author maoyl * @version 2018.4.14 * 測試 * */ public class WebServicePublish { public static void main(String[] args) { String address = "http://192.168.1.2:5555/WS_Server/Webservice"; Endpoint.publish(address, new WebServiceInfImpl()); System.out.println("發佈成功"); } }
運行WebServicePublish類,就能夠將編寫好的WebService發佈好了,WebService的訪問URL是:http://192.168.1.2:5555/WS_Server/Webservice?wsdlide
,以下圖所示工具
1.使用監聽器發佈測試
package com.myl.ws.ulistener; import javax.jws.WebService; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.xml.ws.Endpoint; import com.myl.ws.impl.WebServiceInfImpl; /** * * @author maoyl * @version 2018.4.14 * 使用監聽器發佈 * */ @WebService public class WebServicePublishListener implements ServletContextListener { @Override public void contextDestroyed(ServletContextEvent arg0) { // TODO Auto-generated method stub } @Override public void contextInitialized(ServletContextEvent arg0) { String address = "http://192.168.1.2:5555/WS_Server/Webservice"; Endpoint.publish(address, new WebServiceInfImpl()); System.out.println("使用ServletContextListener發佈成功---------"); } }
監聽器在web.xml中配置:url
<listener> <listener-class>com.myl.ws.ulistener.WebServicePublishListener</listener-class> </listener>
在此環境下報錯
解決方法:
在@WebService標註的類上加上 @SOAPBinding(style = Style.RPC)便可解決
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
@WebService @SOAPBinding(style = Style.RPC) public interface WebServiceInf {...} //---------------
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
@WebService @SOAPBinding(style = Style.RPC) public class WebServiceInfImpl implements WebServiceInf {...}
查看資料:將jdk升級到jdk 1.6u17以上版本不加@SOAPBinding(style = Style.RPC)也不會有錯了,(貌似試了一下jdk1.7也要加,ps:若是報上面的錯誤就加上就行了)
2.使用Servlet發佈WebService
package com.myl.ws.usevlet; import javax.servlet.http.HttpServlet; import javax.xml.ws.Endpoint; import com.myl.ws.impl.WebServiceInfImpl; /** * * @author myl * 用於發佈WebService的Servlet */ public class WebServicePublishServlet extends HttpServlet { public void init (){ String address = "http://192.168.1.2:5555/WS_Server/Webservice"; Endpoint.publish(address, new WebServiceInfImpl()); System.out.println(address + "-------------------"); } }
servlet在web.xml配置
<servlet> <servlet-name>webservicepublish</servlet-name> <servlet-class>com.myl.ws.usevlet.WebServicePublishServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet>
若是不在web.xml配置,則須要在servlet實現類中加上 @WebServlet(value="",loadOnStartup=0)
/** * * @author myl * 用於發佈WebService的Servlet */ //將value屬性設置爲空字符串,這樣WebServicePublishServlet就不提供對外訪問的路徑 //loadOnStartup屬性設置WebServicePublishServlet的初始化時機 @WebServlet(value="",loadOnStartup=0) public class WebServicePublishServlet extends HttpServlet {...}
將Web應用部署到服務器運行時,在初始化WebServicePublishServlet時,就會發布WebService了。以下圖所示:
同時用listener和servlet則顯示
關於發佈WebService主要就是經過javax.xml.ws.Endpoint類提供的靜態方法publish進行發佈,若是是普通的java項目,那麼能夠專門寫一個類用於發佈WebService,若是是Web項目,那麼可使用ServletContextListener或者Servlet進行發佈。
一、藉助jdk的wsimort.exe工具生成客戶端代碼,wsimort.exe工具位於Jdk的bin目錄下,以下圖所示:
執行命令:wsimport -keep url(url爲wsdl文件的路徑)生成客戶端代碼。
注:-s 選擇生成文件的位置
-p 在該位置建立生成的文件夾做爲生成位置
若是不用-s -p 則在當前文件夾下生成生成客戶端代碼
如: wsimport -s F:\MyeclipseWorkspace\WebServlet\src -p com.myl.webservice.service -keep http://192.168.1.2:5555/WS_Server/Webservice?wsdl
顯示如上 則表示生成成功
二、 藉助生成的代碼編寫調用WebService對外提供的方法
wsimport工具幫咱們生成了好幾個java類,但咱們只須要關心 WebServiceInfImplService 類和 WebServiceInfImpl 接口的使用便可,以下所示:
package com.myl.webservice.client; import com.myl.webservice.service.WebServiceInfImpl; import com.myl.webservice.service.WebServiceInfImplService; /** * * @author myl * @version 2018.4.14 * 調用WebService的客戶端 */ public class Test { public static void main(String[] args) { //建立一個用於產生WebServiceInfImpl實例的工廠,WebServiceInfImplService類是wsimport工具生成的 WebServiceInfImplService factory = new WebServiceInfImplService(); //經過工廠生成一個WebServiceInfImpl實例,WebServiceInfImpl是wsimport工具生成的 WebServiceInfImpl wsImpl = factory.getWebServiceInfImplPort(); //調用WebService的sayHello方法 String resResult = wsImpl.sayHello("maoyl"); System.out.println("調用WebService的sayHello方法返回的結果是:"+resResult); //調用WebService的save方法 resResult = wsImpl.save("maoyal", "123"); System.out.println("調用WebService的save方法返回的結果是:"+resResult); } }
客戶端返回結果
服務器端接收到結果
從調用返回的結果顯示,藉助wsimport工具生成的客戶端代碼已經成功調用到了WebService中的方法。以上就是使用JDK開發WebService的相關內容。
2.生成客戶端代碼也能夠經過Myeclipse編輯器生成
建立客戶端項目,右擊項目 new -Other.. 選擇 Web Service Client
Next
Next
Next -- Finish
此方法生成的客戶端代碼和 wsimport -keep url 生成的同樣,調用方法也同樣