Сохранение значений бина между представлениями - PullRequest
4 голосов
/ 17 августа 2011

Я ищу рекомендации по сохранению значений bean-компонентов между представлениями с использованием JSF 2.

Рассмотрим следующий сценарий:
* В представлении A создается экземпляр bean-объекта ABean в области видимости, который извлекает данные для отображения в представлении.
* В представлении A вы можете нажать на запись, чтобы просмотреть сведения о ней в представлении B.
* При возврате из вида B к виду A отображаются данные, ранее извлеченные ABean.

Каков наилучший способ сохранить данные, полученные ABean, чтобы иметь возможность снова отображать их при возврате из представления B?
Повторное получение данных, что обычно происходит, так как при возврате из представления B создается новый экземпляр ABean, не является вариантом, так как это трудоемкая операция и приводит к неправильному использованию.
Наличие ABean в качестве области видимости сеанса - это не вариант, поскольку, если вы покинете страницу, а затем вернетесь, вместо извлечения новых данных будут отображаться «кэшированные» данные (т. Е. Вы не можете определить, загружаете ли вы представление A в результате навигации на страницу или если вы возвращаетесь из вида B).

Очевидно, что я ищу область разговора, которая прекрасно решает эту проблему (и то, что мы имели раньше, при использовании JSF 1 и WebFlow). К сожалению, в JSF этого нет, и, поскольку мы находимся в среде портлетов, мы не можем использовать CDI.

Есть мысли?

1 Ответ

1 голос
/ 17 августа 2011

Использование одного представления с условно отображаемым содержимым является самым простым.

* 1003 Е.Г. *

<h:form>
    <h:dataTable id="table" value="#{bean.items}" var="item" rendered="#{empty bean.item}">
        <h:column>
            #{item.foo}
        </h:column>
        <h:column>
            #{item.bar}
        </h:column>
        <h:column>
            <h:commandLink value="edit" action="#{bean.edit(item)}">
                <f:ajax execute="@this" render="@form" />
            </h:commandLink>
        </h:column>
    </h:dataTable>

    <h:panelGrid id="detail" columns="3" rendered="#{not empty bean.item}">
        <h:outputLabel for="foo" />
        <h:inputText id="foo" value="#{bean.item.foo}" />
        <h:message for="foo" />

        <h:outputLabel for="bar" />
        <h:inputText id="bar" value="#{bean.item.bar}" />
        <h:message for="bar" />

        <h:panelGroup />
        <h:commandButton value="save" action="#{bean.save}">
            <f:ajax execute="detail" render="@form" />
        </h:commandButton>
        <h:messages globalOnly="true" layout="table" />
    </h:panelGrid>
</h:form>

со следующим видом области видимости боба

private List<Item> items;
private Item item;

@EJB 
private ItemService itemService;

@PostConstruct
public void init() {
    items = itemService.list();
}

public void edit(Item item) {
    this.item = item;
}

public void save() {
    itemService.save(item);
    item = null;
}

Части обзора могут быть при необходимости разделены на две <ui:include> с. При необходимости, bean-компонент может быть разделен на два компонента (по одному для каждой части), в котором подробный элемент содержит таблицу один в качестве управляемого свойства. Но это не обязательно и только усложняет.

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