2011年4月13日

Groovlets出現404 error錯誤訊息

測試的環境是:
Groovy 1.7.10
Tomcat 6.0.32

Groovlets是Groovy內建的Servlet功能,可以用Groovy Script直接開發動態網頁程式。

但目前的版本有個致命的陷阱,發生的情況是:

在 index.groovy 網頁程式(Groovlet)使用以下的語法
import my.webapp.utils.Helper
def helper = new Helper()

其中 my.webapp.utils.Helper 是 Groovy 撰寫的類別(檔名為Helper.groovy),但已經透過groovyc編譯成.class放在WEB-INF/classes 目錄下。

在大多數情況下,這樣用是沒問題的,因為Helper本身已經是經過編譯的class檔,所以不管用Groovy或Java寫應該都要一樣才對。所以當我的Helper程式碼已經改用Groovy撰寫,也累積超過500行,結果就掉入了這個陷阱,必須重新以Java改寫才能順利解決。

第一次用瀏覽器打開 index.groovy 是沒問題的,但重新整理之後,就開始不斷出現 404 error。

追蹤Groovy的程式碼,發現問題就在其中 AbstractHttpServlet 類別的 getResourceConnection() 函式,這個函式的定義是給 GroovyScriptEngine 呼叫使用。所以當網頁被打開,需要解析 index.groovy 的時候,GroovyServlet會透過Servlet Context取得網頁程式的路徑,再產生Groovy程式檔案的路徑,但其妙的是 Helper.groovy 也會被 getResourceConnection() 拿去解析,由於這是一個已經編譯、放在classes目錄下的類別,所以就會造成無法正確找到檔案,拋出ResourceException,最後就形成404 error。

已將這個問題丟到Groovy論壇,希望能順利解決,暫時解決的方法就是自己開發的library盡量用Java寫。

如果要用Groovy開發網站,看來Grails才是最好的選擇,因為在Grails下,幾乎各種程式(Controller/View/Model/Script/TagLib/Class)都能用Groovy打造,Grails在整合的部分應該下了不少工夫。只是目前手邊的專案,仍有停留在傳統J2EE架構,只能搭配Groovy簡化開發工作,但遇到的問題其實還不少。

沒有留言:

張貼留言

lyhcode by lyhcode
歡迎轉載,請務必註明出處!