2012-08-12 45 views
0

我有一個JSF 2.0(或4.0 RichFaces的)應用程序,我想要做的東西,似乎很簡單。JSF 2.0多個目標網頁

我有一個登陸頁面(/index.xhtml),這是「歡迎頁面」這是出現在當有人類型「www.xxx.com」用xxx爲我的域名。

  1. 我想要一個替代登錄頁面,它將成爲我們正在運行的廣告的目標。由於我要高度自定義此內容,因此我將採用這種方式,只是有一個新頁面:www.xxx.com/intro.xhtml。到現在爲止還挺好。 我的索引頁index.xhtml(及其副本intro.xhtml)有一堆鏈接的公共頁面:「它是如何工作的」,「註冊」等...非常典型的東西。
  2. 的問題是如何將我保留或跟蹤目標用戶通過intro.xhtml進入我的網站的事實,當進入「它如何工作」,然後回到主頁?

使用的情況下,這將是一個問題是:

  • 用戶通過廣告來的,他們是在與定製內容intro.xhtml。
  • 他們去到一個共享的主頁(「它是如何工作」)。
  • 然後他們單擊主頁(或網站圖標)回到家裏。截至目前,他們回到歡迎頁面(index.xhtml),這將讓他們感到困惑。

所有我能想到的是:

  • 我可以讓我的所有其他公共網頁的「深拷貝」(例如how_it_works複製到how_it_works_intro),然後讓_intro頁面鏈接回當有人從那裏選擇回家的時候intro.xhtml頁面,但這看起來真的很愚蠢。
  • 在servlet過濾器中對請求進行一些後處理(例如,當用戶最初訪問intro.xhtml時設置會話變量),並在用戶點擊home時使用此事實將它們路由回intro.xhtml。但是這似乎是一個糟糕的主意,因爲我不想在登錄之前開始會話。它還可以避免將所有頁面流保存在faces-config.xml中,這是我迄今爲止爲整個應用程序所做的。
+0

無論是否有人登錄,會話都始終啓動。 – BillR 2012-08-12 18:21:40

+2

@BillR:*總是*?你錯了。它只會在第一次構建視圖或會話作用域管理bean時創建,並且/或者第一次請求帶有''的頁面(而狀態保存方法設置爲服務器時)。 – BalusC 2012-08-12 23:45:47

+0

我相信規範說任何時候服務器狀態需要跟蹤都會創建一個會話。因此,任何超出最瑣碎的事情都需要一個會議。基本上對於JSF來說幾乎任何事情都需要一個會話。如果一個人做了一些微不足道的事情,他們將不會使用JSF。 – BillR 2012-08-13 15:48:36

回答

0

這通常是通過添加一些參數的查詢字符串來實現的。例如:

從你intro.xhtml,這些參數追加到「它是如何工作頁面」像這樣:

<h:link value="How it works" outcome="howitworks" includeViewParams="true"> 
    <f:param name="landingvia" value="intro"/> 
</h:link> 

然後在你的howitworks.xhtml呈現這樣的主頁鏈接:

<h:link value="Home" outcome="intro" rendered="#{param.landingvia == 'intro'}" /> 
<h:link value="Home" outcome="index" rendered="#{param.landingvia == 'index'}" /> 
+0

我今晚肯定會試試這個 - 我還沒有在JSF中使用get參數(在JSP和servlet中多次使用它們)。我會閱讀並發表回覆。謝謝! – 2012-08-13 21:14:05

+0

好吧,昨晚試了這個(幾個小時),結果證明這對於任何不平凡的應用來說都不是一個好的解決方案,或者我沒有做正確的事情。在這一點上,任何一個都可能是正確的。我將在下面的問題上進一步討論。 – 2012-08-14 14:16:22

0

在試圖提議拉維實施解決方案,有以下幾個問題:

  1. 我的應用程序嚴重利用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"/> 
  1. 然後頁面我需要根據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的鏈接...不是一個好的解決方案。

  2. 如果我沒有將f:param標記添加到上面的所有commandLink中,那麼狀態是'lost',這是有道理的。當我從介紹轉到關於時,關於頁面如何跟蹤沒有f:param標記的登錄頁面?

  3. 更糟糕的是,從任何頁面到任何頁面的所有鏈接都需要遵循這種模式。所以這不是一個好的解決方案,除非我做的事情非常錯誤。

  4. 作爲最後一個問題,我發現即使所有的鏈接都重複如上,解決方案仍然不會工作,因爲當有直接的表單(這些表單發送form.submit()回到自己)無論如何,狀態都會丟失。

在這一點上,我將只管理服務器端的狀態。所以我可以使用我的用戶會話bean或設置會話cookie。

  • 無論如何,我在我的主頁上創建會話級別「用戶」對象。因此,我可以使用由剛剛從intro.xhtml

    #{userBean.setLandingPage('intro') 
    
  • 電話或設置從任一頁面的cookie。

一旦我把一個值是(「指數」或「介紹」)到會話(通過Cookie或會話bean)我可以查詢所有URL在ServletFilter中,如果它的目的地是「/指數」或「/」或「/index.xhtml」,那麼我將使用會話變量。如果它包含值「intro」,我將發送用戶到/intro.xhtml。

我不知道除了大量工作以外如何去做。但上面的解決方案運行良好,沒有任何鏈接的變化,並且它具有可擴展到我需要的多個未來着陸頁的額外好處。讓我知道你的想法和拉維請讓我知道如果我沒有得到你的解決方案。

0

好吧,我<認爲>我完全釘了它,想出了一個優雅的解決方案。對於那些在JSF方面的專家來說這可能是顯而易見的,但我絕對不是(我更像是後端Java EE程序員)

這就是我所做的。

  1. 將一個landingPage屬性添加到我的userBean(我的用戶會話bean)中。如上所述,我不在乎我是在我的主頁上開始一個會話,因爲無論如何我都會這樣做。
  2. 在我的所有着陸頁面中,我添加了帶有指向頁面本身的相應URI的follwing。在這種情況下/ index會自動解析到索引頁面。 中的index.xhtml補充說:

    #{userBean.setLandingPage('/index')} 
    

在intro.xhtml補充說:

 #{userBean.setLandingPage('/intro')} 
  1. 然後,所有我需要做的就是在我的JSF頁面引用調整所有引用會話值。所以在我的header.xhtml我改變這一切

    <h:commandLink class="active" action="/index">home</h:commandLink> 
    

    <h:commandLink class="active" action="#{userBean.getLandingPage}">home</h:commandLink> 
    
  2. 只有主頁引用需要改變,沒有其他環節需要改變

  3. 這也將是真正容易添加額外的登陸頁面和有狀態的行爲。

我很滿意這個解決方案。感謝大家!

+0

看起來不錯Paul,您也可能想使用而不是來增加書籤功能。另見[when-should-i-use-houtputlink-instead-of-hcommandlink](http://stackoverflow.com/questions/4317684/when-should-i-use-houtputlink-instead-of-hcommandlink) – Ravi 2012-08-15 14:46:24

+0

謝謝Ravi--我一定會看看h:link vs h:commandLink的問題。我實際上正在考慮爲PrettyFaces解決方案(http://ocpsoft.org/prettyfaces/)尋求解決方案,我不確定是否無需更改h:commandLink標籤。 – 2012-08-15 20:29:36