|
|
|
JSF востановление значений , ajax
|
|||
|---|---|---|---|
|
#18+
Здравствуйте ! Посоветуйте, плиз, куда "копать" ? Вводная часть : есть форма , на ней поля : <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 бинов. Происходит какое то восстановление состояния. Или я ошибаюсь ? Подскажите куда "копать" ? где посмотреть и как понять что происходит ? Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2013, 14:42:33 |
|
||
|
JSF востановление значений , ajax
|
|||
|---|---|---|---|
|
#18+
долго обьяснять, суть сводится к тому что вот так работают инпуты в jsf. Во время валидации вам не нужно рендерить саму форму, если валидация обломалась. Вам нужно рендерить только rich:messages ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2013, 15:05:29 |
|
||
|
JSF востановление значений , ajax
|
|||
|---|---|---|---|
|
#18+
не понял , как это можно сделать ? вот у меня валидатор стоит : <f:validateLength minimum="1" maximum="50" /> в нем нету свойства render вообще ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2013, 15:09:16 |
|
||
|
JSF востановление значений , ajax
|
|||
|---|---|---|---|
|
#18+
Можно еще так: если не стоит задача запостить на сервер всю форму, а только значения из конкретных инпутов, то их идентификаторы передаем в атрибуте process: Код: html 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2013, 15:21:59 |
|
||
|
JSF востановление значений , ajax
|
|||
|---|---|---|---|
|
#18+
в RichFaces 4 у <a4j:jsFunction нету свойства process :-( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2013, 15:24:50 |
|
||
|
JSF востановление значений , ajax
|
|||
|---|---|---|---|
|
#18+
vlad_nalв RichFaces 4 у <a4j:jsFunction нету свойства process :-(да, API при переходе с 3 на 4 немного поменялось. Похоже, теперь этот атрибут называется execute ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2013, 15:35:53 |
|
||
|
JSF востановление значений , ajax
|
|||
|---|---|---|---|
|
#18+
Точно ! совсем про него забыл ! СПАСИБО !!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2013, 15:45:07 |
|
||
|
JSF востановление значений , ajax
|
|||
|---|---|---|---|
|
#18+
Блин ! 3 дня бился ! СПАСИБО ! А все таки , разрешите поинтересоваться , в плане повышения образованности : в какой момент происходит восстановление значений в инпутах ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2013, 15:49:21 |
|
||
|
JSF востановление значений , ajax
|
|||
|---|---|---|---|
|
#18+
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 имеем новые данные ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2013, 16:32:26 |
|
||
|
JSF востановление значений , ajax
|
|||
|---|---|---|---|
|
#18+
ivanra, Огромное спасибо за ответ! Только из всего написанного не понятно, почему до submit - ajax работает нормально , а после перестает работать ? что меняется в жизненном цикле после попытки submit ? другая последовательность обработки ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2013, 16:55:03 |
|
||
|
JSF востановление значений , ajax
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2013, 09:31:14 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38424622&tid=2128429]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
198ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 195ms |
| total: | 474ms |

| 0 / 0 |
