2010-07-27 35 views
4

我有一個簡單的login.xhtml facelet,其中包含一個用戶名和密碼輸入和一個命令按鈕。該命令按鈕只有一個action="welcome"結果,它顯示welcome.xhtml facelet。當我導航時,JSF生命週期是否重新應用到結果Facelet?

我對JSF很陌生。在閱讀JSF生命週期時,當我點擊按鈕時,調用應用程序li​​fecyle將處理導航並呈現(??)welcome.xhtml。如果welcome.xhtml將啓動一個新的Facelet生命週期,我仍然感到困惑。

PS:我注意到url不會改成welcome.xhtml。 jsf生命週期是否綁定了請求?

回答

3

是的,JSF生命週期是請求限制的。是的,結果將默認呈現在相同的請求中。

這是混淆了你的關鍵是有可能「向前」與在HTTP Servlet請求的術語「重定向」。

JSF默認將請求轉發到目標頁面。如果你知道Servlet API的話,你會明白它是那麼抽油煙機執行以下操作下:

request.getRequestDispatcher("welcome.xhtml").forward(request, response); 

這樣的目標頁面可以訪問相同請求對象。如果目標頁面與提交表單的頁面不同(實際上爲login.xhtml),則不會在瀏覽器地址欄中看到更改。

但是,您可以配置JSF通過添加<redirect/>導航的情況下將請求重定向到目標頁面,或者在bean的操作方法調用ExternalContext#redirect(),或在一個不錯的JSF 2.0的方式加入faces-redirect=true參數按鈕的操作:

<h:commandButton value="login" action="welcome?faces-redirect=true" /> 

無論哪種方式,它是在做Servlet API的條款如下:

response.sendRedirect("welcome.xhtml"); 

基本上指示客戶端觸發一個全新的GET請求TH e給定位置。請注意,這樣,初始請求的任何請求和視圖範圍的bean都將被丟棄並重新創建。

+0

但是,如果welcome.xhtml從未顯示過,並且jsf需要爲歡迎facelet執行還原視圖生命週期?如果是這樣,是否需要啓動差異生命週期? – robinmag 2010-07-27 16:54:47

+1

無論是否存在視圖,都會調用恢復視圖階段。如果沒有,那麼JSF將在這個階段創建一個新的。儘管針對JSF 1.2,但下面的文章也適用於JSF 2.0,您可能會發現它很有用:[Debug JSF生命週期](http://balusc.blogspot.com/2006/09/debug-jsf-lifecycle.html) 。 – BalusC 2010-07-27 16:56:30

+0

謝謝! ... – robinmag 2010-07-27 17:07:54

相關問題