Amazon Ads

2013年8月19日 星期一

【筆記】使用wsimport建立Java Web Service的用戶端程式

當你有一個WSDL的URL時,使用JAX-WS API來建立他的用戶端程式,是相對簡單的。如我們有一個WSDL如下:



它的URL如下:http://localhost:1234/cal?wsdl,若要撰寫一個用戶端程式去使用這個Web Service,我們要先產生它的代理程式(artifact),很方便地,在JDK 6中的「bin」目錄下,就有一個「wsimport」程式,可以讓我們用來產生用戶端程式所需的代理程式。

若在安裝Java時,有在「Path」中設定好Java的執行目錄(bin),則開啟「命令提示字元」,在「命令提示字元」輸入「wsimport」,應該會出現下列畫面中的結果,他會提示一些這個指令使時的說明。


接著把上列WSDL的URL代入到這個指令的參數中,為了方便,在「命令提示字元」先切換資料夾到事先建立好的Java專案目錄下的「src」中,然後輸入如下指令:「wsimport -keep -p idv.bio.ws.artifact http://localhost:1234/cal?wsdl」後按下「Enter」,執行結果如下:


其中,「-keep」是表示要產生原始碼,也就是Java檔,「-p」表示產生出來的Java檔中所屬套件設定。

在Eclipse中,重新整理之後,在「src」下,應該可以看到下列程式已經產生出來:



接著,先建立一個「idv.bio.ws.client」的套件,在之中新增一支「CalculatorClient.java」,其內容如下:

package idv.bio.ws.client;

import idv.bio.ws.artifact.Calculator;
import idv.bio.ws.artifact.CalculatorService;

public class CalculatorClient {

public static void main(String[] args) {
    CalculatorService service = new CalculatorService();
    Calculator port = service.getCalculatorPort();
    System.out.println("2 + 6 = " + port.add(2, 6));
  }
}

執行結果印出:2 + 6 = 8

說明:

  1. 程式的第一步,找出WSDL中, name="CalculatorService">對應的類別,它應該會繼承「javax.xml.ws.Service」這個類別,使用它產生一個物件。
  2. 然後使用上列物件,使用「getPort」的方法,得到一個對應到 name="Calculator">名字的介面的實作物件。
  3. 使用這個實作物件,就可以使用WSDL中,「portType」元素(element)內定義的「operation」了。

[分享]改變Eclipse中選取文字時的顏色設定

在換了Eclipse的主題之後,有時會遇到一個比較煩人的問題,那就是用滑鼠選了一段文字後,看起來像沒選一樣,就是不那麼明顯,如下面程式中,其實拜歐已用滑鼠選取了紅框中的「abc」,但畫面看起來就沒那麼明顯,常會造成一些小困擾:

要改變選取文字的顏色設定很簡單,請到「Window」、「Preferences」,找到紅框所示位置:
上列圖中,「Selection foreground color」是表示所選取文字的前景顏色,就是字的顏色,而「Selection background color」表示選取文字的背景顏色。

設定完成後,再選取「abc」,這時前、背景色就好認許多。



2013年8月16日 星期五

【筆記】超輕量的Web Service

記得拜歐還在Java的入門等級時,有嘗試過去用Java寫一個Web Service出來,那時在網路上找Sample Code照著作,有時還跑不出來,就深深地覺得Java Web Service是個怪獸級的東東,後來工作上沒碰到,也就沒在注意它了。

最近在工作上有使用到,加上要考證照,就每天都會碰到,就發現以為要寫一堆程式才能實現的,現在幾行程式就可以弄出一個可以跑的Web Service,這多虧了JAX-WS API,很多複雜的運作,都幫我們準備好了,底下使用一個範例,只要兩支程式,就可以執行為Web Service。

package idv.bio.ws;
import javax.jws.WebService;
@WebService
public class Calculator {
public int add(int a, int b){
return a + b;
}
}
上列中,值得一提的是「@WebService」這個annotation,只要加上這個,就表示這支Java就是一個Web Service的實作類別。

再來,使用「Endpoint」這個類別來發佈:

package idv.bio.ws;
import javax.xml.ws.Endpoint;
public class CalculatorPublisher {
public static void main(String[] args){
String url = "http://localhost:1234/cal";
Endpoint.publish(url, new Calculator());
System.out.println("Calculator Service published, url: " + url);
}
}
執行「CalculatorPublisher.class」之後,在Console應該可以看到下列訊息:

2013/8/16 下午 11:24:57 com.sun.xml.internal.ws.model.RuntimeModeler getRequestWrapperClass
資訊: Dynamically creating request wrapper Class idv.bio.ws.jaxws.Add
2013/8/16 下午 11:24:57 com.sun.xml.internal.ws.model.RuntimeModeler getResponseWrapperClass
資訊: Dynamically creating response wrapper bean Class idv.bio.ws.jaxws.AddResponse
Calculator Service published, url: http://localhost:1234/cal
把「http://localhost:1234/cal?wsdl」貼到你的瀏覽器上,可以看到WSDL,它是描述Web Service相關資訊的一個XML文件,如:


使用Soup UI去驗證,結果如下:

[筆記]EJB 3.1 Lite和Full EJB 3.1 API的比較

EJB Lite是Full EJB 3.1 API的一個子集,讓開發者可以去實現較小、較不複雜的EJB容器,並且能(部份)符合EJB 3.1的規範。
特徵
Full EJB 3.1 APIEJB 3.1 Lite API
Java Persistence 2.0可用可用
Session beans local/no interface client view可用可用
Session beans 3.0 remote client
view
可用不可用
Session beans 2.x remote client
view
可用不可用
Session beans exposed as JAXWS web service endpoints可用不可用
Session beans exposed as JAXRPC web service endpoints可用不可用
EJB timer service可用不可用
Asynchronous invocation of
session beans
可用不可用
Interceptors可用可用
RMI-IIOP interoperability可用不可用
Bean and container managed
transactions
可用可用
Declarative and programmatic
security
可用可用
Embeddable API可用,但embeddable
container只需支援EJB 3.1 Lite
可用
Message driven beans可用不可用

節錄自:http://www.slideshare.net/krizsan/ocp-jbcd-6-study-notes

2013年8月14日 星期三

[筆記]EJB程式設計的限制

為了遵守EJB3.1的標準,確認在不同的容器(container)的可攜性(portability),有些程式設計原則是開發者需要遵守的:

  1. 為了確保在分散式環境中的一致性,EJB不會使用可寫的靜態變數(writable static fields)。
  2. 在一個應用程式中,Server通常不允許去使用鍵盤或螢幕,所以EJB不可使用AWT相關功能去產生「輸出(output)」,或從鍵盤去取得「輸入(input)」。
  3. 為了確保安全性,EJB不可嘗試直接去讀、寫一個file description。
  4. 為了確保安全性,EJB不可嘗試去載入一個native library。
  5. 為了確保安全性,EJB不可去定義套件中的類別。
參考來源:

2013年8月13日 星期二

[筆記]JAXP API的比較

JAXP API的比較
StAXSAXDOM
API類型Pull, streamingPush, streamingIn memory, tree
易用性中等
XPath Capable
CPU與記憶體效率視使用方式而定
只能往前(Forward Only)
讀取XML
寫入XML
Create, Read, Update, Delete
參考來源:http://www.slideshare.net/krizsan/scdjws-5-study-notes-3085287