JSF Request Scoped Bean не отображает данные на странице - PullRequest
0 голосов
/ 27 апреля 2018

Я экспериментирую с областями 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. Почему?

1 Ответ

0 голосов
/ 30 апреля 2018

itemViewObject является частным в RequestScoped бобе. После того, как readItem() получит значение для itemViewObject, это значение будет забыто после этого запроса и будет равно нулю при следующем запросе (`@RequestScoped ').

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...