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


Автор: v2v 25.4.2008, 01:17
Есть три страници: 
create.faces , view.faces & edit.faces
запускаю create.faces  - и заполняю поля формы - создаю бин , при сабмите перехожу на view.faces и проверяю что всё заполнено правильно . что то не правильно жму кнопку edit и перехожу на edit.faces , но вот проблема. мой бин есть request scope и поэтому на третью страницу он не передаётся.
Как это полечить?

Вариант использовать для моего бина session scope не подходит , потому что если я после создания открою вторую страницу create.faces , то поля уже будут заполнены значениями первого бина. не катит.

помогайте. это должно быть тривиальный вопрос, но я с jsf начал разбираться не так давно и сам хорошего решения пока не нашёл.

Автор: hanabi 25.4.2008, 03:07
тривиальный ответ, ИМХО, такой - не открывать вторую страницу

либо юзер занимается делом - заполняет форму, либо занимается фигней - типа открывает сто страниц на экране и любуется ими
это ж application, а не веб-сайт

Автор: v2v 25.4.2008, 08:10
ты не понял. я добавил пользователя . всё ок. нажал линк добавить нового пользователя, а там, при session scope для мого бина, уже заполнены поля ! это не правильно.

Автор: ivg 25.4.2008, 08:38
Не много не понял точно в чем проблема, но если то, в чём я думаю, то вот несколько мыслей.
Есть такая штука - MVC  smile ну вы в курсе да?
Так вот бины в JSF, по крайней мере те, что описываются в config-faces.xml - должны относится по моему убеждению к уровню Controller'а.
А POJO классы, или Entity Beans в терминологии EJB, - классы описывающие модель предметной области - ими мы управляем сами в контроллере, а не отдаём движку JSF.
Бины контроллера - это как бы программные модули, реализующие ту или иную функциональность (ещё это можно назвать бизнес-логикой), например Управление пользователями, здесь и create и edit и delete и т. д.
Вот такую идеологию предлагаю помыслить  smile 

Автор: Kangaroo 25.4.2008, 09:29
Цитата(v2v @  25.4.2008,  01:17 Найти цитируемый пост)
мой бин есть request scope и поэтому на третью страницу он не передаётся.
Как это полечить?

create.faces -> Сохранил в базе -> view.faces -> Достал из базы и показал -> edit.faces -> достал из базы и открыл для редактирования...

Автор: necromancer 25.4.2008, 13:52
мда, а можно еще варианты: см
1 использовать сериализацию на странице
2 сохранять в сессии следующее: уникальный id сраницы или операции и связанные с ним объекты, по таймауту их убивать =)
3 использовать JBoss Seam
4 по моему у одного из дочерних проектов MyFaces есть Conversation
5 использовать PhaseListener для поддержания контектса страниц

хранение в базе это гуд и не гуд
гуд:
масштабируемость
надежная персистентность
отказоустойчивать
не гуд:
не совсем понятно почему оно не покажет на отдельно открытой  странице тоже что и на редактируемой =) см выше
усложняет логику
увеличивает накладные расходы
необходимо отслеживать что бы временная таблица чистилась

Автор: Kangaroo 25.4.2008, 14:29
Цитата(necromancer @  25.4.2008,  13:52 Найти цитируемый пост)
хранение в базе это гуд и не гуд
гуд:
масштабируемость
надежная персистентность
отказоустойчивать
не гуд:
не совсем понятно почему оно не покажет на отдельно открытой  странице тоже что и на редактируемой =) см выше
усложняет логику
увеличивает накладные расходы
необходимо отслеживать что бы временная таблица чистилась 

 smile 
Я немного не то имел ввиду. Ты про временное хранилище (зачем?), а я про постоянное. 
Создали бин, сохранили его куда-нибудь (в базу, например), для апдейта - достали его и базы.
Зачем делать это конвесейшном?

Автор: v2v 25.4.2008, 15:31
ivg, теорию мы знаем , как это реализуется на практике ;) .
necromancer, поподробней про 4 и 5.

Цитата(Kangaroo @  25.4.2008,  09:29 Найти цитируемый пост)
create.faces -> Сохранил в базе -> view.faces -> Достал из базы и показал -> edit.faces -> достал из базы

Kangaroo, тут есть запросы к базе без которого можно было бы обойтись ... хотелось бы обойтись ... и средства jsf должны позволять это . 

разве тут нету людей которые активно пользуются jsf ??

Автор: v2v 25.4.2008, 17:07
решил эту проблемку, так как хотел изначально : просто и красиво smile.

проблема была в странице view.jsp , дело в том что вместо полей для ввода h:inputText бин.вальюе
там стояло поле вывода : h:outputText бин.вальюе 
ясное дело что значения с таких полей дальше не передаются, значит надо было  добавить 
поля для ввода и спрятать их , на выручку пришёл компонент h:inputHidden бин.вальюе , ко-им я и воспользовался.

сабж решён.
ждите новых вопросов в скором будущем. smile

Автор: alexsmirnov 26.4.2008, 03:44
На самом деле, в JSF для такого случая подразумевается использовать не 3, а 2 страницы.
create.faces - вводится информация и нажимается submit. Делается валидация. Если что-то не так, JSF заполняет сообщения и опять выводит create.faces.
Если все OK - выводится следующая страница в том-же запросе. При ее отображении бин еще есть.

Автор: v2v 26.4.2008, 16:51
alexsmirnov, это всё само собой разумеется ;)
но страница где можно редактировать заполненные данные тоже  имеет право на существование.

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