2013-04-07 44 views
0

我對錶達式語言2的bean-view通信語法感到困惑。首先,有可能再有一個託管bean具有相同名稱但scobes不同。如果訪問它們另一方面通過表達語言 ; 考慮到會話中有一個名爲DemoBean的屬性,並且還有一個會話Scobed託管bean,名爲DemoBean, 如果我嘗試像這樣通過EL訪問此bean #{DemoBean} //引用bean或屬性? 他們說#{} sessionScobe是訪問會話屬性,但
只是#{} sessionattributename是有效的方法是什麼?當我將對象放置到會話映射中時,它是否被複制或複製?EL會話屬性和託管bean訪問

回答

1

JSF的目標是爲您管理會話屬性本身。這意味着您應該忘記手動保持/恢復會話映射屬性,因爲您可以使用JSF的機制來完成此操作。

當您想要保留整個應用程序的一些信息時,請在託管bean中使用@ApplicationScoped註釋。您可以使用@SessionScoped,@RequestScoped@ViewScoped註釋對會話,請求或具體視圖執行相同操作。

所以,如果你要存儲在會話中的某些屬性:使用

@ManagedBean 
@SessionScoped 
public class SessionScopedBean{ 

    public String sessionAttribute; 

    //Getter and setter 

} 

您可以recover/change the value of the attribute of the beanFacesContext

FacesContext context = FacesContext.getCurrentInstance(); 
SessionScopedBean bean = (SessionScopedBean) context.getApplication() 
    .evaluateExpressionGet(context, "#{sessionScopedBean}", SessionScopedBean.class); 
bean.setSessionAttribute("value"); 

記住JSF豆默認命名爲bean的名字與第一性格較低。如果你沒有初始化你自己,請記住這個bean在第一次打擊時將會是null。您可以通過簡單的方式using a PreRenderViewEvent in the bean you want to initialize並在您的登錄頁面中執行它。這可確保該bean在該會話的其餘部分保持活力。

最後,就是你會從您的視圖訪問會話屬性的方式:「當我把一個對象的會話映射是referanced或複製」

#{sessionScopedBean.sessionAttribute}

+0

感謝意見,但 – daemonThread 2013-04-07 17:17:16

+0

當java引用它的對象時,它將被引用。所以如果你改變對象的值,它也會變成地圖(最後,會話屬性也存儲在地圖中)。不過,正如我所說的,使用JSF時要擺脫它。 – 2013-04-07 20:32:22

+0

當新會話scobed託管bean創建它是否隱式添加到會話映射?所以通過req.getSession()。getAttribute(「credentials」)來訪問它。是真的?我問這是因爲我有登錄過濾器和會話scobed managedbean調用credentials.In過濾器依賴注入是不允許的,並且FacesContext#getExternalContext()。getSessionMap()。get(「credentials」);返回null我們不能訪問過濾器中的面孔上下文,所以只有方法接縫會話屬性我猜。 – daemonThread 2013-04-07 21:54:05

相關問題