2011年4月11日

UrlRewriteFilter 讓JavaEE Web Application也有漂亮的短網址

漂亮的短網址可是現代網站必備的一項功能,特別是使用MVC Framework打造的Web Application,幾乎清一色採用Controller/Action的網址格式。
http://yourhost/controller/action/id

於是以前那種長串的網址格式,像是:
http://yourhost/blog/article.php?id=1234

就可以縮短成簡潔的:
http://yourhost/blog/article/1234

雖然這不影響瀏覽者對網站的操作功能,但簡潔的網址,對使用者和搜尋引擎更友善。

在AMP(Apache+MySQL+PHP)平台, 實現這種短網址最常用的方法就是設定Apache的mod_rewrite。優秀的PHP開發框架,例如CodeIgniter,就可以簡單地設定mod_rewrite(只要設定在網站目錄的.htaccess檔案),就能讓漂亮的短網址可以運作。

雖然使用mod_rewrite讓網址格式更好看的做法,早已行之有年,但是在Ruby on Rails等MVC框架提倡CoC(convention over configuration)的概念後,讓預設的網址能夠對應到Controller設計的架構,變成採用普遍的一種網址架構方式。例如 blog/article/123 這段網址,CoC讓我們很直覺就知道網站存在 blog 這個控制器(controller,通常以class實現),並提供處理 article 這個動作的方法(method)或函式(function),以及123是id這個參數的值。

所以短網址不僅對使用者和搜尋引擎更友善,在開發階段,預設格式的短網址也讓開發更方便,少了許多設定的麻煩。

可是在傳統的JavaEE應用程式中,雖然最常用的Tomcat伺服器也是Apache出品,但它可不提供mod_rewrite的功能。

為什麼Tomcat不需要提供mod_rewrite呢?

JavaEE應用程式本身除了能寫類似PHP的JSP網頁程式,還可以實作Servlet、Filter。一般來說Servlet就可以扮演控制器的角色,而建立Filter可以幫其他Servlet進行網址格式的轉換。所以,並不需要由Tomcat提供這項功能。

在Java的開發框架,例如Struts,就是以*.do作為網址格式,只要URL以.do結尾,就會自動對映到某個Struts Action類別(它扮演的其實是controller角色)。

只是JavaEE過去一直沒有輕巧好用的框架,那些功能強大的開發框架,如果拿來開發小應用,可能設定的數量都比實際程式碼還要多!

所以,很多JavaEE專案, 並沒有套用網址格式受到良好定義的框架。有很多JavaEE網站為了方便開發,可能也捨棄用Servlet當Controller、JSP當View的邏輯介面分離架構,直接以JSP Scriptlets打造網站。

因此有大量JavaEE網站的網址格式,都是以下這種不友善網址格式。
http://yourhost/blog/article.jsp?id=1234

對於既有的專案,其實可以透過 UrlRewriteFilter 這個已經寫好的Filter,將網址進行簡化。目前最新穩定版本為3.2,可以在這邊下載

官方提供的這份說明很簡短,但也足夠瞭解安裝與設定方式,因為UrlRewriteFilter很簡單易用。

將下載的檔案解壓縮到網站專案的WEB-INF目錄下,會建立 lib/urlrewrite-3.2.0.jar 及 urlrewrite.xml 兩個檔案。接著要自己打開 web.xml 設定檔,加入 Filter 設定。

接下來,打開 urlrewrite.xml 增加自己定義的網址規則。

上面的範例,兩個rule其實定義是一樣的,只是一個採用regex(regular expression)方式解析來源網址,可以定義比較複雜的格式;另一種則是比較簡單的wildcard,則是可以用於簡單的格式。在to的設定中,type可以是forward(在伺服器端轉址)、redirect(在瀏覽器端轉址)等。

定義rule之後,打開from定義格式的網址,就會自動轉址到to定義的目標網址。但網頁應用程是本身產生的連結,也要配合做修改才行。但是若我們將.jsp變成.g、.do或沒有副檔名的網址格式,以後又要修改成其他的格式,網頁程式是不是也要配合再改呢?其實UrlRewriteFilter早已考慮到這一點,所以除了設定rule外,還可以用outbound-rule設定網頁程式產生的連結格式。

有了上面的outbound-rule定義之後,以下在Servlet或JSP程式中,採用encodeURL方法進行編碼的網址,就會透過UrlRewriteFilter重新改寫。

UrlRewriteFilter很簡單也很管用,對於舊的JavaEE網站系統,可以透過這種方式把網址改頭換面一下,好變成現代網站應該有的樣子。

如果是正要開始規畫的新網站,其實有更好的選擇:
Grails具備類似RoR等MVC框架應有的特色,除了預設就採用簡潔的網址格式,還可以自訂彈性的網址路由,而底層採用Spring/Hibernate等穩固、廣泛採用的基礎,寫Groovy程式碼和Java並不會差太多,也讓Java程式設計師不太會有轉換期的痛苦。
而對於願意接受新程式語言的開發團隊,Lift將會是一個更棒的選擇,它採用的Scala程式語言,是個在Java世界很有潛力的新語言,而Lift本身對Comet的完善支援,更讓它有機會成為明日之星。

沒有留言:

張貼留言

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