Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > JSF: Nested h:datatables from Hibernate beans


Автор: landpro 15.10.2007, 09:03
Добрый день, господа!

Каким же образом реализовать эту тривиальную задачу?

Описываю ситуацию.

Есть hibernate сущности - UserGroup & User.. Хочется вывести на странице все UserGroups и под каждой группой ее Users.
Делаю страничку JSF, в ней регистрирую контроллер UserGroupController, в котором делаю метод getUserGroups(), который в свою очередь делает HQL запрос всех групп, получает Set, конвертит в ListDataModel и возвращает. Ok, группы вывел.

Как же вывести Users? У UserGroup как водится есть атрибут - коллекция Users.
Уж очень хочется написать что-нибудь типа h:datatable value="#{userGroupController.users}", однако нельзя - коллекция Set.
Вопрос в том, где мне конвертировать Set в ListDataModel? Делать это прямо в классе UserGroup - несерьезно - это класс относится к слою модели, а ListDataModel - это тип данных представления.

Жду ваших мыслей, умы smile

Заранее спасибо!


Автор: ivg 15.10.2007, 09:43
Извиняюсь за предыдущие ответы на ваш вопрос, но хотелось бы знать, вариант указанный http://forum.vingrad.ru/index.php?showtopic=176481&view=findpost&p=1283347 не работает?

А по этой теме можно использовать javax.faces.model.ArrayDataModel, для этого значение атрибута value элемента <h:dataTable ... /> должно иметь тип Object[], то есть в данном случае проще всего будет указать value="#{userGroupController.users.toArray}"

Автор: landpro 15.10.2007, 10:17
ivg, спасибо за ответ и внимание smile

вариант с <list> отказывается правильно работать, уж не знаю почему. На сановском форуме мне вообще написали, что неправильно менять модель из-за проблем с выводом.... Типа это задача бизнес слоя.
Согласившись с этим, я написал конвертор для коллекции первого уровня вложенности (кстати, в этом же месте можно теперь управлять сортировкой элементов в коллекции), но теперь не понятно в каком месте вставить конвертор для внутренних уровней.

Не совсем понял идею с #{userGroupController.users.toArray}.
А так разве можно? т.е. вызовется toArray(), а не getToArray() ?

Автор: ivg 15.10.2007, 11:30
Цитата(landpro @  15.10.2007,  10:17 Найти цитируемый пост)
А так разве можно? т.е. вызовется toArray(), а не getToArray() ?

Точно ведь. Блин опять перепутал. (EL с Velocity  smile)
Не знаю, что даже и посоветовать. Эх жаль, что EL такого не позволяет (Вообще он не рулит, по сравнению например с Velocity Template Language).
Проще всего наверно, добавить в модель, для нужных сущностей методы типа getUserList() например, который будет на лету конвертировать Set<?> в List<?>, ну а сам метод конвертации можно наверно вынести в отдельный класс и сделать его static. Я думаю, такой подход особого влияния на модель не окажет, зато можно будет делать например вот так value="#{userGroupController.currentUserGroup.userList}", а ведь, на сколько я понял именно это хочется получить?
В голову приходит ещё написать обёртки для классов модели, и использовать их при выводе, но это те же опять 25 - при доступе к внутренним коллекциям сущностей в контроллере нужно будет отслеживать сей факт, а именно этого и хочется избежать.

Автор: landpro 15.10.2007, 12:45
Да, ivg!

Теперь ты меня полностью понял, супер! smile

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

Со статическим методом это, конечно, гуд. Но опять же нюанс. Когда переводишь Set в List хочется управлять сортировкой, а это еще один параметр smile Я уже написал тут себе пару компараторов на несколько случаев, только вот где хранить и как передавать этот параметр пока не понятно.

В общем пока буду жить так и двигаться дальше.

Спасибо!

Автор: ivg 15.10.2007, 13:23
Ещё вариант: переписать класс javax.faces.component.UIData, таким образом, чтобы он при получении Set<?>, автоматом конвертил бы его в List<?> и выбирал соответственно ListDataModel. (smile )
Ну или если уж совсем по правильному, то такой подход подразумевает создание своего компонента, который в этой части будет раcширять поведение стандартного h:dataTable. Как такой вариант? До кучи, можно будет придумать и атрибут, который будет указывать на условие(я) сортировки при конвертировании.

Автор: Foo 22.10.2007, 09:26
Цитата

Проще всего наверно, добавить в модель, для нужных сущностей методы типа getUserList() например, который будет на лету конвертировать Set<?> в List<?>, ну а сам метод конвертации можно наверно вынести в отдельный класс и сделать его static. Я думаю, такой подход особого влияния на модель не окажет, зато можно будет делать например вот так value="#{userGroupController.currentUserGroup.userList}", а ведь, на сколько я понял именно это хочется получить?


Если я не ошибаюсь, если написать такой метод getUserList() который будет конвертить Set в List, то он не вызовется, т.к. кроме того что есть метод типа getXxx должно быть ещё поле xxx и метод setXxx, и даже тогда JSF не будет вызывать метод, а возьмет значение самого поля xxx.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)