如何从 JSF 中的另一个 bean 获取 managedbean 属性
Posted
技术标签:
【中文标题】如何从 JSF 中的另一个 bean 获取 managedbean 属性【英文标题】:How to get managedbean property from another bean in JSF 【发布时间】:2011-08-25 15:33:04 【问题描述】:我搜索了类似的问题,但我有点困惑。我有一个登录页面,所以 LoginBean 也是;
@ManagedBean(name = "loginBean")
@SessionScoped
public class LoginBean implements Serializable
private String password="";
private String image="";
@ManagedProperty(value = "#loginBeanIdentityNr")
private String identityNr="";
...
成功后,导航到orderlist页面,所以我也有OrderBean。
@ManagedBean(name = "OrderBean")
@SessionScoped
public class OrderBean
List<Ordery> sdList;
public List<Order> getSdList()
try
String identityNr ="";
ELContext elContext = FacesContext.getCurrentInstance().getELContext();
LoginBean lBean = (LoginBean) FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(elContext, null, "loginBean");
identityNr =lBean.getIdentityNr();
sdList = DatabaseUtil.getOrderByIdentityNr(identityNr);
...
我不需要整个 LoginBean,只需要 ManagedProperty "loginBeanIdentityNr"。但是下面的这段代码不起作用(当然);
identityNr = (String) FacesContext.getCurrentInstance()
.getApplication().getELResolver()
.getValue(elContext, null, "loginBeanIdentityNr");
这一次它返回 null 给我。
我想如果我需要整个 bean 属性,我可以注入这些 bean,对吗?那么,您对这种方法有什么建议吗? <f:attribute>
可以用吗?
【问题讨论】:
【参考方案1】:@ManagedProperty
声明 JSF 应该设置属性的位置,而不是 JSF 应该“导出”属性的位置。您只需将LoginBean
作为OrderBean
的属性注入即可。
public class OrderBean
@ManagedProperty(value="#loginBean")
private LoginBean loginBean; // +setter
// ...
这样您就可以通过OrderBean
访问它
loginBean.getIdentityNr();
或者,如果您将OrderBean
请求或视图设为范围,那么您也可以只设置identityNr
属性。
public class OrderBean
@ManagedProperty(value="#loginBean.identityNr")
private String identityNr; // +setter
// ...
与具体问题无关:用空字符串初始化String
属性是一种不好的做法。
【讨论】:
嗨 BalusC,但是这次在 OrderBean 中,我将有 loginbean 的不必要属性。这不是浪费程序的堆吗?我只需要身份NR。不是验证码值或名称。 呃,这只是一个参考。它不会在内存中复制整个 bean 或其他东西。它指向与您在会话中已有的完全相同的 bean。 Java 是面向对象的,而不是过程式的。更重要的是,双重引用 String 而不是 javabean 可能更昂贵。 感谢您的回答。一旦我获得足够的声誉,我会投票给你所有的回复:) 但是,只是好奇,有没有另一种方法,比如 facescontext.getblabla().. 或者在 jsf 页面中作为参数而不注入? 应该尽量避免使用FacesContext#getBlabla()
。您可以将其作为请求参数传递,是的,但是为什么要将控制权转移到客户端呢?这样客户就可以对其进行编辑,并且您的所有代码都会中断。
@BalusC JSF 在执行注入时如何区分同一个 bean 的两个实例?假设我们有 2 个具有视图范围的 LoginBean 实例,JSF 怎么知道我想要哪一个?以上是关于如何从 JSF 中的另一个 bean 获取 managedbean 属性的主要内容,如果未能解决你的问题,请参考以下文章
从托管 bean 中的 ADF SelectOneChoice 获取选定项目
如何从jsf / primefaces中的托管bean向页面添加组件[重复]