WebService使用介紹
webservice是什麽?
webservice即web服務,是一種跨平臺遠程調用技術,基於http的soap協議進行傳輸數據。
Webservice工作原理:(對比了Socket開發的原理)
wsdl是什麽?
wsdl即網絡服務描述語言,是webservice使用說明書,描述了service(服務視圖)、binding、porttype、message、type(消息傳輸的數據類型。)
wsdl 說明書結構
<service> 整個webservice的服務視圖,它包括了所有的服務端點
<binding> 為每個端口定義消息格式和協議細節
<portType> 描述
<message> 定義一個操作(方法)的數據參數(可有多個參數)
<types> 定義 web service 使用的全部數據類型
wsdl 說明書閱讀方式
從下往上讀
先找到服務視圖,通過binging找到protType,找到了protType就找到了我們要調用的webservice方法。
Wsimport介紹
wsimport是jdk自帶的webservice客戶端工具,可以根據wsdl文檔生成客戶端調用代碼(java代碼).當然,無論服務器端的WebService
wsimport.exe位於JAVA_HOME\bin目錄下.
常用參數為:
-d<目錄> - 將生成.class文件。默認參數。
-s<目錄> - 將生成.java文件。
-p<生成的新包名> -將生成的類,放於指定的包下。
(wsdlurl) - http://server:port/service?wsdl,必須的參數。
示例:
C:/> wsimport –s . http://127.0.0.1:1234/weather?wsdl
註意:-s不能分開,
使用方法:
如果wsdl文件在本地,可以這樣使用:Wsimport –s . file:///d:\WeatherWebService.wsdl
註意:這裏可能會遇到類似這樣的錯誤:
我們可以把wsdl文件下載到本地,刪除掉文件中所有的<s:element ref="s:schema"/>即可解決
客戶端的編寫方法:
第一種客戶端編寫方法; 全部使用的是wsimport生成的代碼調用webservice。 問題:將webservice的地址固定寫死在代碼中了(硬編碼),不利於系統維護。如果將要修改服務地址,客戶端代碼只能重新使用wsimport生成。不推薦使用
第二種客戶端編寫方法: 手動可以指定webservice 地址,使用service類來完成。 此處重點!!!!!
public class WeatherClient2 { public static void main(String[] args) throws MalformedURLException { //定義url,參數為wsdl地址 URL url = new URL("http://192.168.1.100:1234/weather?wsdl"); //定義qname,第一個參數是命名空間,第二個參數名稱是wsdl裏邊的服務名 QName qName = new QName("http://impl.sei.jaxws.ws.itcast.cn/", "WeatherInterfaceImplService"); //創建服務視圖 Service service = Service.create(url, qName); //通過服務視圖得到服務端點 WeatherInterfaceImpl weatherInterfaceImpl =service.getPort(WeatherInterfaceImpl.class); //調用webservice System.out.println(weatherInterfaceImpl.queryWeather("鄭州")); } }
soap:
soap即簡單對象訪問協議,基於http傳輸xml數據。
JAX-WS註解
WebService的註解都位於javax.jws包下:
@WebService-定義服務,在public class上邊
targetNamespace:指定命名空間
name:portType的名稱
portName:port的名稱
serviceName:服務名稱
@WebMethod-定義方法,在公開方法上邊
operationName:方法名
exclude:設置為true表示此方法不是webservice方法,反之則表示webservice方法
@WebResult-定義返回值,在方法返回值前邊
name:返回結果值的名稱
@WebParam-定義參數,在方法參數前邊
name:指定參數的名稱
作用:
通過註解,可以更加形像的描述Web服務。對自動生成的wsdl文檔進行修改,為使用者提供一個更加清晰的wsdl文檔。
當修改了WebService註解之後,會影響客戶端生成的代碼。調用的方法名和參數名也發生了變化
服務端代碼演示:
@WebService(targetNamespace="http:// webservice.itcast.cn", serviceName="weatherService", portName="weatherServicePort", name="weatherServiceInterface" ) public class WeatherInterfaceImpl implements WeatherInterface { @Override public @WebResult(name="weatherResult")List<WeatherModel> queryWeather( @WebParam(name="cityName")String cityName) throws Exception { //構造三天的天氣結果 Calendar calendar = Calendar.getInstance(); int day = calendar.get(Calendar.DATE); //第一天的天氣 WeatherModel weatherModel_1 = new WeatherModel(); weatherModel_1.setDate(new Date()); weatherModel_1.setDetail("晴朗"); weatherModel_1.setTemperature_max(30); weatherModel_1.setTemperature_min(23); //第二天的天氣 WeatherModel weatherModel_2 = new WeatherModel(); calendar.set(Calendar.DATE, day+1); weatherModel_2.setDate(calendar.getTime()); weatherModel_2.setDetail("晴轉多雲"); weatherModel_2.setTemperature_max(28); weatherModel_2.setTemperature_min(21); //第三天的天氣 WeatherModel weatherModel_3 = new WeatherModel(); calendar.set(Calendar.DATE, day+2); weatherModel_3.setDate(calendar.getTime()); weatherModel_3.setDetail("多雲轉小雨"); weatherModel_3.setTemperature_max(25); weatherModel_3.setTemperature_min(18); List<WeatherModel> list = new ArrayList<WeatherModel>(); list.add(weatherModel_1); list.add(weatherModel_2); list.add(weatherModel_3); //返回三天的天氣 return list; } }
使用jaxws將webservice在tomcat中發布:
第一步:下載jaxws-ri-2.2.8的擴展包
第二步:創建web工程
第三步:將jaxws-ri-2.2.8的jar包加入工程
第四步:編寫服務端代碼,編寫方法如上服務端代碼演示
如果需要生成soap1.2在@WebServer下添加:
@BindingType(value="http://www.w3.org/2003/05/soap/bindings/HTTP/")
第五步:使用wsgen生成wsdl
使用wsimport工具生成代碼是客戶端調用 wsgen工具生成的代碼是服務端使用
使用wsgen生成wsdl,需要提前生成wsdl,根據service接口實現類來生成wsdl.
進入工程根目錄:執行如下:
wsgen -wsdl:soap1.1 -cp WebRoot\WEB-INF\classes cn.itcast.ws.jaxws.service.WeatherServiceImplSoap -r WebRoot\WEB-INF\wsdl
如果生成soap12,命令:
wsgen -wsdl:Xsoap1.2 -extension -cp WebRoot\WEB-INF\classes cn.itcast.ws.jaxws.service.WeatherServiceImplSoap12 -r WebRoot\WEB-INF\wsdl
wsdl:soap1.1 :生成soap1.1的使用說明書
-cp:指定classpath
cn.itcast.weather.server.ServerJws :service接口實現類
-r:將生成wsdl輸出到哪個位置
第六步:配置sun-jaxws.xml
文件中配置你的service發布的選項:
<endpoint name=‘ServerJws‘ implementation=‘cn.itcast.weather.server.ServerJws‘ wsdl=‘WEB-INF/wsdl/WeatherServerService.wsdl‘ url-pattern=‘/ webservice /weather‘ /> implementation:實現類全路徑, wsdl :使用說明書,提前生成 url-pattern:/ webservice /weather這個路徑就是webservice地址 soap12: <!-- 發布soap12 --> <endpoint name=‘weatherServiceSoap12‘ implementation=‘cn.itcast.ws.jaxws.service.WeatherServiceImplSoap12‘ wsdl=‘WEB-INF/wsdl/WeatherServiceSoap12.wsdl‘ url-pattern=‘/webservice/weathersoap12‘ />
第七步:配置web.xml
//webservice的監聽 <listener> <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class> </listener> <servlet> <servlet-name>webservice</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>webservice</servlet-name> <url-pattern>/webservice/*</url-pattern> </servlet-mapping>
WebService使用介紹