<h:inputText value = "#{BackingBean.name}">
<a4j:support event="onchange" reRender="out" />
</h:inputText>
<h:outputText id="out" value = "#{BackingBean.name}" />
JSF bean scope
Я в 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
если честно, то не совсем понимаю, как конкретно это работает. но, судя по логам, "риквестовые" бины создаются явно не на каждый HTTP запрос. они создаются только тогда, когда загружается страница, а потом, когда гоняются AJAX запросы, пользуются уже созданые экземпляры.
Спасибо за наводку. Нравится, хотя детально пока не смотрел.
[quote=<SCORP>;276274]все бины request scope, никаких проблем. как конкретно с RichFaces не знаю. а ты пробовал вообще?[/quote]
Да пробовал. А сегодня решил еще раз попробовать и вродь все получается. Долго не мог понять что меня не устраивало. Но таки понял. Вот смотри что у меня было без saveState и с request scope:
jsp
Код:
сам бин
Код:
public class BackingBean implements Serializable
{
private String name;
public String getName()
{
return name;
}
public void setName(String value)
{
name = value;
}
}
{
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;
}
}
{
private String name;
private String prev;
public String getName()
{
// return name;
return prev;
}
public void setName(String value)
{
prev = name;
name = value;
}
}
При добавлении в jsp <t:saveState value="#{BackingBean}" /> перед его использованием все идет по плану. при первом снятии фокуса с инпута еще ничего не видно, а при втором выводится предыдущее значение.
[quote=<SCORP>;276274]если честно, то не совсем понимаю, как конкретно это работает. но, судя по логам, "риквестовые" бины создаются явно не на каждый HTTP запрос. они создаются только тогда, когда загружается страница, а потом, когда гоняются AJAX запросы, пользуются уже созданые экземпляры.[/quote]
А вот ето я обязательно попробую руками.
Это же все реализовано поверх сервлетов, а у сервлетов когда запрос приходит на сервер, и осуществляется его форвардинг, параметры запроса (читай - state) передаются дальше. Может, поможет?