| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java EE (J2EE) и Spring > Set property in managed bean |
| Автор: PashaOvechkin 3.6.2007, 11:16 | ||||||||||||||
| У меня попятЬ роблема с йсф... Создан манагед беан
естЬ jsp страничка
а так же разметка в конфиге faces.xml
Когда запускаю страничку, на екране -> " --- first--- --- first--- "
Другими словами стандартный JSTL не пашет в ЙСФ. Так же пробовал в ЙСФ странице написатЬ скриптлет
a = null после етого...
а если сделатЬ так:
То получаю верное значение а. Но сетитЬ атрибут всё равно нелЬзя - беан после етого пересоздаётся и в нём находится то, что укладивает конструктор... На етот вопрос помоему однозначного ответа нету... Мне никто не помог :-| |
| Автор: PashaOvechkin 4.6.2007, 12:44 |
| Set managed bean property, from jsf page. ЙСТЛ не помогает. |
| Автор: Maksym 4.6.2007, 12:57 |
На самом деле, такая инлайн установка свойства противоречит jsf идеологии, но если очень хочется то можно попробовать использовать inputHidden тэг. Тогда при сабмите формы в bean прийдет нужное значение. |
| Автор: PashaOvechkin 4.6.2007, 13:04 |
| Почему же противоречит? При загрузке йсп (йсф) странички бин находится в сессии или реквесте... Что же мне мешает из тела страницы изменитЬ проперти в нём? Другое дело что доступ к любой из scopes в йсф иначе, именно по етму йстл не работает. Может кто знает как скриптлетом получитЬ бин из сессии например? session.getAttribute(""); не подходит. Как именно хранятся манагед бини не понятно... |
| Автор: Maksym 4.6.2007, 13:17 | ||
| PashaOvechkin Я имею в виду не технически, а идеологически. Изменение состояния бина из страницы не пользователем (вне логики) нарушает mvc паттерн. Что тебе мешает присвоить свое "-----yeeee-----" внутри метода-обработчика сабмита страницы? идеологически это более верно..
Никогда не пробовал рабоать с сессией напрямую из страницы (хотя участвую в больших проектах на jsf -- в этом просто нет необходимости ;) ), но они хранятся именно в сессии, вот только я не уверен что вутри страницы резервированное session ссылается куда нужно. |
| Автор: PashaOvechkin 4.6.2007, 13:57 |
| В йсп ссилается куда надо. В йсф иначе сессия добывается. Когда получил - смотрю в session1.getAttributesNames(); - там ничего - куча аттрибутов, но нужного нет |
| Автор: Maksym 4.6.2007, 14:14 |
| PashaOvechkin Если ты проврял атрибуты сессии до первого обращения jsf'ов к этому managed-bean, то его там не будет, jsf создает beans и добавляет их в сессию by demand. Сессия в принципе одна, по этому я с трудом представляю, чтобы фреймворк ссылался куда-то не туда. В своем посте я имел в виду, что в инлайн скриплете в jsf-странице резервированное имя session может нормально не поддерживаться (хотя не уверен, думаю что здесь все ок, просто в jsf скриплеты не вставляют обычно). Хранит в соответствующем scope, если ты назначил ему сессию, то он будет в сессии. Проверь еще раз, не пытаешся ли ты его там найти до того, как он понадобился jsf (до перехода на страницу, в которой он используется). |
| Автор: PashaOvechkin 4.6.2007, 14:36 |
| сессия то одна, в етом сомнений нет - доступ к ней разный... Оки, как из скриптлета получитЬ инстанц манагед бина? Или например, как в йсф страничке создатЬ локалЬную переменную? |
| Автор: Maksym 4.6.2007, 14:41 |
Через FacesContext. Объясни подробнее задачу, сдается мне что ее можно решить более прямым способом, чем ручаная модификация managed-bean внутри jsf страницы... они ведь для того и managed-bean, чтоб их jsf мэнэджил, а не программист вручную, где попало.. |
| Автор: PashaOvechkin 4.6.2007, 14:44 | ||
ЕстЬ MenuBacking.java.
В котором естЬ аттрибуты : String topLevel; String secondLevel; String thirdLevel; Они значат под каким разделом в меню находится данная страница. В начале каждой йсф делаю сет етим аттрибутам, позже include мену.йспх, который смотрит в MenuBacking, и рисует меню. Так вот. Решение нормалЬное - но реализоватЬ не получается. |
| Автор: Maksym 4.6.2007, 15:23 |
| PashaOvechkin Попробуй описать MenuBacking в session scope. Затем создать и добавить его в ручную в сессию при запуске приложения. И обратится в скриплете, как ты делал до этого. Должен найтись. |
| Автор: PashaOvechkin 4.6.2007, 17:14 |
| Maksym, спасибо за отзывчивостЬ (+) Наверно нужно как то иначе думатЬ... Не знаю стопит ли в йсф апликацие, исполЬзоватЬ старие методы... Может кто нибудЬ делал меню на йсф? Шепните идею.... |
| Автор: Maksym 4.6.2007, 17:33 |
| Ну, на самом деле, проблема скорее архитектурная. Как я понимаю, ты пытаешься сделать меню хотя бы отдаленно в виде компонента (что в общем правильно) и тебе необходимо его параметризовать, с тем чтобы оно на каждой странице выглядело соответсвенно окружающему контексту. Решение может быть таким: MenuBacking сделать уровня сессии и управлять им в коде перехода от страницы к странице. Это работает только в том случае, когда для управления web flow используется какой-нибудь самописный или внешний фреймворк и все переходы подконтрольны разработчику (т.е. нет, например, прямых линков на страницы, все редиректы проходят через методы объектов, отвечающих за управление web-flow), таким образом при переходе меню можно было бы поднастроить не только в зависимости от страницы, но и от прав пользователя, состояния сессии, источника перехода на страницу и т.п. В итоге полный контроль на ситуацией, разделение логики работы ui и собственно его отрисовки. Но для этого, как я говорил, приложение должно быть соответсвующим образом спроектировано: должен быть некоторый объект или набор объектов управляющий flow и в том числе оперирующий MenuBacking и бэкин бинами для других компонент.. и никаких инлайн скриплетов. Для полной инкапсуляции можно использовать http://myfaces.apache.org/tomahawk/aliasBean.html из проекта Tomahawk. Он позволит внутри заинклюденой странички воспользоваться псевдонимом для бэкин бина и реиспользовать ее и бин в любом пространстве имен в этом или других проектах. В текущем проекте у меня есть меню и реализовано оно примерно таким образом как я описал. Проект большой, поэтому предварительно был написан web flow framework отвечающий за управление компонентами, подобными твоему меню, и заточеный под конкретную предметную область и идею интерфейса (в нашем случае это большое количество визардов, а навигация между ними построена на табуляторах и деревьях). |