JSF Жизненный цикл и пользовательские компоненты

голоса
16

Есть несколько вещей, которые я имею трудное время понимание в отношении разработки пользовательских компонентов в JSF. Для целей этих вопросов, можно предположить, что все пользовательские элементы управления использует valuebindings / выражения (не буквальная привязку), но я заинтересован в объяснениях на них.

  1. Где я устанавливаю значение для valuebinding? Является ли это должно произойти в декодировании? Или декодировать делать что-то другое, а затем имеют значение, установленное в encodeBegin?
  2. Чтение из стоимости Binding - Когда я читаю данные из valuebinding по сравнению с чтением его из submittedvalue и положить его в valuebinding?
  3. Когда слушатели действий по формам называется в связи со всем этим? Страницы JSF жизненным циклом все упоминания события, происходящие на различных этапах, но не совсем ясно для меня, когда только простой слушатель для CommandButton в настоящее время называется

Я попробовал несколько комбинаций, но всегда в конечном итоге с трудно найти ошибки, которые я считаю, приходящие из основных заблуждениях жизненного цикла событий.

Задан 28/08/2008 в 22:48
источник пользователем
На других языках...                            


4 ответов

голоса
18

Существует довольно хорошая схема в спецификации JSF , которая показывает жизненный цикл запроса - существенную для понимания этого материала.

Шаги:

  • Восстановить вид . UIComponent дерево перестраивается.
  • Применить запрос значения . Редактируемые компоненты должны реализовать EditableValueHolder. Эта фаза идет дерево компонентов и вызывает processDecodes методу. Если компонент не является чем - то сложным , как UIData, он не будет делать , кроме назвать свой расшифровывает метод. Расшифровывает метод не делать , за исключением найти ее визуализации и вызывает его декодирования метод, передавая себя в качестве аргумента. Это работа Renderer, чтобы получить какое - либо представленное значение и установить его с помощью setSubmittedValue .
  • Процесс Валидация . Эта фаза требует processValidators , который будет вызывать Validate . Validate метод принимает значение , представленное, преобразует его с любыми преобразователями, проверяет его с любыми валидаторов и (предполагая , что данные проходит эти тесты) вызывает SetValue . Это сохранит значение в качестве локальной переменной. Хотя это локальная переменная не равно нулю, то он будет возвращен , а не значение из значения связывания на любые вызовы GetValue .
  • Обновление моделей значений . Эта фаза требует processUpdates . В качестве входного компонента, это будет вызывать UpdateModel , который получит ValueExpression и вызвать его , чтобы установить значение на модели.
  • Вызов приложения . Кнопка слушателей событий и так далее будет вызываться здесь (как будет навигации , если память не изменяет).
  • Рендер ответ . Дерево визуализируется через рендерер и состояние сохраняется.
  • Если какие-либо из этих фаз не работает (например, значение является недопустимым), жизненный цикл переходит к визуализации ответа.
  • Различные события могут быть запущены после того, как большинство из этих фаз, вызывая слушатель, как соответствующие (например, изменение значения слушателей после процесса Validations).

Это несколько упрощенный вариант событий. Обратитесь к спецификации для получения более подробной информации.

Я бы вопрос, почему вы пишете свой собственный UIComponent. Это нетривиальная задача, и глубокое понимание архитектуры JSF требуется, чтобы получить это право. Если вам нужен пользовательский элемент управления, то лучше создать конкретный контроль, который расширяет UIComponent существующее место (как HtmlInputText делает) с эквивалентным визуализатора.

Если загрязнение не является проблемой, есть реализация с открытым исходным кодом JSF в виде Apache MyFaces.

Ответил 29/08/2008 в 16:09
источник пользователем

голоса
3

Действие слушатели, например, для CommandButton , называются во время Invoke Application фазы, которая является последним этапом перед заключительной Визуализацией Ответа фазы. Это показано в The JSF Жизненный цикл - рисунок 1 .

Ответил 29/08/2008 в 12:14
источник пользователем

голоса
2

Это единственная основа, что я когда-либо использовал, где создание компонент представляет собой глубокий сложный процесс, как это. Ни один из других фреймворков (будь то в мире .NET или нет) не делают это настолько болезненным, что совершенно необъяснимо для меня.

Некоторые из проектных решений за JSF начинают делать немного больше смысла , если учесть цели. JSF был разработан , чтобы быть тиснения - это подвергает много метаданных для IDE. JSF не фреймворк - это MVP рамки , которые можно использовать в качестве веб - основы. JSF является очень расширяемым и настраиваемым - вы можете заменить 90% от реализации на основе каждого приложения.

Большая часть этого материала просто делает вашу работу более сложной, если все, что вы хотите сделать, это скольжение в дополнительном контроле HTML.

Компонент представляет собой композицию из нескольких inputtext (и других) базовых компонентов, кстати.

Я предполагаю, что JSP-включает / оснастки на основе фрагментов страницы не соответствует вашим требованиям.

Я хотел бы рассмотреть с помощью UIComponentELTag.createComponent для создания составного элемента управления с базой UIPanel и создания всех своих детей из существующих реализаций. (Я предполагаю , что вы используете ЯОРН / библиотеки тегов и сделать несколько других предположений.) Вы, вероятно , хотите пользовательский рендерер , если ни один из существующих UIPanel рендереров не сделал свою работу, но рендеры легко.

Ответил 29/08/2008 в 18:02
источник пользователем

голоса
1

Лучшая статья я нашел J компонент Запись , как и для 2 , где я читаю значение для связывания значения в компоненте у вас есть поглотитель , который выглядит следующим образом


public String getBar() {  
     if (null != this.bar) {  
         return this.bar ;  
     }  
     ValueBinding _vb = getValueBinding("bar");  
     return (_vb != null) ? (bar) _vb.getValue(getFacesContext()) : null;  
}
  

как же это попасть в getValueBinding? В вашем методе setProperties класса тега

  if (bar!= null) {  
         if (isValueReference(bar)) {  
             ValueBinding vb = Util.getValueBinding(bar);  
             foo.setValueBinding("bar", vb);  
         } else {  
             throw new IllegalStateException("The value for 'bar' must be a ValueBinding.");  
         }  
     }  
Ответил 16/09/2008 в 15:15
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more