Web-Service-第一個例子

在Java項目中發佈第一個WS服務:

那麼如何纔可以發佈一個WebService呢?

  在JDK1.6中JAX-WS規範定義瞭如何發佈一個webService服務。

    JAX-WS是指Java Api for XML – WebService.

1.Jdk1.6.0_21以後的版本發佈一個WebService服務.
2.與Web服務相關的類,都位於javax.jws.*包中。
1.主要類有:
1.@WebService- 它是一個註解,用在類上指定將此類發佈成一個ws.
2.Endpoint – 此類爲端點服務類,它的方法publish用於將一個已經添加了@WebService註解對象綁定到一個地址的端口上。


JAX(JavaApifor Xml)-WS規範是一組XMLweb servicesJAVAAPIJAX-WS允許開發者可以選擇RPC-oriented


message-oriented來實現自己的webservices


  在 JAX-WS中,一個遠程調用可以轉換爲一個基於XML的協議例如SOAP。在使用JAX-WS過程中,開發者不需


要編寫任何生成和處理SOAP消息的代碼。JAX-WS的運行時實現會將這些API的調用轉換成爲對應的SOAP消息。


  在服務器端,用戶只需要通過Java語言定義遠程調用所需要實現的接口SEIserviceendpoint interface),並提供相


關的實現,通過調用JAX-WS的服務發佈接口就可以將其發佈爲WebService接口


  在客戶端,用戶可以通過JAX-WSAPI創建一個代理(用本地對象來替代遠程的服務)來實現對於遠程服務器端

的調用。


  當然 JAX-WS也提供了一組針對底層消息進行操作的API調用,你可以通過Dispatch直接使用SOAP消息或XML


息發送請求或者使用Provider處理SOAPXML消息。


  通過webservice所提供的互操作環境,我們可以用JAX-WS輕鬆實現JAVA平臺與其他編程環境(.net等)的互操


作。

  JAX-WSJAX-RPC之間的關係


  Sun最開始的webservices的實現是JAX-RPC1.1 (JSR 101)。這個實現是基於JavaRPC,並不完全支持schema規範,


同時沒有對BindingParsing定義標準的實現。



  JAX-WS2.0(JSR 224)Sun新的webservices協議棧,是一個完全基於標準的實現。在binding層,使用的是theJava


 Architecture for XML Binding (JAXB, JSR 222),在parsing層,使用的是theStreaming API for XML (StAX,JSR 173),同


時它還完全支持schema規範。

1:需要注意的是,jdk1.6._07以後jdk版本發佈WebService時必須要完整的對代碼進行註解,如果使用的是jdk1.6.0_21以後


版本,因爲它已經內含了ws2.1所以,可以只對類添加@WebService的註解.


以下是兩段不同的代碼:


jdk1.6.0_13的版本上發佈的ws:




import javax.jws.WebMethod;


import javax.jws.WebService;


import javax.jws.soap.SOAPBinding;


import javax.jws.soap.SOAPBinding.Style;


import javax.xml.ws.Endpoint;


@WebService(targetNamespace="http://loalhost:9999/helloworld")


@SOAPBinding(style=Style.RPC)//只支持RPC的消息風格


public class HelloWorld{


//以下通過@WebMethod註解,對外公開方法


@WebMethod

publicString sayHello(){


return"HelloWorld";


}

public static voidmain(String[] args){


Endpoint.publish("http://localhost:9999/helloworld",new HelloWorld());


}

}

2:以下是在jdk1.6.0_24上發佈的WebService代碼:



import javax.jws.WebService;


import javax.xml.ws.Endpoint;


@WebService//注意只有此一個註解,此註解也是必須的,默認的SOAP消息風格爲:DOCUMENT


public class HelloWorld{

publicString sayHello(){


return"HelloWorld";


}

public static voidmain(String[] args){


Endpoint.publish("http://localhost:9999/helloworld",new HelloWorld());


}

}

如何發佈一個web服務:

1、在類上添加@WebService註解。
這是jdk1.6提供的一個註解。它位於:javax.jws.*包中。
2、通過EndPoint(端點服務)發佈一個webService。
Endpoint也是jdk提供的一個專門用於發佈服務的類,它的publish方法接收兩個參數,一個是本地的服務地址,二是提供服務的類。它位於javax.xml.ws.*包中。
static Endpoint.publish(String address,Object implementor)
          在給定地址處針對指定的實現者對象創建併發布端點。
stop方法用於停止服務。
EndPoint發佈完成服務以後,將會獨立的線程運行。所以,publish之後的代碼,可以正常執行。
其他注意事項:
給類添加上@WebService註解後,類中所有的非靜態方法都將會對外公佈。
不支持靜態方法,final方法。-
如果希望某個方法(static,final)不對外公開,可以在方法上添加@WebMethod(exclude=true),阻止對外公開。
如果一個類上,被添加了@WebService註解,則必須此類至少有一個可以公開的方法,否則將會啓動失敗。


/**
 * 發佈第一個web服務
 * @author 
 */
@WebService
public class OneService{
	//以下方法由於是final的,所以不會對外公開
	public final String sayHi(String name){
		return name+",你好,現在時間是:"+new Date();
	}
	//通過exclude=true,設置在發佈時不包含此方法
	@WebMethod(exclude=true)
	public String sayHi1(String name){
		return name+",你好,現在時間是:"+new Date();
	}
	public String sayHi2(String name){
		return name+",你好,現在時間是:"+new Date();
	}
	public static void main(String[] args)  throws Exception{
		//發佈服務
		Endpoint end = Endpoint.publish("http://127.0.0.1:9999/one",new OneService());
		System.out.println(“服務發佈成功”);
                  Thread.sleep(2000);
                  end.stop();
	}
}

第一個WebService服務




/**
 * 
 * 
 * @author 姜沂
 * 
 *         WebService 將 Java 類標記爲實現 Web Service,或者將 Java 接口標記爲定義 Web Service 接口
 * 
 */
@WebService
public class HelloService {
	public static void main(String[] args) {
		/**
		 * 靜態的和final的方法 不能被髮布 參數1:服務的發佈地址 參數2:服務的實現者
		 */
		Endpoint.publish("http://127.0.0.1:9999/hello", new HelloService());
		System.out.println("Server ready...");
	}

	public String sayHello(String name) {
		System.err.println("----------------");
		return "hello" + name;
	}
	@WebMethod(exclude=true)//不暴露
	public String sayHello2(String name) {
		return "hello " + name;
	}
}

服務發佈成功了,如何調用呢?請看說明書-WSDL:

在地址欄輸入(注意後面的參數?wsdl)
http://127.0.0.1:9999/hello?wsdl
目前不是訪問webService,只是獲取一個用於描述WebService的說明文件,即:wsdl文件.
wsdl- WebService Description Language,是以XML文件形式來描述WebService的”說明書”,有了說明書,我們纔可以知道如何使用或是調用這個服務.


1:MyEclipse中新建立一個項目.在此項目中,將調用另一個項目中發佈的WebService

2:步驟如下:

  1:首先要根據http://127.0.0.1:9999/hello?wsdl獲取WebService的使用說明書.

         2:Jdk的當前版本下,Jdk1.6.0_24,通過wsimport這個工具來生成遠程調用的源代碼.(建議生成擴展名爲.java的文件)

         3:在本項目中,通過調用生成代碼的形式調用遠程服務.成功返回helloWorld.


使用wsimport生成本地調用代碼:

說明書看不懂怎麼辦?別急JDK能看懂:
wsimport是jdk自帶的,可以根據wsdl文檔生成客戶端調用代碼的工具.當然,無論服務器端的WebService是用什麼語言寫的,都將在客戶端生成Java代碼.服務器端用什麼寫的並不重要.
wsimport.exe位於JAVA_HOME\bin目錄下.
常用參數爲:
-d<目錄> - 將生成.class文件。默認參數。
-s<目錄> - 將生成.java文件。
-p<生成的新包名> -將生成的類,放於指定的包下。
(wsdlurl) - http://server:port/service?wsdl,必須的參數。

示例:

C:/> wsimport –s . http://192.168.0.100/one?wsdl

注意:-s不能分開,-s後面有個小點,用於指定源代碼生成的目錄。點即當前目錄。

如果使用了-s參數則會在目錄下生成兩份代碼,一份爲.class代碼。一份爲.java代碼。

.class代碼,可以經過打包以後使用。.java代碼可以直接Copy到我們的項目中運行。


1:可以通過java –version檢查你當前的版本號.如果版本太低可以安裝高版本的jdk.
或直接將別人已安裝好的jdk目錄拷貝到你的機器如D:\jdk1.6.0_24目錄下.
因爲以前的環境變量已經設置成以前老版本的jdk目錄,即JAVA_HOME和PATH兩個環境變量.
可以再重新設置一下環境變量爲:JAVA_HOME=D:\jdk1.6.0_24,path=%JAVA_HOME%\bin,
重新設置了環境變量後,要重新打開一個doc(命令行)窗口.才生效.

如果不想修改原來已經配置好的環境變量,可以命令行窗口輸入以下命令,使jdk1.6.0_24生效:
set path = D:\jdk1.6.0_24\bin;%PATH%(回車即可)
再通過java –version查看jdk的版本號是否已經發生變化.

2:轉到一個相對乾淨的目錄下,我在d盤上新建立一個目錄名爲:ws,並轉到此目錄下.
3:開啓你的webService.
4:輸入以下命令:
wsimport –s . http://127.0.0.1:9999/helloworld?wsdl
參數說明:-s是指編譯出源代碼文件,後面的.(點)指將代碼放到當前目錄下.
最後面的http….是指獲取wsdl說明書的地址.
5:此時,將生成.java文件和.class文件.(都包含原始包名).將代碼Copy到你的項目中.(只拷貝java文件)
6:在新的項目中,新一個類,(可位於任意包下),對上面生成的代碼進行調用,見下一頁ppt.


7:wsimport其他參數說明,我們經常使用的參數爲-d,-s,-p
-d<目錄>將會生成.class文件.
示例:wsimport –d . http://127.0.0.1:9999/helloworld?wsdl
-s<目錄>將會生成.java文件.
示例:wsimport –s . http://127.0.0.1:9999/helloworld?wsdl
-p<包名>將生成的文件(.java或是.class修改成指定的包名)
示例:wsimport -s . -p com.beijing.itcast http://127.0.0.1:9999/helloworld?wsdl
對於-p參數,注意包名的修改,它將所生成類,全部置於通過-p指定的包下.(演示)
需要說明的是,當僅使用-p參數時,它也將同時使用-d即編譯成.class文件. –d參數寫或不寫,它都在那裏,不離不棄.


RunMain.java的源代碼如下:

/**
 * 通過wsimport -s . http://127.0.0.1:8888/hello?wsdl  命令生成代碼 調用服務
 * @author 姜沂
 *
 */
public class App {
	public static void main(String[] args) {
		/*
		 * WSDL<service name="HelloServiceService">
		 */
		HelloServiceService hss=new HelloServiceService();
		/**
		 * WSDL <port name="HelloServicePort" binding="tns:HelloServicePortBinding">
		 */
		HelloService hs=hss.getHelloServicePort();
		hs.sayHello("hello ");
	}
}



執行客戶端代碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章