#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 узнает, какой из них мне нужен?