2011-08-30 38 views
0

我的JSF應用程序的入口點是EntryPoint.jsp。我們正在使用JSF 1.2。用戶可以用多個不同的URL參數呼叫EntryPoint.jsp。我想分析這些參數,加載一個具有某種狀態的會話bean,在頁面加載之前執行所有這些操作,並且繼續處理/顯示EntryPoint.jsp或將foward /重定向到應用程序中的另一個頁面。任何人都可以推薦這個最好的設計?如何在頁面顯示之前使用條件導航邏輯設計JSF入口點頁面?

我已經在我的EntryPoint.java支持bean嘗試(異常處理刪除):

@PostConstruct 
public void init() { 
    HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
    companyName = request.getParameter("companyCode"); 
    //process parameters... 
    if (someCondition) { 
     FacesContext.getCurrentInstance().getExternalContext().dispatch("/other.jsp"); 
     return; 
    } 
} 

,但我得到一個IllegalStateException: Response already committed

我也試過

FacesContext.getCurrentInstance().getExternalContext().redirect("/other.jsp"); 

還能得到一個IllegalStateException(沒有消息)。很明顯,這不是適當的方式或地點來做到這一點。任何人都可以推薦一個更好的方式來實現我在找什麼?

This post似乎表明一個servlet過濾器可能是一個不錯的選擇。如果是這樣,會話範圍JSF支持bean是否可以在servlet過濾器中使用?

回答

1

這確實不適用於JSF 1.x.正如你在另一個問題中發現的那樣,Filter確實是這個工作更合適的地方。從那以後,這個答案一直沒有改變。會話作用域JSF託管bean存儲在HttpSession中,託管bean名稱作爲會話屬性名稱。所以是的,它可以在Filter訪問。更重要的是,Filter可以預先創建並放入會話中。然後JSF將使用它而不是自動創建一個。

+0

太棒了,謝謝。你的最後一個轉折特別回答了我的小問題(即會話bean在任何JSF框架交互之前是否可用)。 –

+0

不客氣。你只需要記住'@ EJB','@ PostConstruct'和likes不會被注入/調用。但是我不認爲這是一個問題,因爲你通常不會在會話範圍的bean上看到它。 – BalusC