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


Автор: PashaOvechkin 3.6.2007, 11:16
У меня попятЬ роблема с йсф...

Создан манагед беан 
Код


public class HeaderBacking {
    private String secondLevel = null;
 
           public HeaderBacking(){
        
        secondLevel = new String("--- first---");
     
    }
 
        public void setSecondLevel(String secondLevel) {
        this.secondLevel = secondLevel;
    }
 
    public String getSecondLevel() {
        return secondLevel;
    }
}


 



естЬ  jsp страничка 

Код


   <h:outputText value="#{headerBacking.secondLevel}"/>
    
    <c:set target="headerBacking" scope="request"  property="secondLevel" value="-----yeeee-----"/>
    <h:outputText value="#{headerBacking.secondLevel}"/>




а так же разметка в конфиге faces.xml


Код


<managed-bean>
    <managed-bean-name>headerBacking</managed-bean-name>
    <managed-bean-class>lt.it.webforce.framework.backing.header.HeaderBacking</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>







Когда запускаю страничку, на екране ->

"
--- first---
--- first---
"
Код



Другими словами стандартный JSTL не пашет в ЙСФ.

Так же пробовал в ЙСФ странице написатЬ скриптлет

Код



String a = (String) request.getAttribute("headerBacking");

System.out.println("---" + a)

 

a = null  после етого...


Код




String a = (String) request.getAttribute("headerBacking");

System.out.println("---" + a)

 


а если сделатЬ так:

Код



FacesContext fc = FacesContext.getCurrentInstance();
        HttpServletRequest requestFaces = (HttpServletRequest) fc.getExternalContext().getRequest();
String a = (String) requestFaces.getAttribute("headerBacking");

System.out.println("---" + a)




То получаю верное значение а.

Но сетитЬ атрибут всё равно нелЬзя - беан после етого пересоздаётся и в нём находится то, что укладивает конструктор...

На етот вопрос помоему однозначного ответа нету... Мне никто не помог :-|

Автор: Maksym 4.6.2007, 12:11
Цитата(PashaOvechkin @  3.6.2007,  11:16 Найти цитируемый пост)
На етот вопрос помоему однозначного ответа нету... Мне никто не помог :-|

Это все понятно, а в чем собственно проблема? что нужно сделать?

Автор: PashaOvechkin 4.6.2007, 12:44
Set  managed bean property, from jsf page.

ЙСТЛ не помогает.

Автор: Maksym 4.6.2007, 12:57
Цитата(PashaOvechkin @  4.6.2007,  12:44 Найти цитируемый пост)
Set  managed bean property, from jsf page.

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

Автор: PashaOvechkin 4.6.2007, 13:04
Почему же противоречит? 

При загрузке йсп (йсф) странички бин находится в сессии или реквесте...

Что же мне мешает из тела  страницы изменитЬ проперти в нём? 

Другое дело что доступ к любой из scopes в йсф иначе, именно по етму йстл не работает.

Может кто знает как скриптлетом получитЬ бин из сессии например? 

session.getAttribute("");  не подходит.

Как именно хранятся манагед бини не понятно...

Автор: Maksym 4.6.2007, 13:17
PashaOvechkin
Цитата(PashaOvechkin @  4.6.2007,  13:04 Найти цитируемый пост)
Почему же противоречит?

Я имею в виду не технически, а идеологически. Изменение состояния бина из страницы не пользователем (вне логики) нарушает mvc паттерн. Что тебе мешает присвоить свое "-----yeeee-----" внутри метода-обработчика сабмита страницы? идеологически это более верно..
Цитата(PashaOvechkin @  4.6.2007,  13:04 Найти цитируемый пост)
Другое дело что доступ к любой из scopes в йсф иначе, именно по етму йстл не работает.

Может кто знает как скриптлетом получитЬ бин из сессии например? 

session.getAttribute("");  не подходит.

Никогда не пробовал рабоать с сессией напрямую из страницы (хотя участвую в больших проектах на 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 скриплеты не вставляют обычно).
Цитата(PashaOvechkin @  4.6.2007,  13:04 Найти цитируемый пост)
Как именно хранятся манагед бини не понятно... 

Хранит в соответствующем scope, если ты назначил ему сессию, то он будет в сессии. Проверь еще раз, не пытаешся ли ты его там найти до того, как он понадобился jsf (до перехода на страницу, в которой он используется).

Автор: PashaOvechkin 4.6.2007, 14:36
сессия то одна, в етом сомнений нет - доступ к ней разный... 

Оки, как из скриптлета получитЬ инстанц манагед бина? 

Или например, как в йсф страничке создатЬ локалЬную переменную? 

Автор: Maksym 4.6.2007, 14:41
Цитата(PashaOvechkin @  4.6.2007,  14:36 Найти цитируемый пост)
Оки, как из скриптлета получитЬ инстанц манагед бина? 

Через FacesContext. Объясни подробнее задачу, сдается мне что ее можно решить более прямым способом, чем ручаная модификация managed-bean внутри jsf страницы... они ведь для того и managed-bean, чтоб их jsf мэнэджил, а не программист вручную, где попало..

Автор: PashaOvechkin 4.6.2007, 14:44
ЕстЬ MenuBacking.java.

Код

<managed-bean>

    <managed-bean-name>menuBacking</managed-bean-name>
    <managed-bean-class>lt.it.webforce.framework.backing.header.MenuBacking</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
 </managed-bean>



В котором естЬ аттрибуты :

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

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