Я экспериментирую с областями JSF, и у меня возникают некоторые проблемы при использовании bean-объекта в области сеанса в bean-объекте области запроса.
Основной рабочий процесс заключается в том, что пользователь нажимает кнопку View на элементе с домашней страницы, которая затем вызывает мой код для загрузки и отображения информации об этом элементе.
Вот мой ОБНОВЛЕННЫЙ код:
@ManagedBean(name="itemViewBean")
@RequestScoped
class ItemViewBean {
@ManagedProperty("#{itemBean}")
private ItemBean itemBean;
private ItemViewObject itemViewObject;
private int itemId;
public void init() {
itemViewObject = itemBean.readItem(itemId);
}
public String readItem(int itemId) {
// itemViewObject = itemBean.readItem(itemId); // moved to init();
return "/pages/viewItem.xhtml?faces-redirect=true";
}
public ItemViewObject getItemViewObject() {
return itemViewObject;
}
// getters & setters as needed
}
@ManagedBean(name="itemBean")
@SessionScoped
class ItemBean {
public ItemViewObject readItem(int itemId) {
// hardcoded creating a ItemViewObject for now.
// eventually would be loaded from the database.
....
}
}
Моя ОБНОВЛЕННАЯ страница просмотра имеет такие вещи, как:
<!-- added the metadata -->
<f:metadata>
<f:viewParam name="id" value="#{itemViewBean.itemId}" />
<f:event listener="#{itemViewBean.init}" type="preRenderView" />
</f:metadata>
<!-- same as before -->
<h:outputText value="#{itemViewBean.itemViewObject.description}" />
Если мой viewBean имеет область запроса (или область просмотра), я получаю пустые данные на странице просмотра. Если viewBean ограничен сессией, все работает. И я не понимаю, почему?
Из того, что я вижу в моем отладчике, вызывается readItem (itemId) (с домашней страницы при нажатии кнопки просмотра), но когда сама страница просмотра вызывает getItemViewObject (), itemViewObject имеет значение null.
Что я делаю не так?
UPDATE
Я забыл упомянуть ранее, как моя домашняя страница вызывала метод readItem, и это было через командную кнопку:
<h:commandButton class="btn btn-mini firefoxBtnMiniCorrection"
value="View"
action="#{itemViewBean.readItem(b.itemId)}"/>
Каждый элемент, указанный на домашней странице, имеет собственную кнопку просмотра.
Также забыл упомянуть, что и домашняя страница, и страница моего просмотра используют JSF-шаблоны. Я не знаю, имеет ли это значение.
Из комментариев ниже, которые делали люди, я предложил изменения кода выше. И все работает сейчас. Теперь можно использовать либо область запроса, либо область просмотра с ItemViewBean.
И я удивлен, что это сработало! Я не совсем уверен, что полностью понимаю, почему это работает.
Являются ли мои изменения правильным способом действий? Или есть лучший способ?
Также я использую JSF 2.1.
Обновление 2
Не работает Область видимости работает, но я обнаружил, что itemId в viewParam всегда имеет значение null. Почему?