在試圖提議拉維實施解決方案,有以下幾個問題:
我的應用程序嚴重利用JSF模板(通過ui:組合),所以下面的答案不會直接工作。但解決方法是使用ui:param標籤,它確實有效。因此,我增加了以下內容索引和簡介頁:
<!-- this is in my intro.xhtml page -->
<ui:composition template="templates/header-public.xhtml">
<ui:param name="landingvia" value="intro"/>
頭中具有-public.xhtml中的index.xhtml頁面類似線
<ui:param name="landingvia" value="index"/>
然後頁面我需要根據Ravi更改鏈接(從內存中執行此操作),但您明白了。請注意,我需要使用「landingvia」而不是「param.landingvia」,可能是因爲這種temp持。
<h:commandLink value="Home" outcome="/intro" rendered="#{landingvia == 'intro'}" ><f:param name="landingvia" value="intro" /> </h:commandLink
<h:commandLink value="Home" outcome="/index" rendered="#{landingvia == 'index'}" ><f:param name="landingvia" value="index" /> </h:commandLink
<h:commandLink value="About" outcome="/about" rendered="#{landingvia == 'intro'}" ><f:param name="landingvia" value="intro" /> </h:commandLink
<h:commandLink value="About" outcome="/about" rendered="#{landingvia == 'index'}" ><f:param name="landingvia" value="index" /> </h:commandLink
...我需要做同樣重複所有頁眉和頁腳(其中有其他鏈接)的聯繫(聯繫我們,常見問題解答等)所包含的模板和對於圖片鏈接(標識等)以及從常見問題解答到termsAndConditions.xhtml的鏈接...不是一個好的解決方案。
如果我沒有將f:param標記添加到上面的所有commandLink中,那麼狀態是'lost',這是有道理的。當我從介紹轉到關於時,關於頁面如何跟蹤沒有f:param標記的登錄頁面?
更糟糕的是,從任何頁面到任何頁面的所有鏈接都需要遵循這種模式。所以這不是一個好的解決方案,除非我做的事情非常錯誤。
作爲最後一個問題,我發現即使所有的鏈接都重複如上,解決方案仍然不會工作,因爲當有直接的表單(這些表單發送form.submit()回到自己)無論如何,狀態都會丟失。
在這一點上,我將只管理服務器端的狀態。所以我可以使用我的用戶會話bean或設置會話cookie。
一旦我把一個值是(「指數」或「介紹」)到會話(通過Cookie或會話bean)我可以查詢所有URL在ServletFilter中,如果它的目的地是「/指數」或「/」或「/index.xhtml」,那麼我將使用會話變量。如果它包含值「intro」,我將發送用戶到/intro.xhtml。
我不知道除了大量工作以外如何去做。但上面的解決方案運行良好,沒有任何鏈接的變化,並且它具有可擴展到我需要的多個未來着陸頁的額外好處。讓我知道你的想法和拉維請讓我知道如果我沒有得到你的解決方案。
無論是否有人登錄,會話都始終啓動。 – BillR 2012-08-12 18:21:40
@BillR:*總是*?你錯了。它只會在第一次構建視圖或會話作用域管理bean時創建,並且/或者第一次請求帶有''的頁面(而狀態保存方法設置爲服務器時)。 –
BalusC
2012-08-12 23:45:47
我相信規範說任何時候服務器狀態需要跟蹤都會創建一個會話。因此,任何超出最瑣碎的事情都需要一個會議。基本上對於JSF來說幾乎任何事情都需要一個會話。如果一個人做了一些微不足道的事情,他們將不會使用JSF。 – BillR 2012-08-13 15:48:36