Friendly URLs in Tapestry

    在早一點的版本里面Tapestry並沒有採用幽雅的格式來產生URLs。這種格式的URLs帶來了不少的問題。比方說,因爲整個連接都是圍繞一個servlet構造的,所以勢必會使基於路徑的申明式J2EE安全機制不能使用。再比方說,依靠參數來區分頁面,就會使搜索引擎只能看到應用程序的極小的一部分頁面。
    從4.0 版開始,框架自身已經直接支持友好的URLs格式。通過以下兩種操作Tapestry直接支持友好URLs。一是把保存在參數裏的部分信息轉移到URL路徑裏面去,一是通過解析路徑重新獲取之前經過編碼的信息。
    比方說,不友好的URL“/app?page=news/Thread&servcie=page”就可以轉化爲如下形式的友好URL“/news/Threads.html”。上例中查詢參數page=news/Thread變成了URL的一部分news/Thread,另外一個參數service=page變成了URL的一個擴展.html。
    理解友好URLs首先需要理解Tapestry的工作原理。每一個傳入Tapestry的請求都會由框架分派到特定的服務完成。在分派的過程中引擎需要能夠明確調用哪一個服務,這就需要URL中包含服務的信息。另外絕大多數服務在進行特定處理的過程中也需要至少知道所要處理的對象。比如上例中的page服務就要知道它處理的是哪一個頁面。如果把這些信息放在參數裏面整個實現會很直接也容易理解,但是產生出來的URL格式就會很難看也很難被其它系統使用。如果我們來換一種方式,用URL的路徑和擴展名來保存信息就不會有如上的問題,而且也不會造成信息的缺失。所以,用路徑和擴展名來保存這些框架必須的基本信息就再合適不過了。另外,把應用程序中需要使用的數據仍然放在參數中。這樣構造的URLs和傳統形式的URLs就保持一致了,不論是對於用戶還是其它系統都可以很容易的理解URL了。
    要使用友好URLs,必須在web.xml和HiveMind模塊描述符裏面做一定配置。主要目的一個是使servlet容器或應用服務器能識別傳入的URL,一個是使Tapestry框架能很好的編碼和解析URL。
    下面我們從編碼和解碼兩個角度來分析友好URLs在Tapestry中是如何實現的。
    在這之前首先介紹一下ServiceEncoder這個接口。這個接口只有兩個函數,一個用戶編碼,一個用於解碼。這個接口就是Tapestry框架爲不同的服務提供的統一的編碼接口。不同的服務可以實現不同的編碼策略,用戶也可以自己定義需要的編碼策略。框架已經預定好了page,direct,asset,extension這四種編碼的策略,對於普通的應用已經足夠使用了。
編碼
    編碼的過程首先從特定服務的getLink()方法被調用開始。在這個方法裏面服務會構造特定的參數格式以配合指定的ServiceEncoder工作,並調用LinkFactory的constructLink()方法生成一個ILink對象。LinkFactory是一個生成ILink的工廠類,在默認的實現裏,它會進一步對參數進行處理(不涉及到編碼,只處理參數的實際內容),然後逐個調用ServiceEncoder進行編碼,最後會生成一個實現了Ilink接口的EngineServiceLink對象返回。在調用ServiceEncoder進行編碼的過程中並不是所有的ServiceEncoder都會被調用,只有滿足預先定義格式的ServiceEncoder纔會做處理,並且當某一個ServiceEncoder發現傳入參數符合自己的格式時不會再調用剩下的ServiceEncoder。所以ServiceEncoder的組織順序也很重要。到此ILink對象就已經構造完成。如果調用需要獲取URLs串,只需要調用ILink的getURL()方法即可。這個方法會將ServiceEncoder編碼得到的結果和其它還沒有被編碼的參數一起構造在URL串中。需要注意的是ServiceEncoder只編碼URL的路徑,而對於其它應用程序中使用的參數(比如說由DirectLink組件的parameter參數指定的數據)ServiceEncoder是不會對其進行處理的。
解碼
    對URL的解碼過程必須要實際調用特定服務執行具體工作之前完成。在IEngine(Tapestry的引擎接口)的默認實現裏面會調用RequestCycleFactory來生成一個新的IRequestCycle(Tapestry的很多工作都要經過它)。在這個過程中RequestCycleFactory的默認實現會調用LinkFactory裏的所有ServiceEncoder進行解碼工作。調用的順序和編碼時一樣,與順序和格式有關。在之後IEngine就擁有足夠的信息來選擇合適的服務進行接下來的工作。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章