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

#jsf #managed-bean

#jsf #управляемый компонент

Вопрос:

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

Ответ №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 свойств пустой строкой — плохая практика.

Комментарии:

1. привет, но на этот раз в OrderBean у меня будут ненужные свойства loginbean. разве это не пустая трата кучи для программы? мне просто нужен идентификационный номер, а не значение captcha или имя.

2. Ну, это просто ссылка. Это не создает копию всего компонента в памяти или что-то в этом роде. Оно указывает на точно такой же компонент, который у вас уже есть в сеансе. Java является объектно-ориентированной, а не процедурной или что-то в этомроде. Более того, двойная ссылка на строку вместо javabean потенциально обходится дороже.

3. спасибо за ответ. я проголосую за все ваши ответы, как только наберу достаточную репутацию 🙂 Но, просто любопытно, есть ли другой способ, например facescontext.getblabla() .. или на странице jsf в качестве параметра без ввода?

4. Следует также избегать использования FacesContext#getBlabla() . Вы могли бы передать его в качестве параметра запроса, да, но зачем вам передавать управление на сторону клиента? Таким образом, клиент сможет отредактировать его, и весь ваш код сломается.

5. @BalusC Как JSF различает два экземпляра одного и того же компонента при выполнении инъекции? Допустим, у нас есть 2 экземпляра LoginBean с областью просмотра, как JSF узнает, какой из них мне нужен?