1. 程式人生 > >WebService使用介紹

WebService使用介紹

文件下載 malformed 清晰 說明 es2017 發布 服務 sport com

webservice是什麽?

webservice即web服務,是一種跨平臺遠程調用技術,基於http的soap協議進行傳輸數據。

Webservice工作原理:(對比了Socket開發的原理)

技術分享

wsdl是什麽?

wsdl即網絡服務描述語言,是webservice使用說明書,描述了service(服務視圖)、binding、porttype、message、type(消息傳輸的數據類型。)

wsdl 說明書結構

<service> 整個webservice的服務視圖,它包括了所有的服務端點

<binding> 為每個端口定義消息格式和協議細節

<portType> 描述

web service可被執行的操作,以及相關的消息,通過binding指向portType

<message> 定義一個操作(方法)的數據參數(可有多個參數)

<types> 定義 web service 使用的全部數據類型

wsdl 說明書閱讀方式

從下往上讀

先找到服務視圖,通過binging找到protType,找到了protType就找到了我們要調用的webservice方法。

Wsimport介紹

wsimportjdk自帶的webservice客戶端工具,可以根據wsdl文檔生成客戶端調用代碼(java代碼).當然,無論服務器端的WebService

是用什麽語言寫的,都可以生成調用webservice的客戶端代碼,服務端通過客戶端代碼調用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不能分開,

-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:指定命名空間

nameportType的名稱

portNameport的名稱

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使用介紹