第一次見到webservice時,懵,懵,懵,它是什麼?主要功能是什麼?怎麼用?圍繞着這些開始webservice學習之旅
一:簡介
webService是一種跨程式設計語言和跨作業系統平台的遠端調用技術;
采用HTTP協定傳輸資料,采用XML格式封裝資料(即XML中說明調用遠端服務對象的哪個方法,傳遞的參數是什麼,以及服務對象的傳回結果是什麼)。
比如,我們的應用上需要用到天氣資訊,我們可以調用網際網路上查詢天氣的web服務,這樣使用者就可以在我們的網站上看到天氣資訊, 我們也可以把自己寫好的代碼釋出,這樣别人也可以調用;
webservice分為服務端(釋出服務)和用戶端(調用服務)兩部分;
二:Jdk釋出和調用webservice
這篇文章用Jdk釋出一個WebService服務及調用,下一篇介紹如何使用架構cxf釋出webservice;
釋出須知:
@WebService注解(注:此注解是jdk1.6提供的,位于javax.jws.WebService包中)-
- 将java類标記為實作Web Service,将 Java 接口标記為定義 Web Service 接口。
- 給類添加@WebService注解後,所有非靜态方法都會被釋出;
- 方法上加@WebMethod(exclude=true)後,此方法不被釋出;
- 如果一個類上,被添加了@WebService注解,則必須此類至少有一個可以公開的方法,否則将會啟動失敗;
通過EndPoint(端點服務類)釋出一個WebService
- EndPoint是jdk提供的一個專門用于釋出服務的類,位于 javax.xml.ws.Endpoint包中
- 該類的publish方法接收兩個參數,一個是本地的服務位址,二是提供服務的類。
WSDL(web service definition language)
-
WSDL是webservice定義語言, 對應.wsdl文檔, 一個webservice會對應一個唯一的wsdl文檔,
定義了用戶端與服務端發送請求和響應的資料格式和過程
釋出服務:
1.建立webProject
2.建立類,加上@WebService注解
3.在類中定義你要釋出的方法
@WebService
public class SayWeb {
public String sayHello(String name){
return "hello"+name;
}
public void sayBye(){
System.out.println("bye");
}
/**
* 添加@WebMethod(exclude=true)注解
* */
@WebMethod(exclude=true)
public int sayInt(int i){
return ++i;
}
/**
* 靜态方法
* */
public static void sayGood(){
System.out.println("Good");
}
/**
* main方法中釋出
* */
public static void main(String[] args) {
String address="http://localhost:9001/service/sayweb";
Endpoint.publish(address, new SayWeb());
System.out.println("釋出成功");
}
}
4.釋出webservice
5.在浏覽器中搜尋釋出的位址
6.wsdl文檔
生成代碼方式調用服務 :
第一種:
jdk檔案中bin檔案裡面有一個wsimport.exe應用程式,是用來給用戶端生成調用代碼的
1.建立webprogect,作為用戶端
2.打開cmd指令 輸入
wsimport -s E:\workspace\client\src -p com.client -keep http://localhost:9001/service/sayweb?wsdl
-keep:表示生成用戶端代碼,url為wsdl文檔的位址
-p:表示生成的代碼所放的包名
-s:表示生成源碼(直接調用),src目錄
出現以下代碼,表示生成代碼成功,
parsing WSDL…
Generating code…
Compiling code…
3.重新整理項目,看到在指定包下生成調用源碼
4.編寫測試方法,調用代碼
public static void main(String[] args) {
//擷取工廠 wsdl文檔:<service name="SayWebService">
SayWebService swb=new SayWebService();
//擷取服務端口上的對象 wsdl文檔:<port name="SayWebPort" binding="tns:SayWebPortBinding">
SayWeb sw=swb.getSayWebPort();
sw.sayBye();
System.out.println(sw.sayHello("nihao"));
}
第二種:
1.單擊項目右鍵—->new—–>web service client
2.輸入wsdl文檔位址—>finish
3.自動生成java代碼,主要使用的是***Locator和****Stub
4.測試
public static void main(String[] args) {
try {
SayWebServiceLocator swst=new SayWebServiceLocator();
java.net.URL url=new java.net.URL("http://localhost:9001/service/sayweb?wsdl");
SayWebPortBindingStub stub=new SayWebPortBindingStub(url,swst);
stub.sayBye();
System.out.println(stub.sayHello("nihao"));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
測試結果
服務端:
用戶端
總結:
1.釋出服務端除了在main方法中,還可以在servlet容器初始化時,還可以放在監聽器中等
2.使用wsimport指令的方式調用webservice,在實際項目中,并不推薦,因為要生成很多java代碼檔案,如果服務端更改,需要重新生成代碼檔案,不過使用jdk去釋出webservice簡單易于操作,隻為更好的了解web服務的調用。在後面文章中着重介紹cxf架構以及如何調用如天氣等免費的web服務