powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JSF востановление значений , ajax
12 сообщений из 12, страница 1 из 1
JSF востановление значений , ajax
    #38424505
vlad_nal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте !
Посоветуйте, плиз, куда "копать" ?

Вводная часть :
есть форма , на ней поля :
<h:outputText value="#{firmsBean.firms.name}" />
<h:inputText value="#{docEditBean.doc.cliFrom.name}" onblur="firnExist(this.value, '');"/>

к этому полю привязан ajax запрос :
<a4j:jsFunction name="firnExist" action="#{docEditBean.setValClientFrom()}" render="GeditFirm,SelectFForm,FirmEditForm">
<a4j:param name="param1" assignTo="#{firmsBean.FName}" />
<a4j:param name="param2" assignTo="#{firmsBean.FInn}" />
</a4j:jsFunction>
запрос смотри есть ли такая фирма и в бинах выставляет нужные поля, если есть.
В том числе поля: docEditBean.doc.cliFrom.name и firmsBean.firms.name

docEditBean и firmsBean - имеют @ViewScoped
на форме стоят rich:validator

Теперь собственно описание проблемы :
ДО того как на форме происходит первый раз submit, ВСЕ работает идеально !
ввожу название фирмы, срабатывает ajax, обновляется поля h:outputText и h:inputText, все ок!

КАК ТОЛЬКО пытаюсь сделать submit и он не проходит (не пускают валидаторы, остальных полей формы, но это правильно, я именно эту ситуацию и тестирую ! ) :
Поле <h:outputText value="#{firmsBean.firms.name}" /> - по прежнему нормально обновляется
а поле <h:inputText value="#{docEditBean.doc.cliFrom.name}" - восстанавливает прежнее значение !
причем в bean-е значение docEditBean.doc.cliFrom.name - новое !

Я так подозреваю что это связанно с @ViewScoped бинов. Происходит какое то восстановление состояния.
Или я ошибаюсь ?
Подскажите куда "копать" ? где посмотреть и как понять что происходит ?
Спасибо!
...
Рейтинг: 0 / 0
JSF востановление значений , ajax
    #38424551
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
долго обьяснять, суть сводится к тому что вот так работают инпуты в jsf. Во время валидации вам не нужно рендерить саму форму, если валидация обломалась. Вам нужно рендерить только rich:messages
...
Рейтинг: 0 / 0
JSF востановление значений , ajax
    #38424554
vlad_nal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не понял , как это можно сделать ?
вот у меня валидатор стоит :
<f:validateLength minimum="1" maximum="50" />
в нем нету свойства render вообще
...
Рейтинг: 0 / 0
JSF востановление значений , ajax
    #38424576
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно еще так: если не стоит задача запостить на сервер всю форму, а только значения из конкретных инпутов, то их идентификаторы передаем в атрибуте process:
Код: html
1.
2.
<a4j:jsFunction name="firnExist" action="#{docEditBean.setValClientFrom()}" render="GeditFirm,SelectFForm,FirmEditForm" 
process="тут идентификаторы полей через запятую">
...
Рейтинг: 0 / 0
JSF востановление значений , ajax
    #38424580
vlad_nal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в RichFaces 4 у <a4j:jsFunction нету свойства process
:-(
...
Рейтинг: 0 / 0
JSF востановление значений , ajax
    #38424600
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vlad_nalв RichFaces 4 у <a4j:jsFunction нету свойства process
:-(да, API при переходе с 3 на 4 немного поменялось. Похоже, теперь этот атрибут называется execute
...
Рейтинг: 0 / 0
JSF востановление значений , ajax
    #38424616
vlad_nal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Точно ! совсем про него забыл !
СПАСИБО !!!
...
Рейтинг: 0 / 0
JSF востановление значений , ajax
    #38424622
vlad_nal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блин ! 3 дня бился !
СПАСИБО !

А все таки , разрешите поинтересоваться , в плане повышения образованности : в какой момент происходит восстановление значений в инпутах ?
...
Рейтинг: 0 / 0
JSF востановление значений , ajax
    #38424678
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
100% точно не скажу, но процесс примерно такой. JSF запрос проходит 6 фаз:
RESTORE_VIEW - восстанавливается сохраненное дерево компонентов. Оно содержит старые значения, отданные в прошлый раз при отрисовке формы (UIInput.value)
APPLY_REQUEST_VALUES - прием новых значений (в UIInput.submittedValue)
PROCESS_VALIDATIONS - валидация новых значений. Если она не прошла, то переходим на RENDER_RESPONSE в случае обычного сабмита. В случае с AJAX запросом в Richfaces, при неудачной валидации, видимо, переходим на INVOKE_APPLICATION
UPDATE_MODEL_VALUES - обновляются поля в модели (UIInput.submittedValue -> UIInput.value), и бинах. Тут вызываются методы контроллера valueChangeListener
INVOKE_APPLICATION - вызов методов контроллера (actionListener, action)
RENDER_RESPONSE - отрисовка ответа, сохранение дерева компонентов в сессии или в ответе клиенту (в зависимости от настроек JSF).

Это примерный сценарий, возможно где-то неточности!

Таким образом, при ошибках в JSF валидации:
- в случае обычного JSF запроса INVOKE_APPLICATION не вызывается
- в случае ajax-запроса richfaces все-таки вызывает INVOKE_APPLICATION, но значения в модели (UIInput.value) при этом старые. Если указываем конкретно поля, которые следует обработать, то только они и обрабатываются в фазах 2-5, поэтому если в них нет ошибки, то происходит частичное обновление модели, и на фазе INVOKE_APPLICATION имеем новые данные
...
Рейтинг: 0 / 0
JSF востановление значений , ajax
    #38425738
vlad_nal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ivanra,

Огромное спасибо за ответ!

Только из всего написанного не понятно, почему до submit - ajax работает нормально , а после перестает работать ?
что меняется в жизненном цикле после попытки submit ?
другая последовательность обработки ?
...
Рейтинг: 0 / 0
JSF востановление значений , ajax
    #38426085
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vlad_nalТолько из всего написанного не понятно, почему до submit - ajax работает нормально , а после перестает работать ?
что меняется в жизненном цикле после попытки submit ?
другая последовательность обработки ?
Тоже замечал такую особенность, никаких объяснений в документации не нашел, а под отладчиком выяснил вот что: до первого полноценного submit-а дерево компонент jsf view в сессии не сохраняется (а значит, и ViewScoped бины тоже). То есть возможны 2 ситуации:
1- когда страница открывается JSF методами (с помощью action), и тогда идет post и get - запрос, выполняется полный цикл из 6и фаз, и view сохраняется в сессии
2- когда страница открывается get-запросом, в этом случае выполняется только фаза RENDER_RESPONSE и view в сессии не сохраняется.
В результате последующие ajax-запросы работают по-разному.
В 1 случае ajax-запрос находит view в сессии и работает с ним почти полностью имитируя обычный jsf запрос;
Во 2 случае ajax-запрос не находит view, и строит новое представление на основе параметров, переданных в запросе. В результате имеем полное совпадение данных в бине с тем, что отправили с клиента.
Почему так, и зачем так - не знаю, может тут найдется знаток jsf, который объяснит.
А выход из этого - обрабатывать в ajax запросе только нужные поля (использовать process/execute), на то он и ajax. Если обрататываем всю форму, то фиксировать ошибки в валидаторах и в этом случае не выполнять actionListener, action.
...
Рейтинг: 0 / 0
JSF востановление значений , ajax
    #38426121
vlad_nal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ivanra,

Еще раз огромное спасибо !
довольно загадочные "грабли" :-(
по сути, никогда бы не знал о их существовании, если б не submit по enter в FireFox.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JSF востановление значений , ajax
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]