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) 同一系統内