2011-05-16 51 views
2

我在我的index.xhtml JSF首頁有一個下拉菜單。相關的代碼/的commandButton看起來是這樣的:java最有效的JSF 1.2導航

<h:selectOneMenu id="nodes" value="#{MyBacking.chosenNode}"> 
    <f:selectItems value="#{MyBacking.nodes}" /> 
</h:selectOneMenu> 

<a4j:commandButton value="Retrieve" styleClass="ctrlBtn" 
    id="retrieveBtn" style="margin-bottom: 2px;" 
    onclick="#{rich:component('nodeLoadWait')}.show()" # modal 
    action="#{MyBacking.redirect}" 
    image="/img/btnRetrieve26.png" /> 

action設置爲 '你好' 以前,在我faces-context.xml

<navigation-rule> 
    <from-view-id>/index.xhtml</from-view-id> 
    <navigation-case> 
     <from-outcome>hello</from-outcome> 
     <to-view-id>/nodeMgmt.xhtml</to-view-id> 
    </navigation-case> 
</navigation-rule> 

action設置爲 '你好',點擊retrieve按鈕工作確定在那個面孔將處理導航和MyBacking.setChosenNode方法將分配所有必要的數據,以便nodeMgmt.xhtml的內容將顯示完全填充。

但是,如果用戶點擊retrieve超時引起的初始活動,即使bean檢測到超時,網頁也會掛起,我想將用戶重定向到「超時」頁面。

爲了處理返回超時消息的支持bean(當應用程序'內部'時已經存在錯誤檢測),我認爲不是使用faces-context.xml文件,而是在內部處理它。

我發現了FacesContext.getCurrentInstance()。getExternalContext()。重定向,但JSF 1.2 javadoc沒有這個功能。也許是因爲它沒有特色?它重定向雖然是令人困惑的。爲什麼沒有這個方法的文檔?

儘管如此,它會將我重定向到頁面,但在初始請求期間不考慮bean實例化的數據而進行渲染。該bean當前處於請求範圍內。豆中的相關代碼是

try { 
     FacesContext.getCurrentInstance().getExternalContext().redirect("nodeMgmt.jsf"); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

是使用後端java調用做這種重定向的最好方法嗎? 如果不是,最好使用faces-context.xml?如果是這樣,怎麼樣? 雖然我們在這裏 - 任何人都可以指導我一個很好的閱讀資源FacesContext.getCurrentInstance()。getExternalContext()用法,它有關於如何使用數據進行簡單導航的體面示例因爲我無法定位一個。

乾杯

回答

2

我發現FacesContext.getCurrentInstance()。getExternalContext()。重定向但JSF 1.2的javadoc不具備此。也許是因爲它沒有特色?它重定向雖然是令人困惑的。爲什麼沒有這個方法的文檔?

當然有。

也許你正在讀錯的javadoc。或許是FacesContext之一?


儘管如此,它重定向我的頁面,但沒有呈現初始請求時考慮到由bean實例化的數據。該bean當前處於請求範圍內。

重定向指示瀏覽器觸發全新的HTTP請求。因此,舊請求中的所有請求範圍的bean都將被垃圾回收並在新請求中重新初始化。如果你想保留請求,你希望使用forward(默認使用哪個JSF),但是這對於ajax發起的請求不起作用,因爲它會一直保留在同一頁面上。只有使用重定向的響應纔會強制Ajax使用JavaScript更改窗口位置。

如果您希望在新請求中保留一些參數,您必須將它們作爲請求參數傳遞。例如。

externalContext.redirect("nodeMgmt.jsf?foo=bar"); 

並將它們設置爲bean中的託管屬性。

+0

謝謝。在這種情況下真相會受到傷害。 – volvox 2011-05-17 15:14:48

+0

不客氣。 – BalusC 2011-05-17 15:15:55