Google
 

星期五, 6月 29, 2007

JAVA 6 讓 Webservice 變簡單

以前的經驗,開發 Webservice 的程式是一件相當麻煩的事情,環境設定、編輯 WSDL、程式佈署等等,即使用 IDE 的工具,都不是三言兩語就可以搞定。

JAVA 6 的出現,拯救了像我這種怕麻煩的人 ...

關鍵在於兩個 annotation: @WebService 和 @WebMethod

我參考了 Vivek Pandey's Blog学习Java6(一) WebServices(3)在tomcat中发布,簡單地整理開發 Webservice 的 Server 端和 Client 端程式的過程,以及如何部屬到 Tomcat:

參考 Vivek 的範例,寫一個加法的 Webservice
  • Server Side
WebServiceStarter.java

public class WebServiceStarter extends HttpServlet{

private static final long serialVersionUID = 5870534239093709659L;

public WebServiceStarter() {
super();
}

public void destroy() {
super.destroy();
}

public void init() throws ServletException{
System.out.println("\nStarting Calculator Service ......\n");
try{
Endpoint.publish("http://localhost:8088/calculator", new Calculator());
}catch (Exception e){
System.out.println("Caught Exception: " + e.toString());
}
System.out.println("\nCalculator Service is OK!\n");
}
}

在 Endpoint.publish 的部份,原本以為 Port 的設定應該與 Tomcat 的預設值 8080 一樣,但是在啟動 Tomcat 的時候發現會跟 Tomcat 搶 8080 Port,所以我改成 8088。

加法的 Service:Calculator.java

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;

@WebService(targetNamespace = "http://localhost/sample")
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class Calculator {

@WebMethod
public int add(int a, int b) {
return a+b;
}
}

  • Deploy
程式編譯好後,在 Tomcat 的 webapps 目錄下建立一個 Service 的目錄,如: sample,其內在建立 WEB-INF 目錄,在此目錄裡建立 web.xml:

web.xml

<?xml version="1.0" encoding="UTF-8"?><web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"><servlet>
<servlet-name>WebServiceStarter</servlet-name>
<servlet-class>WebServiceStarter</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
</web-app>


在 WEB-INF 裡面在建立 classes 的目錄,把編譯好的 Calculator.class 和 WebServiceStarter.class 複製到裡面,重新啟動 Tomcat。檢視 Tomcat 的 log :

catalina.out

Jun 29, 2007 5:16:16 PM org.apache.catalina.core.AprLifecycleListener init
INFO: The Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/lib/jvm/java-6-sun-1.6.0.00/jre/lib/i386/client:/usr/lib/jvm/java-6-sun-1.6.0.00/jre/lib/i386:/usr/lib/jvm/java-6-sun-1.6.0.00/jre/../lib/i386:/usr/java/packages/lib/i386:/lib:/usr/lib
Jun 29, 2007 5:16:16 PM org.apache.coyote.http11.Http11Protocol init
INFO: Initializing Coyote HTTP/1.1 on http-8080
Jun 29, 2007 5:16:16 PM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 875 ms
Jun 29, 2007 5:16:16 PM org.apache.catalina.core.StandardService start
INFO: Starting service Catalina
Jun 29, 2007 5:16:16 PM org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0.13

Starting Calculator Service ......


Calculator Service is OK!

Jun 29, 2007 5:16:18 PM org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8080
Jun 29, 2007 5:16:18 PM org.apache.jk.common.ChannelSocket init
INFO: JK: ajp13 listening on /0.0.0.0:8009
Jun 29, 2007 5:16:18 PM org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/43 config=null
Jun 29, 2007 5:16:18 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 2077 ms

這樣 Server 端就 OK 了!

  • Java Client
先產生需要的 class: wsimport -keep http://localhost:8088/calculator?wsdl

CalculatorApp.java

class CalculatorApp {
public static void main(String args[]){
/**
* Instantiate the generated Service
*/
CalculatorService service = new CalculatorService();

/**
* Get the port using port getter method generated in CaculatorService
*/
Calculator calculatorProxy = service.getCalculatorPort();

/**
* Invoke the remote method
*/
int result = calculatorProxy.add(10, 20);
System.out.println("Sum of 10+20 = "+result);
}
}

編譯,執行,結果應該是:Sum of 10+20 = 30

  • Flex Client
用 Flex 做一個比較好用的 GUI:

測試網址:http://ir.tmu.edu.tw/calc/

有沒有很簡單呢,呵呵!




星期六, 6月 23, 2007

好久不見的郊遊 - 新山夢湖

最近都在拍蟲,很久沒有舉辦踏青的活動,應阿曼的要求,今天選擇這個之前就一直想來的汐止「新山夢湖」。原本的規劃是走廣修禪寺那邊的登山口,不過登山口似乎不只一個,沿著又大又明顯的指標,在這裡停車,整裝準備壓山路囉!
Dsc 0388
咦?有一灘水哩,看起來還不錯?難道這就是夢湖嗎(Bobby 在水面上劃圈圈思索中 ...)?
Dsc 0390
好大的水花阿,難道有地下泉水??
Dsc 0397
原來水裡有好多魚哩(我的午餐就這樣沒了 @@)
Dsc 0435
有水的地方,當然也就有呱呱了 ^^
Dsc 0447
到夢湖的路,有很多人工的階梯,不會很難走,看來今天是個輕鬆的郊遊阿 ...
Dsc 0450
這才是夢湖啦!今天雖然有著大太陽,但是天空的顏色很差,拍不出夢幻的感覺 ...
Dsc 0457
我對還沒有領悟到色溫的掌握,夢湖就連給大家自己想像如何地夢幻吧 ^^
Dsc 0459
這裡有一個特色,蟬的密度相當高,樹上滿滿都是蟬的殼,Bobby 說要帶回家磨中藥 XD
在湖旁的涼亭休息片刻後,繼續網新山的方向前進 ...
Dsc 0473
湖的周遭也有許多蜻蜓和豆娘,多到不知道拍哪一隻 ...
Dsc 0477
再來一張。昨天浩彰帶我去光華買上次借我的神奇頭燈,我買了兩個,和我的 105 VR 組合起來,讓我可以把光圈縮得比較小,景深就出來了 ^^
Dsc 0480
前一陣子拍了很多螳螂,這個是已經孵化的螳螂卵鞘。
Dsc 0488
國小課本裡面,團結力量大的故事,活生生地在眼前阿 ...
Dsc 0513
有看出什麼嗎?
Dsc 0516
換個方向,擺個銅板當比例尺,好 ... 好大的蛾幼蟲嗎?!
Dsc 0528
往新山的路,不是很好走,應該說 ... 很難走。很久沒出來運動了,有點吃力說!如果要來這邊把妹,在夢湖玩玩就好了,千萬不要上新山,會被打。
不過山頂上,風景不錯的啦 ^^
Dsc 0531
Bobby 說想到對面拍照,還 ... 真娘阿 XD
Dsc 0534
好像很高,很可怕的樣子?!
Dsc 0538
擺點有男子漢的架式吧!!
Dsc 0545
到底 ... 到底會不會阿,丟石頭過去喔!!
Dsc 0558
如果空氣很清新的話,視野應該是不錯的啦!
Dsc 0567
中午了,又餓又累,趕快趁著還有體力下山。回到夢湖的時候,涼亭有很多歐巴桑,給了我們很多水果喔,真開心 ^^
Dsc 0569
今天的午餐就是水果大餐啦(旁邊的紅螞蟻已經衝上來了@@)!!
Dsc 0577
吃完水果大餐後,由於天氣熱到讓人想吃冰,就 ... 殺去永康街的冰館吃芒果冰了。奇怪的是,都沒有看到 Bobby 跟上來,等我吃完要回家實在永康街遇到他,原來他 ... 把車鑰匙鎖在機車置物箱裡面 XD
究竟是如何拿出來的,請他自己解釋吧 ...

星期二, 6月 19, 2007

微距景深完全解決方案

微距攝影最另人困擾的就是景深太淺的問題,一般都需要敗個環閃之類的閃燈來解決這樣的問題。Nikon 的 R1C1 應該是不少人夢寐以求得裝備,不過一套也要兩萬多,且兩支 SB200 和一支 SU800 與鏡頭和相機的組合,重量也不輕阿 ...
在一般的狀況下,通常都把對焦點放在昆蟲的眼睛,視天氣的狀況,即使把光圈縮到 f8.0,景深還是淺到後腳都模糊了。

今天跟學弟借了一支神奇的 LED 燈補光,讓我可以把光圈縮到 f13,乍看之下整隻都很清楚!看來我也該去買兩個裝在 105 的遮光罩上面,不管是重量還是價錢,怎麼算也比 R1C1 划得來阿 ^^


蝗蟲與蟬的邂逅

這其實是滿有趣的畫面,蝗蟲正在大啖午餐,而它的午餐上面,剛好有一個蟬殼。
我把它想像成,蝗蟲與蟬相約在此浪跡天涯,然而蝗蟲遲到蟬羽化成仙不等它,留下悔恨莫及的蝗蟲,暴飲暴食填補空虛的心靈阿 ...


天然的眼影

女生畫眼影,有時候是為了讓天生的小眼睛看起來比較大,比較有神。然而恆春小灰蝶則是為了避免受到天敵致命的一擊,下翅末端有欺敵用的假眼紋和長尾突,你有被它騙過去嗎?


星期日, 6月 17, 2007

紅腹細蟌

豆娘有好幾種,話說這種在我的印象中,常常出現在以前小學的小池塘邊,每當下課的時候都會去抓來玩,不過由於被媽媽告誡不可以殺生,所以長大後才「從良」改用相機捕捉它美麗的身影 ^^


萬綠叢中一點紅

有人知道這隻全身紅通通的瓢蟲是哪一個種類?
手邊的圖鑑都沒有類似的阿!


星期六, 6月 16, 2007

早起的熊兒依舊有花拍

除了旅遊外,第一次沒有在當天把照片整理完 ...
昨天早上天氣非常好,五點多又去了臺大的安康試驗農場拍荷花,可能由於天氣異常的好,一大早就聚集了許多拍荷花的人。

與前一次下大雨的狀況不同,今天的花統統都有陽光的加持,顯得格外的亮眼。

一前一後,相互呼應。

荷花田旁邊是稻田,順便自拍一下 ^^

氣溫漸漸地上升了,花朵上都沒有露水,旁邊的老伯一直在噴水哩。

如同上次提到,這裡的花真的很好拍,難怪一大早就聚集了超多同好。

覺得拍荷花還是要留枝葉比較好看,只拍一朵大大的花而沒有其他東西陪襯,反而就沒有那麼美。

所以我都喜歡在裡面多放一個「配角」。

放眼望去,都是盛開的荷花 ...

且大部份的花形都還滿好看的,不用卡位搶拍。

剛好,小蜜蜂也來當荷花的配角。

開花,花謝,強烈的對比阿。

利用右邊葉子的邊緣,製造出一點點朦朧的感覺 ...

挺直的,有出淤泥而不染的感覺!

相同的話,橫的與直的,感覺迥然不同!

穿過殘破的荷葉而盛開 ...

換另一個角度,有沒有感覺花是長在葉子上?

已經過了黃金時間,陽光普照,開始熱得要命,我只拍了一個小時,趕緊收拾收拾,準備上班囉!


1^LIBraBBGvB8i 是啥鬼阿 XD

本來星期五是一個星期當中最爽的一天,但是為了 1^LIBraBBGvB8i 整到賽到,故事是這樣的:
昨天下午幫 Bobby 慶生(現在離昨天也才過了 18 分鐘 @@),吃吃喝喝,講完成語接龍後我繼續搞定 Mail Server,當中還陪小咪玩耍一下,整個作業流程到設定完 MRTG 後,差不多就可以告一段落了,檢視 MRTG 圖表後發現,網頁的左上角有一串 1^LIBraBBGvB8i 開頭的奇怪符號,想說我是不是設定錯誤,頭昏眼花貼了什麼鬼字串到網頁裡,檢查了半天,什麼也沒發現。依照我的慣例應該要追根究底徹查清楚,但是已經晚上八點多,不想再跟它耗下去,於是整個 MRTG 的設定過程再重新來過,但結果還是一樣 @@
已經接近沒有思考能力的狀態,想說就只是一堆鬼串,應該還好,於是收拾書包,準備回家,下樓時 Bobby 還在辦公室,順道請他幫我看看用他的電腦瀏覽有沒有問題,結果還是一樣,且每一頁的網頁都是一樣的狀況,然而檢查網頁內容,卻都沒有發現那鬼字串,開始懷疑是不是 Apache 出了問題 ...
翻翻 log 也沒有什麼異狀,Server 該不會被黑了吧?
看看學校其他的網站,連我的碩士論文系統也遭殃:

Exchange 的 Web 也掛彩:

MyTMU 也難逃一劫:

學校的門面也被蹂躪:

見鬼了,難道學校所有的機器都被黑?同時駭掉 Linux, Windows, Apache, IIS,也會免太厲害了吧?
然而從 Server 的 tcpdump 和流量管控系統都查不出所以然,最後一招問問 Google 吧!發現有非常多了人遇到這樣的問題,但是從第一頁翻到最後,也沒看到有解答!頂多就是抓到某人中毒,經處理已解決,沒有什麼建設性的解決方案 XD
正當一籌莫展之際,發現用有線網路瀏覽網頁會出現那鬼字串,但是用無線網路卻不會 @@
難道是同一個網段有人中毒、中木馬?
Google 搜尋的結果,有人說是 IE7 的問題,但是我用 MacOSX + Firefox 和 Safari 也都會有同樣的狀況,這 ... 到底是啥鬼阿?!
接著 Bobby 嘗試從 Client 端用 tcpdump 端抓 Server 傳過來的封包,但是卻發現一堆 arp-reply ......
突然靈光一現(晚上吃飯時出現過的成語),他聯想到原因可能是有人一直宣稱他是 10.1.1.254(Gateway),於是開始找 Gateway 的 Mac Address,由自己的電腦上看到的(紅色框框):

接著去 Switch 上面看,發現 Gateway 的 Mac Address 不是那組(抓到了喔!)。
繼續找那組假 Gateway 的 Mac Address 是接在 Switch 的哪個 Port 上,找到 Port 後,繼續找網點,由於看不懂當初大樓的施工平面圖,索性一個個網孔慢慢找,還好學校小,馬上就找到了,拔掉那臺出問題電腦的網路線後,再檢查一下 arp table,真正的 Gateway 出現了(綠色框框)。

雖然不是 Server 被黑,但也夠嗆的了,比較嚴重的是,最近有在 4F, 5F 用有線網路的上網的人,因為所有的連線全部都先經過那臺有問題的電腦,資料如果沒有加密,應該都可能被看光光了,因此建議大家趕快把密碼都改改吧 XD

本來好好地過一個愉快的小週末,卻被這鬼字串糟蹋了,不過還好有那亂亂的字串出現,不然也很難發現出了問題。想必這是 Bobby 最難忘的生日吧?

PS: 我今天本來可以早回家的,為了陪 Bobby 過生日,結果跟他一起共患難,不知道他有沒有感動得痛哭流涕?(嘿嘿,又是一句成語)

Happy Birthday 啦!!