我知道我可以像这样放置/获取会话范围变量。
FacesContext.getCurrentInstance().getExternalContext()
.getSessionMap().put(SESSION_KEY_SOME, some);
那么我不能像这样访问值吗?
@ManagedBean
@SessionScoped
public class SomeOtherBean {
@ManagedProperty("#{sessionScope.some}")
private Some some;
}
取值为null
@ManagedProperty
在@ManagedBean
的创建/实例化过程中运行
因此,当@ManagedBean
在之前创建时,#{sessionScope.some}
第一次被设置,那么它仍然会在@ManagedBean
中保留null
。在第一次设置#{sessionScope.some}
之后创建@ManagedBean
才会起作用
基本上有三种方法可以达到期望的行为。
-
用
externalContext.getSessionMap().get("some")
代替private Some some
@ManagedBean @SessionScoped public class SomeOtherBean { public void someMethod() { Some some = (Some) FacesContext.getCurrentInstance() .getExternalContext().getSessionMap().get("some"); // ... } }
-
用
@RequestScoped
代替@SessionScoped
@ManagedBean @RequestScoped public class SomeOtherBean { @ManagedProperty("#{sessionScope.some}") private Some some; // ... }
-
直接将
externalContext.getSessionMap().put("some", some)
设置为bean属性。@ManagedBean public class SomeBean { @ManagedProperty("#{someOtherBean}") private SomeOtherBean someOtherBean; public void someMethod() { // ... someOtherBean.setSome(some); } // ... }
参见:
- 如何选择合适的bean scope?