Использование параметра просмотра JSF через таблицы данных? Возможно?

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

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

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

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

Вот как я это вижу:

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

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

Другими словами, используя <h:datatables /> и <f:param /> (или что-то подобное), как я могу постоянно перечислять элементы «Книга», «Оценка» и «Тема» для выбранного писателя.

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

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

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


person Hanynowsky    schedule 15.06.2011    source источник
comment
Является ли ваша целевая среда выполнения действительно Java EE 5? Glassfish 3 — это контейнер Java EE 6. Какая версия сервлета объявлена ​​вашей web.xml? GF 3 поддерживает Servlet 3.0, а также EL 2.2, что должно упростить передачу аргументов.   -  person BalusC    schedule 16.06.2011
comment
Любые комментарии? Я могу опубликовать ответ, ориентированный на Java EE 5, но, поскольку в Java EE 6 все можно сделать более элегантно, я бы предпочел не тратить свое время на ответ на решение Java EE 5, пока вы, в конце концов, на самом деле< /i> с использованием Java EE 6. Кстати, та же история относится и к вашему предыдущему вопросу, где я оставил комментарий, но так и не получил отзыва: stackoverflow.com/questions/6358188/   -  person BalusC    schedule 17.06.2011
comment
@BalusC Я использую Glassfish 3.1, Java EE5 и JDK 1.6. На самом деле кажется, что моя версия EL 2.2, так как я могу использовать параметризованные методы и другие новые функции EL 2.2. Хотя в моем сервлете sun-web.xml версия 2.5, как и в web.xml.   -  person Hanynowsky    schedule 23.06.2011
comment
@BalusC Мне очень жаль, что я не ответил быстро, так как я не получил никаких уведомлений о ваших комментариях. В будущем я буду проверять все свои вопросы, открывая их всякий раз, когда я в сети.   -  person Hanynowsky    schedule 23.06.2011
comment
О комментариях сообщает глобальный почтовый ящик слева вверху. Если вы видите маленькую красную стрелку с новым номером сообщения, у вас есть новые комментарии. Но я все еще не понимаю одного. GF 3.1 — это контейнер Java EE 6. EL 2.2 является частью Servlet 3.0. Сервлет 3.0 является частью Java EE 6. Тем не менее, вы продолжаете говорить, что используете Java EE 5. Но вы, кажется, на самом деле используете Java EE 6.   -  person BalusC    schedule 23.06.2011
comment
@BalusC Когда я впервые создал проект в своей среде IDE, я указал Java-EE-5, однако проверьте эти снимки экрана: picasaweb.google.com/114359438853499737434/My_JSF_Web_App   -  person Hanynowsky    schedule 23.06.2011
comment
Ах да. Наверное, это глюк Netbeans.   -  person BalusC    schedule 24.06.2011
comment
@BalusC да, может быть! Я предполагаю, что это связано с некоторыми причинами переносимости (например, использование контейнера, не поддерживающего Java-EE-6). При указании Java-EE-5 в netbeans и создании некоторого кода он генерирует контроллеры JPA, совместимые с java-EE-5, но при указании Java-EE-6 он использует EJB 3.1 (фасады, CDI и т. д.). Но в любом случае, мне было приказано пока не использовать EJB и CDI, это как-то глупо, но ничего не поделаешь! Пожалуйста, вперед BalusC!   -  person Hanynowsky    schedule 24.06.2011


Ответы (1)


Предполагая, что вы действительно используете 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>
person BalusC    schedule 23.06.2011
comment
о :) Я попробую это завтра после работы и обратной связи! Большое спасибо. - person Hanynowsky; 24.06.2011
comment
ui:fragment не имеет атрибута RENDERED. Я использовал тот, что доступен в h:panelGroup, и добавил теги ‹h:form для инкапсуляции таблиц данных. Он работает как шарм для отображения списков элементов, связанных с писателем, на одной странице. - person Hanynowsky; 27.06.2011
comment
Моя проблема заключалась в том, чтобы сохранить идентификатор писателя в течение сеанса, чтобы все таблицы зависели от него при навигации по страницам! Я решил эту проблему, взломав запрос JPA условно (используя сеттер записи), и вместе с вашим решением моя проблема решена! Еще раз спасибо BalusC. - person Hanynowsky; 27.06.2011
comment
Он, безусловно, поддерживает атрибут rendered. Вы, очевидно, используете Netbeans? Игнорируйте это предупреждение/ошибку IDE и запустите его. Что касается области сеанса, просто сделайте bean-компонент @SessionScoped. - person BalusC; 27.06.2011