Использование параметра представления JSF через таблицы данных?Возможный? - PullRequest
0 голосов
/ 16 июня 2011

Среда: JSF 2.0 / JPA (предоставлено EclipseLink) / Glassfish 3.1 / java-EE-5 /

  • Небольшое веб-приложение JSF (без пружины, без EJB, без CDI) в основном предназначено для отображения таблиц данных для сущностей, но цель состоит в том, чтобы отобразить список образов сущностей для данного Writer:

  • Таблица данных (<h:datatable/>) отображает список авторов.

  • Таблица данных (<h:datatable/>) отображает список книг, написанных авторами. (1 - *)
  • Таблица данных (<h:datatable/>) отображает список оценок, предоставленных авторам. (1 - *)
  • Таблица данных (<h:datatable/>) отображает список тем, рассматриваемых авторами. (1 - *)

Вот как я вижу вещи:

Поскольку все таблицы данных имеют столбец с идентификатором Writer (первичный ключ Writer). Как я могу добиться, чтобы текущий сеанс пользователя содержал параметр (идентификатор записывающего устройства), когда пользователь выбирает заданного записывающего устройства (предпочтительно из источника данных записывающего устройства) и использует его для отображения только записей, относящихся к этой выбранной строке записывающего устройства.

Точно так же, когда пользователь завершает работу с выбранным писателем, он / она может сбросить сеанс для хранения другого идентификатора писателя и счастливо исследовать дочерние элементы нового выбранного писателя.

Другими словами, используя <h:datatables /> и <f:param /> (или что-то подобное), как я могу постоянно отображать элементы Book, Evaluation и Topic для выбранного автора.

E.G: Постоянно для меня означает = Когда пользователь выбирает писателя из таблицы данных и переходит на страницу /book/List.xhtml, книга данных должна содержать список только тех элементов книги, которые есть у выбранного писателя. И если пользователь переходит в другое место, он может видеть только то, что связано с тем же автором.

Одна из идей состоит в том, чтобы использовать фильтры данных OpenFaces, но для конечного пользователя слишком жестоко фильтровать таблицу каждый раз, когда он / она переходит на страницу. Он должен сделать это только один раз. (Интересным решением является добавление фильтра OpenFaces (<o:inputTextFilter />) для каждого объекта данных (в данном случае <o:datatable >), и тогда все фильтры для всех таблиц автоматически получают идентификатор записывающего устройства, который хранится в качестве параметра пользовательский сеанс во время цикла JSF. Но возможно ли это :(?

Извините за избыточность. Надеюсь, что кто-то может помочь с подсказками, идеями, решениями или лучшей альтернативой. С уважением.

1 Ответ

1 голос
/ 24 июня 2011

Предполагая, что вы действительно работаете с Java EE 6, а не с Java EE 5, вы можете просто передать выбранный в настоящий момент модуль записи в качестве аргумента метода компоненту в ссылке / кнопке в таблице данных, и пусть другие таблицы зависят от этого.

Учитывая следующую сущность Writer:

public class Writer {

    private String name;
    private List<Book> books;
    private List<Evaluation> evaluations;
    private List<Topic> topics;

    // ...
}

и следующий управляемый компонент:

@ManagedBean
@ViewScoped // request or session are also okay.
public class Bean {

    private List<Writer> writers; // +getter
    private Writer writer; // +getter +setter

    // ...
}

, вы можете настроить таблицы данных следующим образом (в одномвид):

<h:form>
    <h:dataTable value="#{bean.writers}" var="writer">
        <h:column>#{writer.name}</h:column>
        <h:column>
            <h:commandButton value="View" action="#{bean.setWriter(writer)}">
                <f:ajax render=":details" />
            </h:commandButton>
        </h:column>
    </h:dataTable>
</h:form>
<h:panelGroup id="details">
    <ui:fragment rendered="#{not empty bean.writer}">
        <h:dataTable value="#{bean.writer.books}" var="book">
            <h:column>#{book.name}</h:column>
            ...
        </h:dataTable>
        <h:dataTable value="#{bean.writer.evaluations}" var="evaluation">
            <h:column>#{evaluation.name}</h:column>
            ...
        </h:dataTable>
        <h:dataTable value="#{bean.writer.topics}" var="topic">
            <h:column>#{topic.name}</h:column>
            ...
        </h:dataTable>
    </ui:fragment>
</h:panelGroup>
...