【问题标题】:How to get managedbean property from another bean in JSF如何从 JSF 中的另一个 bean 获取 managedbean 属性
【发布时间】:2016-03-09 06:18:18
【问题描述】:

我搜索了类似的问题,但我有点困惑。我有一个登录页面,所以 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;可以用吗?

【问题讨论】:

    标签: jsf managed-bean


    【解决方案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 怎么知道我想要哪一个?
    猜你喜欢
    • 2014-12-06
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    相关资源
    最近更新 更多