2011-11-25 32 views
1

我需要使自定義正則表達式模式時,我有以下映射(例如)匹配的URL:我需要使自定義正則表達式模式爲這在PrettyFaces

<url-mapping id="approvedQuestions"> 
    <pattern>/questions/approved/#{viewOption}/</pattern> 
    <view-id>/approved.xhtml</view-id> 
</url-mapping> 

其中viewoption部當用戶不用'/'結束URL時也應該匹配? 如果根本不添加viewOption部分,是否可以提供某種默認值?

如果我viewOption是一個枚舉,是否可以小寫參數?現在我必須寫入大寫字母才能使其工作。

回答

3

您可以使用自定義正則表達式來執行此類型的操作,但我建議使用url-rewrite規則在缺失的情況下附加一個尾部斜線。你應該選擇一個URL(最後有或沒有'/'),否則你實際上提供了兩個不同地址的相同資源,你將受到搜索引擎和其他爬蟲的懲罰。

要做到這一點,我會用一個重寫規則如下所示:

<rewrite match="https://stackoverflow.com/questions/approved/[^/]+" trailingSlash="append" /> 

這將導致服務器當一個「/」從URL的末尾丟失的檢測,它會將請求重定向到適當的位置,最後用'/'。

爲了解決您的枚舉問題,這有點複雜。我們通常不推薦將值直接綁定到枚舉上。在這種情況下,你實際上並沒有綁定到一個枚舉(我在猜測),但實際上是將字符串URL值綁定到請求作用域的EL上下文中。這個值然後在你的應用程序的其他地方被提取出來,這就是ENUM轉換的地方。

直到PrettyFaces 4出來的時候,我建議,而不是綁定值轉換成字符串的位置,然後使用操作方法做正確的值自己的負荷,就像這樣:

<url-mapping id="approvedQuestions"> 
    <pattern>/questions/approved/#{params.viewOption}/</pattern> 
    <view-id>/approved.xhtml</view-id> 
    <action>#{params.loadViewOption}</action> 
</url-mapping> 

如果你想嘗試使用更高級的URL重寫工具,也可以使用OCPsoft的「重寫」(http://ocpsoft.com/rewrite/),這是一個基於Java的URL重寫工具,但沒有與JSF集成太多。

PrettyFaces 4將基於重寫作爲核心,此時,您當前使用的所有功能也將具備更多類似功能,如果我沒有弄錯,這就是您想要的功能:

.addRule(Join.path("https://stackoverflow.com/questions/approved/{viewOption}").to("/approved.xhtml") 
.where("viewOption") 
.matches("[^/]+/?") 
.transformedBy(TrailingSlash.append()) 
.transformedBy(To.upperCase()) 

你會需要,因爲他們沒有在庫中定義還沒有創建自己的變壓器,但這是一般的想法。它比PrettyFaces目前的功能強大得多,但不提供相同的JSF導航集成,並且配置有點麻煩。

我希望這有助於 〜林肯

+0

感謝您的時間和精力寫這:)偉大的答案! – LuckyLuke

+0

謝謝:)很高興幫助。 – Lincoln