天天看點

webservice學習筆記(一) - 基于JAX-WS的入門示例

webservice是實作異構系統遠端調用的技術,在java世界裡有很多實作方式,如axis、xfire、cxf等。這裡我們先用jdk自帶的JAX-WS(Java API For XML-WebService) 來體驗一下。

一 伺服器建立

1.1 建立接口

Web服務的接口通常稱為SEI (Service Endpoint Interface)。

java代碼:

package org.zttc.service;

import javax.jws.WebService;

@WebService()
public interface IMyService {

    public int add(int a,int b);

    public int minus(int a,int b);

}
           

1.2 建立實作類

Web服務的實作類通常稱為SIB (Service Implementation Bean)

java代碼:

package org.zttc.service;

import javax.jws.WebService;

@WebService(endpointInterhljs-string">"org.zttc.service.IMyService")
public class MyServiceImpl implements IMyService {

    @Override
    public int add(int a, int b) {
        System.out.println(a+"+"+b+"="+(a+b));
        return a+b;
    }

    @Override
    public int minus(int a, int b) {
        System.out.println(a+"-"+b+"="+(a-b));
        return a-b;
    }
}
           

1.3 建立服務

java代碼:

package org.zttc.service;

import javax.xml.ws.Endpoint;

public class MyServer {

    public static void main(String[] args) {
        String address = "http://localhost:8888/ns";
        Endpoint.publish(address, new MyServiceImpl());
    }

}
           

運作本類,在浏覽器中敲入 http://localhost:8888/ns?wsdl 可以檢視wsdl檔案;

二 用戶端的使用

java代碼:

package org.zttc.service;

import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.namespace.QName;
import javax.xml.ws.Service;

public class TestClient {
    public static void main(String[] args) {
        try {
            //建立通路wsdl服務位址的url
            URL url = new URL("http://localhost:8888/ns?wsdl");
            //通過Qname指明服務的具體資訊
            QName sname = new QName("http://service.zttc.org/", "MyServiceImplService");
            //建立服務
            Service service = Service.create(url,sname);
            //實作接口
            IMyService ms = service.getPort(IMyService.class);
            System.out.println(ms.add(,));
            //以上服務有問題,依然依賴于IMyServie接口
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }
}
           

QName 的建立參數來自WSDL檔案

三 wsimport的使用

cmd> wsimport -d d:/webservice/01 -keep -verbose http://localhost:8888/ns?wsdl

-d 指定生成的目錄

-keep 保持源檔案

-verbose 顯示生成的詳細過程

-p 指定包名

用戶端代碼

java代碼:

package org.zttc.service;

import java.net.MalformedURLException;

public class TestClient2 {

    public static void main(String[] args) throws MalformedURLException {
        MyServiceImplService msis = new MyServiceImplService();
        IMyService ms = msis.getMyServiceImplPort();
        System.out.println(ms.minus(,));
    }

}
           

四 wsdl簡單講解

4.1 types

用來定義通路的類型,描述方法名、參數、傳回值

http://localhost:8888/ns?xsd=1

4.2 message

SOAP(simple object access protocol)消息,一個方法一般對應兩個,接收消息與發送消息。

4.3 portType

指明伺服器的接口,并且通過operation綁定相應的in和out的消息:其中in表示參數,out表示傳回值

4.4 binding

指定傳遞消息所使用的格式。早期會用soap encoding ,現在是literal

4.5 service

指定服務所釋出的名稱等基本資訊

五 soap的使用和TCPMon

5.1 在eclipse中可以檢視soap消息格式

J2EE視圖->Launch the Web Services Explorer->WSDL網址

5.2 TCPMon

Listen Port #

用戶端通路的接口,等于用戶端首先将消息送出給TCPMon之後,再由TCPMon轉發給伺服器

Listener

Target Hostname

Target Port #

伺服器的位址,TCPMon轉發的位址

5.3 定義參數名稱

java代碼:

@WebResult(name="addResult")
    public int add(@WebParam(name="a")int a,@WebParam(name="b")int b);

    @WebResult(name="minusResult")
    public int minus(@WebParam(name="a")int a,@WebParam(name="b")int b);
           

六 代碼優先還是契約優先

6.1 傳遞一個對象類型

6.2 代碼優先還是契約優先

6.3 SOA(service-oriented architecture)

服務類型

基于實體的服務

基于功能的服務

基于流程的服務

業務流程 (BPM) ERP 不同業務系統之間的流程

工作流程(JBPM) 同一系統内