Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JSF: Nested h:datatables from Hibernate beans, Каким же образом это делается? 
:(
    Опции темы
landpro
Дата 15.10.2007, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 10.10.2007

Репутация: нет
Всего: нет



Добрый день, господа!

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

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

Есть 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

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


PM MAIL   Вверх
ivg
Дата 15.10.2007, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 32
Всего: 81



Извиняюсь за предыдущие ответы на ваш вопрос, но хотелось бы знать, вариант указанный здесь не работает?

А по этой теме можно использовать javax.faces.model.ArrayDataModel, для этого значение атрибута value элемента <h:dataTable ... /> должно иметь тип Object[], то есть в данном случае проще всего будет указать value="#{userGroupController.users.toArray}"
PM MAIL   Вверх
landpro
Дата 15.10.2007, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 10.10.2007

Репутация: нет
Всего: нет



ivg, спасибо за ответ и внимание smile

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

Не совсем понял идею с #{userGroupController.users.toArray}.
А так разве можно? т.е. вызовется toArray(), а не getToArray() ?
PM MAIL   Вверх
ivg
Дата 15.10.2007, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 32
Всего: 81



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

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


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 10.10.2007

Репутация: нет
Всего: нет



Да, ivg!

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

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

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

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

Спасибо!
PM MAIL   Вверх
ivg
Дата 15.10.2007, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Autonomous R&D
**


Профиль
Группа: Участник
Сообщений: 686
Регистрация: 8.2.2006
Где: Екатеринбург

Репутация: 32
Всего: 81



Ещё вариант: переписать класс javax.faces.component.UIData, таким образом, чтобы он при получении Set<?>, автоматом конвертил бы его в List<?> и выбирал соответственно ListDataModel. (smile )
Ну или если уж совсем по правильному, то такой подход подразумевает создание своего компонента, который в этой части будет раcширять поведение стандартного h:dataTable. Как такой вариант? До кучи, можно будет придумать и атрибут, который будет указывать на условие(я) сортировки при конвертировании.
PM MAIL   Вверх
Foo
Дата 22.10.2007, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 20.10.2006

Репутация: 1
Всего: 3



Цитата

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


Если я не ошибаюсь, если написать такой метод getUserList() который будет конвертить Set в List, то он не вызовется, т.к. кроме того что есть метод типа getXxx должно быть ещё поле xxx и метод setXxx, и даже тогда JSF не будет вызывать метод, а возьмет значение самого поля xxx.
--------------------
qip
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0444 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.