Как получить свойство managedbean от другого компонента в JSF

17

Я искал похожие вопросы, но я немного смущен. У меня есть страница входа, поэтому LoginBean также есть:

@ManagedBean(name = "loginBean")
@SessionScoped
public class LoginBean implements Serializable {    
    private String password="";
    private String image="";
    @ManagedProperty(value = "#{loginBeanIdentityNr}")
    private String identityNr="";
...

после успеха, перемещается на страницу списка заказов, поэтому у меня также есть 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 для меня. Я думаю, если мне понадобится целое боба, я могу ввести эти бобы, верно? Итак, есть ли у вас какие-либо предложения по этому подходу? можно использовать <f:attribute> ?

    
задан asyard 14.05.2011 в 21:29
источник

1 ответ

44

@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 14.05.2011 в 21:30
источник
  • hi BalusC, но на этот раз в OrderBean у меня будут ненужные свойства loginbean. это не трата кучи для программы? Мне просто нужна личность nr. не captcha значение или имя. –  asyard 14.05.2011 в 21:35
  • Э-э, это просто ссылка. Он не делает копию всего боба в памяти или что-то в этом роде. Он указывает на тот же компонент, что и у вас в сеансе. Java объектно-ориентированная, а не процедурная или что-то еще. Более того, двойная ссылка на String вместо javabean потенциально более дорогая. –  BalusC 14.05.2011 в 21:37
  • спасибо за ответ. Я буду голосовать за все ваши ответы, как только я получу достаточную репутацию :) Но, просто любопытно, есть ли другой способ, например facescontext.getblabla () .. или в jsf-странице как параметр без ввода? –  asyard 14.05.2011 в 21:41
  • Использование FacesContext # getBlabla () следует избегать как можно больше. Вы можете передать его как параметр запроса, да, но почему вы должны перенести элемент управления на клиентскую сторону? Таким образом, клиент сможет отредактировать его, и весь ваш код сломается. –  BalusC 14.05.2011 в 21:44
  • вы правы .. Еще раз спасибо .. –  asyard 14.05.2011 в 21:45