ICEfaces 2 действительно работает? - PullRequest
1 голос
/ 27 мая 2011

Согласно документации, это должен быть самый простой в мире продукт для использования:

Просто добавьте icefaces.jar в приложение, и к странице будет применен рендеринг Direct-to-Dom (D2D).

Но даже их самый основной учебник Начало работы с ICEfaces 2 не работает. Я загрузил код внизу страницы, встроил его в WAR и развернул на Tomcat 6.0.32 и Tomcat 7.0.14. Первое, что я заметил, было то, что по какой-то причине составной компонент не работал:

/ job-Applic.xhtml @ 39,78 Следующие атрибуты являются обязательными, но для них не было предоставлено значений: id.

Но это больше похоже на проблему с JSF ( JSF 2 Компонент обязательный атрибут бросает исключение ), поэтому я решил эту проблему, удалив обязательный атрибут ID (хотя все равно обязательный = "true" "на стоимости, которая, кажется, не имеет проблемы). Во всяком случае, теперь приложение развертывается. И, как уже говорилось, он использует вызов AJAX, когда вы нажимаете кнопку «Очистить», в результате чего получается полный DOM для формы в XML-ответе. Следующим шагом является добавление icefaces.jar, и предполагается, что он добавит функциональность Direct-to-DOM, которая обеспечит отправку в ответ только различий:

ICEfaces 2 отображает разметку компонента в DOM на стороне сервера (объектная модель документа), которая отражает текущее представление клиента. Каждый раз, когда жизненный цикл JSF запускается, выполняется сравнение DOM, и, если есть какие-либо изменения, краткий набор обновлений страницы отправляется обратно клиенту для применения к странице. Мы называем это Direct-to-DOM или D2D рендерингом.

Тем не менее, я получаю полную форму в качестве ответа, а также некоторые дополнительные строки ICEfaces вроде этого:

<input name="ice.window" type="hidden" value="epgo74zmvc" />
<input name="ice.view" type="hidden" value="vs4ik661" />

Так ясно, что ICEfaces что-то делает, но НЕ то, что обещал. Это на самом деле длиннее, чем простой ответ AJAX. Поэтому, игнорируя тот факт, что это действительно более широкий ответ, я перешел к следующему обещанию:

При рендеринге Direct-to-DOM нам больше не нужен тег f: ajax, вложенный в нашу кнопку «Очистить»

Звучит прямо, верно? В примере на странице они просто перемещают выражение EL для слушателя из тега f: ajax в тег h: commandButton. Проблема в том, что сигнатуры методов разные. Предполагается, что это учебное пособие Getting Started , но на самом деле вам все равно, как пройтись по шагам. В любом случае, я могу это исправить, изменив сигнатуру метода clearForm в компоненте поддержки, чтобы его аргумент был теперь и ActionEvent вместо AjaxBehaviorEvent. Делая это, ICEfaces фактически заменяет то, что было бы действием целой страницы, действием AJAX, что довольно невероятно, но у меня все еще есть кислый вкус во рту. У кого-нибудь есть идеи, почему D2D не работает? Я делаю что-то неправильно? Стоит ли мне еще использовать ICEfaces?

Ответы [ 2 ]

0 голосов
/ 06 сентября 2013

После того, как ICEfaces произвел сравнение DOM, ему необходимо отправить обновление.Чтобы сообщить клиентской части моста, куда поместить обновленный контент, ICEfaces необходимо указать некоторый известный идентификатор узла DOM-предка.Средство визуализации на стороне сервера знает только идентификаторы компонентов JSF, как автоматически сгенерированные, так и указанные вручную.Он не может обращаться к необработанному тегу HTML.Так что мое лучшее предположение для вашего наблюдения за полным обновлением - то, что вы используете много тегов HTML.

Еще одна вещь, связанная с мостом D2D и ICEfaces, заключается в том, что он не может добавлять или удалять дочерний элемент.Он может полностью заменить только ID-адресный тег.Поэтому, если вы добавите новую строку в таблицу, вся таблица будет обновлена.

Хотя мои знания основаны на ICEfaces 1.8.2.

0 голосов
/ 27 мая 2011

Почему вы предполагаете, что это работает неправильно?

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

Здесь действительно используется AJAX, но ему нужно отправить всю модель DOM, иначе логика на стороне сервера может искать устаревшие данные.

Это не просто ICEFaces, это JSF. На самом деле, это в основном похоже на то, как работает ASP.NET. Смотрите эту ссылку, чтобы понять жизненный цикл JSF.

http://balusc.blogspot.com/2006/09/debug-jsf-lifecycle.html

Извините, если это не то, что вы ожидаете от технологии.

...