Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

JSF bean scope

276
17 февраля 2009 года
Rebbit
1.1K / / 01.08.2005
Здраствуйте.
Я в Java технологиях начинающий. Вот начал розбираться в JSF. Подтолкнули меня к етому потребности по роботе и знакомство с библиотекой RichFaces, которая мне очень понравилась. По ходу изучения возник вопрос. В JSF для бина нет page scope. Соответсвенно приходится выбирать между request scope & session scope. Так как компоненты RichFaces активно используют ajax request scope в большинстве случаев оказывается недостаточно, а session scope насколько я понимаю не безопасно (если я правильно понимаю то 2-мя табами такой бин можно легко поломать). Мне подсказали как решение [SIZE=2]Tomahawk save state component который (опять же если я правильно понимаю) емитирует [/SIZE]page scope с помощю сериализацыи/десериализацыи бина с request scope.
Поскольку опыта у меня нет хочу спросить хорошое ли ето решение.
Как вы (те кто работает с JSF и возможно с RichFaces) решаете проблему синхронизацыи доступа к session scope бинам. Возможно я делаю проблему там где ее нет ? или не вижу чегото совсем очевидного ?

ЗЫ. tomahawk save state немного пугает ограничением bean implements Serializable
355
17 февраля 2009 года
<SCORP>
786 / / 21.10.2006
пользуем сейчас в проект IceFaces - тоже полностью AJAX"овая JSF библиотека - все бины request scope, никаких проблем. как конкретно с RichFaces не знаю. а ты пробовал вообще?
если честно, то не совсем понимаю, как конкретно это работает. но, судя по логам, "риквестовые" бины создаются явно не на каждый HTTP запрос. они создаются только тогда, когда загружается страница, а потом, когда гоняются AJAX запросы, пользуются уже созданые экземпляры.
276
18 февраля 2009 года
Rebbit
1.1K / / 01.08.2005
[quote=<SCORP>;276274]пользуем сейчас в проект IceFaces - тоже полностью AJAX"овая JSF библиотека[/quote]
Спасибо за наводку. Нравится, хотя детально пока не смотрел.

[quote=<SCORP>;276274]все бины request scope, никаких проблем. как конкретно с RichFaces не знаю. а ты пробовал вообще?[/quote]
Да пробовал. А сегодня решил еще раз попробовать и вродь все получается. Долго не мог понять что меня не устраивало. Но таки понял. Вот смотри что у меня было без saveState и с request scope:
jsp
 
Код:
<h:inputText value = "#{BackingBean.name}">
        <a4j:support event="onchange" reRender="out" />
    </h:inputText>
   
    <h:outputText id="out" value = "#{BackingBean.name}" />
тоесть при снятие фокуса с инпута аяксом пошли к серверу, установили BackingBean.name и перерисовали текст out

сам бин
Код:
public class BackingBean implements Serializable
{
   
    private String name;

    public String getName()
    {
        return name;
    }
   
    public void setName(String value)
    {
        name = value;
    }
   
}
Все вроди роботает как должно. Сложылась у меня илюзия что на все реквесты один бин. Пол часа не мог понять в чем была тогда проблема.
А она была следующая. Припустим надо выводить не последнее значение из инпута, а предыдущее. Меняю бин так
Код:
public class BackingBean implements Serializable
{
   
    private String name;
    private String prev;

    public String getName()
    {
//        return name;
        return prev;
    }
   
    public void setName(String value)
    {
        prev = name;
        name = value;
    }
   
}
По большому щету я делаю плохо, потомучто нужно 2 геттера для текущего значения и для предыдущего, но поскольку текущего значения мне не нужно, я оставил все как есть для минимизацыи изменений в етом примере. И что получается. getName() постоянно возвращает null что понятно поскольку тот бин который используется для прорисовки текста каждый раз новый.
При добавлении в jsp <t:saveState value="#{BackingBean}" /> перед его использованием все идет по плану. при первом снятии фокуса с инпута еще ничего не видно, а при втором выводится предыдущее значение.

[quote=<SCORP>;276274]если честно, то не совсем понимаю, как конкретно это работает. но, судя по логам, "риквестовые" бины создаются явно не на каждый HTTP запрос. они создаются только тогда, когда загружается страница, а потом, когда гоняются AJAX запросы, пользуются уже созданые экземпляры.[/quote]
А вот ето я обязательно попробую руками.
63
19 февраля 2009 года
Zorkus
2.6K / / 04.11.2006
Сорри что нету времени на внимательный разбор темы и развернутый ответ, но один хинт дам.
Это же все реализовано поверх сервлетов, а у сервлетов когда запрос приходит на сервер, и осуществляется его форвардинг, параметры запроса (читай - state) передаются дальше. Может, поможет?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог