2013-04-22 6 views
3

Мне удалось заставить код делать то, что я намеревался, но я не понимаю конкретного аспекта, почему это работает. Я запускаю Seam 2.2.2 с Richfaces 3.3.3.Richfaces и JSF/AJAX Lifecycles

Вот код со страницы Xhtml:

... 
<h:form id="radiobuttontestform"> 

    <fieldset>   
     <h:panelGrid columns="3"> 

      <h:selectOneRadio layout="pageDirection" id="myRadio" value="#{actionBean.myRadioButton}"> 
       <f:selectItem itemLabel="First" itemValue="0" /> 
       <f:selectItem itemLabel="Second" itemValue="1" /> 
       <a4j:support event="onclick" ajaxSingle="true" process="myDropdown" reRender="myDropdown,myCount,test" /> 
      </h:selectOneRadio> 
      <h:panelGrid columns="1" border="0"> 
      <h:selectOneListbox size="1" id="myDropdown" value="#{actionBean.rowCountPredefined}" disabled="#{actionBean.myRadioButton != '0'}"> 
       <f:selectItem itemLabel="10" itemValue="10" /> 
       <f:selectItem itemLabel="20" itemValue="20" /> 
       <f:selectItem itemLabel="30" itemValue="30" /> 
      </h:selectOneListbox> 

      <h:inputText id="myCount" maxlength="5" value="#{actionBean.rowCountSpecified}" disabled="#{actionBean.myRadioButton != '1'}" required="true"> 
       <f:validateLongRange minimum="1" maximum="1000" /> 
       <rich:ajaxValidator event="onkeyup" for="myCount" /> 
      </h:inputText> 
      <rich:message id="errorMessage" for="myCount" ajaxRendered="true" showDetail="false" showSummary="true"> 
       <f:facet name="errorMarker">ERROR:</f:facet> 
      </rich:message> 
     </h:panelGrid> 

    </h:panelGrid> 
    </fieldset> 
    <h:outputLabel id="test" value="RadioValue: #{actionBean.myRadioButton}" /> 

    <a4j:commandButton id="show" value="Show Values in Log" action="#{actionBean.showValues}" /> 
    <a4j:commandButton id="done" value="Save and end conversation" action="#{actionBean.apply}" /> 
</h:form> 
... 

Подложка боб только простой POJO с добытчиками и сеттеров для трех свойств здесь. (MyRadioButton, rowCountPredefined, rowCountSpecified)

Это то, что я получаю: (правильный результат)

radio button example http://katzekat.de/Bilder/radio2.png

radio button example http://katzekat.de/Bilder/radio.png

Вот мое мышление:

Установка ajaxSingle истинных средств что на сервере будет обработана только радиокнопка. Выпадающий список рядом с ним не нуждается в проверке - он всегда будет содержать правильное значение. Я добавил процесс = «myDropdown», чтобы сохранить значение в бэк-файле, иначе, когда я переключаю переключатель в положение 2, выпадающее меню возвращается к его исходному значению. (Я понимаю, что это только косметика!) Я проверил это с помощью отладчика, и он действительно установил свойство в бэкэнде и все работает должным образом.

Как только переключатель переключается в положение 2, значение может быть введено в текстовое поле и будет подтверждено. Это работает отлично, и когда я переключаю переключатель в положение 1, ошибка проверки очищается, если это поле находится в состоянии ошибки. Предположительно, потому что сообщение об ошибке присутствует только в области запроса.

Перезапуск отладчика снова, когда переключатель находится в позиции 2 и вводит действительное значение в текстовом поле, при обновлении в позиции 1. обновление не ожидается. Я также ожидал этого, поскольку я говорю только радио и выпадающего меню для обработки на сервере. Это бит, который я не понимаю, - значение в текстовом поле равно сохраняется на обратной стороне. (См. 2-я ссылка выше). Где это значение для этого текстового поля сохраняется, если нет в бэкэнде?

+0

Этот вопрос может быть более полезным, если изображения не исчезли! :) – Lambart

+0

they're back - смена хозяев :-) –

+0

Ausgezeichnet! Я нашел ваш вопрос, исследуя проблемы жизненного цикла JSF. Думаю, вопрос/ответ мне не очень помогает, но это хорошо написанный вопрос. FWIW, я обнаружил, что эта страница солода очень полезна: http://balusc.blogspot.com/2006/09/debug-jsf-lifecycle.html Возможно, вы уже ее нашли или, возможно, хорошо поняли жизненный цикл JSF, но это помогло меня много. – Lambart

ответ

2

Представленные значения формы хранятся в компоненте на этапе Apply Request Values.

Например, в вашем случае javax.faces.component.html.HtmlInputText#decode метод текстового поля javax.faces.component.UIInput#setSubmittedValue. Представленные значения не заданы для компонента (как вы ожидали), поскольку компонент не включен в часть execute. Затем рендеринг inputText повторно отображает (записывает в ответ) переданные значения.

Он работает очень точно, когда проверка не выполняется. Представленные значения сохраняются на фазе Apply Request Values, а затем из-за неудачной проверки представленные значения не установлены в beans (фаза пропускается), тогда представленные значения повторно отображаются.

+0

Привет, спасибо за ваш ответ.У меня создалось впечатление, что фазу запроса запроса не вызывали другие компоненты за пределами ajaxSingle = "true". И то, что я не мог понять, - это то, почему раскрывающийся список не сохранил его, когда я удалил процесс = «myDropdown» и текстовое поле! В качестве эксперимента я добавил в раскрывающийся список валидатор ajax (я понимаю, что в этом случае он никогда не будет запущен) и удалил процесс из моего тега поддержки. Это также оставило ценность при обратной передаче. –

+0

Кроме того, я только что прочитал, что богатые: ajaxValidator пропускает все фазы JSF, за исключением проверки! Теперь это имеет гораздо больший смысл - я настраиваю PhaseListener и вижу, что это представление восстановления, применение значений запроса, проверки процесса и ответа рендеринга вызываются, когда я использую валидатор ajax. Благодаря! –

Смежные вопросы