如何从 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,对吗?那么,您对这种方法有什么建议吗? &lt;f:attribute&gt;可以用吗?

【问题讨论】:

【参考方案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 属性的主要内容,如果未能解决你的问题,请参考以下文章

从 JSF 中的托管 bean 获取资源文件的路径

JSF 获取托管 bean 中的当前操作

从托管 bean 中的 ADF SelectOneChoice 获取选定项目

如何从jsf / primefaces中的托管bean向页面添加组件[重复]

JSF 如何从支持 bean 重定向到支持 bean 中动态构建的 URL?

如何从托管 bean 中获取消息包字符串?