在这篇文章Dynamic ui:include中,我问过如何在一些状态下存储一个对象,这个状态允许我加载同一浏览器的新窗口或标签,并且它也没有存储在新窗口中。 Adrian Mitev告诉我使用@WindowScoped
,一个名为CODI的MyFaces扩展选项,我试图实现它。
现在我应该说我是盲人,当我尝试打开Apache Wiki时,我的浏览器会在许多页面上崩溃,所以我无法阅读这些指南。
但是我在项目中添加了源代码,编译器没有给出任何错误。
问题是,当我尝试检索@WindowScoped
存储的bean时,页面现在无法正常工作!
我在我的bean中使用这段代码:
@ManagedBean (name="logicBean" )
@WindowScoped
在include.xhtml
中,我使用以下代码检索参数:
<ui:include src="#{logicBean.pageIncluded}"/>
在我的其他bean中,我使用此代码检索LogicBean
(我确信此代码存在问题)
LogicBean l = (LogicBean) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("logicBean");
如何检索“正确的”LogicBean对象?
答案 0 :(得分:2)
您正试图从会话地图中获取LoginBean
。这仅适用于具有标准JSF @SessionScoped
注释的会话范围bean。
访问其他bean的规范方法是在检索bean上使用@ManagedProperty
。
E.g。
@ManagedBean
@RequestScoped
public class OtherBean {
@ManagedProperty("#{logicBean}")
private LogicBean logicBean;
// Getter+Setter.
}
如果您确实需要通过以编程方式评估EL来在方法块中访问它,那么您应该使用Application#evaluateExpressionGet()
代替:
FacesContext context = FacesContext.getCurrentInstance();
LogicBean logicBean = context.getApplication().evaluateExpressionGet(context, "#{logicBean}", LogicBean.class);
// ...