Юри Кац
Описание: Функция JSFTrace помогает разработчику лучше понять, как работает технология JavaServer™ Faces, а также быстрее и эффективнее отлаживать свои приложения на базе технологии JSF. Статья описывает функцию JSFTrace, введенную в версии 7.5.4 продукта IBM® Rational® Application Developer, и рассказывает, как сконфигурировать и использовать эту функцию для выявления ошибок.
В приложении на базе технологии JavaServer™ Faces (JSF) каждый запрос от браузера проходит сложную последовательность шагов до момента генерации ответа. Эта последовательность шагов (или фаз, как они называются в JSF) образует т.н. жизненный цикл JSF. Существует целый ряд условий, которые могут влиять на то, какие именно фазы указанного жизненного цикла будут выполняться и, соответственно, что будет отсылаться обратно в браузер в ответ на его запрос.
JSF-разработчики часто сталкиваются с проблемами при создании и отладке приложений. Эти проблемы могут быть обусловлены неадекватным пониманием жизненного цикла JSF или неспособностью увидеть все то, что происходит на сервере на протяжении жизненного цикла JSF.
Типичный пример такой проблемы: разработчик приложения предполагает, что когда пользователь щелкнет кнопкой на JSF-странице, это приложение переключится (перейдет) на другую страницу, однако вместо этого пользователю повторно демонстрируется прежняя страница. Причина отсутствия перехода (т.е. предоставления пользователю некорректной информации на странице) заключается в том, что JSF-технология обнаружила ошибки валидации или преобразования и по причине этих ошибок пропустила фазу, отвечающую за переход. Если разработчик не принял во внимание эту возможность и не добавил к странице специальный тег для показа ошибок (такой как <h:messages>
), то пользователь и разработчик столкнутся с затруднениями при попытке выяснить, почему была повторно показана та же самая страница.
В продукте IBM® Rational® Application Developer версии 7.5.4 появилась функция JSF Trace, которая позволяет разработчику "незаметно" заглянуть в исполняющееся JSF-приложение. Она собирает информацию о жизненном цикле JSF и в режиме реального времени представляет эту информацию в доступной для понимания форме.
Трассировка информации
После того как вы добавите к своему приложению поддержку функции JSF Trace, в процессе обработки запроса вашего браузера будет осуществляться сбор и представление следующей информация о жизненном цикле JSF (см. пример на рис. 1):
- Входящий запрос (включая информацию о пути запроса, параметры, заголовки и файлы cookie)
- Все уже выполненные фазы жизненного цикла, включая следующую информацию по каждой фазе:
- Название фазы.
- Приблизительное время, затраченное на эту фазу.
- Моментальные снимки объектов запроса, сессии и охваченных приложений, сделанные до и после данной фазы.
- Моментальные снимки представления JSF, включая атрибуты представления и дерево компонентов (типы, идентификаторы и значения компонентов), сделанные до и после данной фазы.
- Зарегистрированные сообщения (ошибки, предупреждения, информационные сообщения).
- Выполненные переходы, включая страницы-источники и целевые страницы, действие, которое вызвало переход, и результаты этого действия.
Кроме того, собранная информация трассировки подвергается определенному "декорированию" с помощью цветов, пиктограмм и преобразования шрифта. Это декорирование указывает на важнейшие события в ходе обработки запроса, такие как создание или изменение охваченных объектов (например, объекты типа JSF managed bean), на атрибуты компонентов или на компоненты, которые вообще не были отображены. Более подробная информация приведена в разделе "Условные обозначения".
Рисунок 1. Представление трассировки JSF Trace
Необходимо понимать, что трассировка существенно отличается от реальной отладки - она представляет "ретроспективные" данные. Другими словами, все объекты, показанные в представлении, существовали в некоторый прошедший момент времени, в котором осуществлялся сбор информации об этих объектах, однако они не существуют к тому времени, когда они демонстрируются в дереве. Таким образом, посредством использования представления JSF Trace невозможно инспектировать объекты так, как разработчики привыкли при отладке приложений.
Функция JSF Trace предоставляет некоторую поддержку для реальной отладки (более подробная информация приведена в разделе "Отладка"), однако ее не следует рассматривать как инструмент отладки и применять в качестве такого инструмента.
Техническая архитектура
Функция JSFTrace состоит из двух частей:
- Представление JSF Trace в инструменте Rational Application Developer.
- Файл
jsf-trace.jar
(архив Java™ или JAR) в папке WEB-INF/lib
приложения.
Файл jsf-trace.jar
устанавливает в ваше приложение несколько JSF-артефактов (PhaseListener и NavigationHandler), которые собирают информацию в процессе исполнения этого приложения на сервере. Затем собранная информация передается по сетевому соединению в представление JSF Trace инструмента Rational Application Developer, который интерпретирует эту информацию и представляет ее в удобной для понимания форме. JAR-файл и представление взаимодействуют друг с другом через настраиваемый сетевой сокет (host:port
).
В дополнение к представлению JSF Trace имеется новая консоль JSF Trace, которая показывает "сырую" информацию, полученную по сетевому сокету от исполняющегося приложения (см. рис. 2).
Рисунок 2. Консоль JSF Trace
Установка
Для того чтобы активировать поддержку трассировки в JSF-приложении, выполните следующие шаги:
- Откройте представление JSF Trace (по умолчанию, функция JSF Trace сконфигурирована на автоматическое открытие при каждом запуске вашей JSF-страницы на сервере). Представление JSF Trace покажет следующее информационное сообщение (поскольку оно пока не обнаруживает данных для отображения) (см. рис. 3).
- Нажмите на ссылку Add Tracing support (Добавить поддержку трассировки).
- Необязательно: Если в вашем рабочем пространстве имеется более одного Web-проекта, вам будет предложено выбрать, к какому из проектов вы хотите добавить трассировку.
- 4. Появится информационное сообщение, содержащее сведения о потенциальных недостатках, связанных с трассировкой. Вам предложат подтвердить, что вы действительно хотите добавить трассировку к своему проекту. После того как вы подтвердите свои намерения, файл
jsf-trace.jar
будет добавлен к папке проекта WEB-INF/lib
.
Рисунок 3. Информационное сообщение в представлении JSF Trace
После открытия представления JSF Trace и добавления файла jsf-trace.jar
к проекту опубликуйте этот проект на выбранном вами сервере, а затем запросите страницу в браузере. Представление JSF Trace обнаружит поступление информации от исполняющегося приложения и заменит показанное выше информационное сообщение реальными собираемыми данными (см. рис. 1).
Удаление ранее установленной функции JSF Trace
Для того чтобы деактивировать функцию JSF Trace в приложении, удалите файл jsf-trace.jar
из папки WEB-INF/lib
проекта или присвойте параметру контекста web.xml
с именем com.ibm.faces.trace.ENABLED
значение "false" (см. следующий раздел "Конфигурирование приложения"). Любой из этих вариантов приведет к прекращению сбора всякой трассировочной информации.
Чтобы деактивировать функцию JSF Trace в инструменте Rational Application Developer, закройте представление JSF Trace. После закрытия этого представления инструмент Rational Application Developer не будет следить за поступлением информации от исполняющихся приложений.
Конфигурирование приложения
Как показано в Таблице 1, в добавленном к проекту файле jsf-trace.jar
имеется несколько конфигурационных настроек, которые могут быть представлены в соответствующем приложению файле web.xml
как параметры контекста:
Таблица 1. Параметры
Название параметра |
Значение по умолчанию (если параметр контекста отсутствует) |
Описание |
com.ibm.faces.trace.ENABLED |
true ("истина") |
Активирует или деактивирует сбор и представление данных трассировки. Сбор данных в процессе трассировки порождает значительные "непроизводительные издержки" при работе приложения, поэтому трассировку категорически не рекомендуется применять в "производственных" приложениях. Для деактивации трассировки следует присвоить этому параметру значение false ("ложь"). Другой способ деактивации трассировки состоит в удалении файла jsf-trace.jar из приложения (см. раздел "Удаление ранее установленной функции JSF Trace"). |
com.ibm.faces.trace.HOST |
127.0.0.1 |
IP-адрес или имя машины, на которой исполняется продукт Rational Application Developer. Если указывается имя хоста, оно должно быть "разрешимым" в DNS. Технически продукт Rational Application Developer и JSF-приложение могут исполняться на различных машинах с сохранением возможности обмена информацией друг с другом. Однако брандмауэры могут заблокировать такую возможность. |
com.ibm.faces.trace.PORT |
4444 |
IP-порт, через который устанавливаются коммуникации с Rational Application Developer. Эта настройка должна соответствовать аналогичной настройке представления JSF Trace в инструменте Rational Application Developer (см. раздел "Параметры Preferences"). |
com.ibm.faces.trace.MAX_NESTING |
3 |
Определяет глубину исследования свойств охваченных объектов. Чем больше это число, тем больше времени потребуется на то, чтобы собрать информацию, передать ее в инструмент Rational Application Developer и отобразить в представлении. Проявляйте осмотрительность при увеличении этого числа. |
com.ibm.faces.trace.IGNORE |
Значения по умолчанию не предусмотрено.
Рекомендуемое значение: com.ibm.,com.sun., javax.,org.,/
Примечание. Символ "/" предназначен для более ранних JSF-реализаций, в которых состояния представления в сессии содержались в ключах /jspname. |
Разделенный запятыми список строк. Если имя охваченного объекта начинается с любой из строк в этом списке, такой объект будет проигнорирован. Информация об этом объекте не будет собираться и не будет передаваться в представление JSF Trace. При исполнении JSF-приложения существует довольно много объектов в разных областях, которые принадлежат не реальному приложению, а скорее JSF-реализации или серверному контейнеру. Эти объекты редко изменяются и редко представляют интерес для разработчиков приложений. Поэтому вы вполне можете исключить их из трассировки, чтобы улучшить производительность сбора данных и уменьшить объем сетевого трафика. |
com.ibm.faces.trace.IGNORE_APPLICATION_SCOPE |
false ("ложь") |
В случае присвоения этому параметру значения true ("истина") все охваченные приложением объекты исключаются из трассировки. Может использоваться для повышения производительности (чем меньше информации необходимо собирать, тем быстрее будет работать трассировка). |
com.ibm.faces.trace.IGNORE_SESSION_SCOPE |
false |
В случае присвоения этому параметру значения true ("истина") все охваченные сессией объекты исключаются из трассировки. Может использоваться для повышения производительности (чем меньше информации необходимо собирать, тем быстрее будет работать трассировка). |
com.ibm.faces.trace.IGNORE_REQUEST_SCOPE |
false |
В случае присвоения этому параметру значения true ("истина") все охваченные запросом объекты исключаются из трассировки Может использоваться для повышения производительности (чем меньше информации необходимо собирать, тем быстрее будет работать трассировка). |
com.ibm.faces.trace.IGNORE_VIEW_ATTRIBUTES |
false |
В случае присвоения этому параметру значения true ("истина") все атрибуты представления исключаются из трассировки. Может использоваться для повышения производительности (чем меньше информации необходимо собирать, тем быстрее будет работать трассировка). |
com.ibm.faces.trace.IGNORE_VIEW_TREE |
false |
В случае присвоения этому параметру значения true ("истина") всё дерево представления (все компоненты) исключается из трассировки. Может использоваться для повышения производительности (чем меньше информации необходимо собирать, тем быстрее будет работать трассировка). |
com.ibm.faces.trace.IGNORE_COMPONENT_VALUES |
false |
В случае присвоения этому параметру значения true ("истина") трассировка не будет "спрашивать" у компонентов их значения. Опрос значений компонентов может порождать непредсказуемые побочные эффекты, поскольку связывание значений будет оцениваться в ненадлежащей точке нормального жизненного цикла JSF. В свою очередь, это может приводить к созданию непредусмотренного объекта типа managed bean. |
com.ibm.faces.trace.TRACE_UIDATA |
false |
В случае присвоения этому параметру значения true ("истина") трассировка компонентов UI Data в дереве будет производиться посредством итеративного прохождения по модели данных, при этом будет осуществляться сбор информации о компонентах в каждой строке (вплоть до максимального числа строк). В случае присвоения этому параметру значения false ("ложь") трассировка компонентов UI Data будет включать только один экземпляр каждого компонента в UI Data. |
com.ibm.faces.trace.MAX_UIDATA_ROWS |
10 |
В случае присвоения параметру com.ibm.faces.trace.TRACE_UIDATA значения true ("истина") он ограничит число строк UI Data, включенных в трассировку. Чем больше это число, тем больше времени потребуется на то, чтобы собрать информацию, передать ее в инструмент Rational Application Developer и отобразить в представлении. Проявляйте осмотрительность при увеличении этого числа. |
Конфигурирование представления JSF Trace
Параметры Preferences
Представление JSF Trace имеет несколько конфигурационных настроек, расположенных в зоне Preferences (Предпочтения) инструмента Rational Application Developer (см. рис. 4). Для того чтобы добраться до этих настроек, выберите в меню представления пункт Customize (Настроить) или используйте обычный путь к опции Preferences: Window > Preferences > JSF Tools > Trace.
Рисунок 4. Экран Preferen ces
Настройки зоны Preferences и необходимые сведения об этих настройках:
- Communication port (Коммуникационный порт). Порт, используемый для прослушивания входящего трафика. Это значение должно соответствовать значению параметра контекста
com.ibm.faces.trace.PORT
исполняющегося приложения (см. раздел "Конфигурирование приложения").
- System objects (Системные объекты). Если имя охваченного объекта начинается с любой из строк в этом списке, такой объект будут рассматривать как "системный объект". Это означает, что этот объект принадлежит не реальному приложению, а скорее JSF-реализации или серверному контейнеру Представление может быть сконфигурировано таким образом, чтобы не выделять системные объекты при изменении их значений (чтобы избежать поступления нерелевантной информации), или вообще их не показывать (см. раздел "Фильтрация"). По умолчанию все объекты
com.ibm
, com.sun
, javax
и org
рассматриваются как системные объекты.
- Expand the tree to show new and changed objects (Развертывать дерево для показа новых и измененных объектов). Автоматическое развертывание ветвей дерева, содержащих новые или измененные объекты. Выключение этой настройки может повысить производительность представления.
- Highlight new and changed objects (Выделять новые и измененные объекты). Автоматическое выделение объектов, созданных или измененных в ходе обработки запроса, с помощью различных цветов (см. пояснения ниже).
- New value color (Цвет нового значения). Выбор цвета, который будет использоваться для выделения объектов, созданных на определенной фазе.
- Changed value color (Цвет измененного значения). Выбор цвета, который будет использоваться для выделения объектов, измененных на определенной фазе.
- Highlight system objects (Выделять системные объекты). Этот параметр определяет, нужно ли выделять системные объекты (см. выше) в случае изменения их значений.
- Show view when content changes (Показывать представление при изменении контента). Если представление открыто, но находится под другими представлениями в текущей перспективе, то оно будет размещаться на самом верху при каждом появлении новой информации трассировки, подлежащей отображению.
- Show view when Faces page is ran on the server (Показывать представление, когда Faces-страница исполняется на сервере). Представление открывается, если для JSF-страницы или для проекта выполняется операция Run On Server (Исполнять на сервере).
- Display explanation (Демонстрировать пояснения). При каждом автоматическом открытии представления JSF Trace демонстрируется информационное сообщение о причинах его открытия, что позволяет разработчику отказаться от использования функции JSF Trace.
Фильтрация
Информация, демонстрируемая в представлении JSF Trace, может быть скрыта посредством соответствующей настройки фильтра. В меню представления выберите пункт Filters (Фильтры), чтобы увидеть список доступных фильтров и включить/отключить отдельные фильтры (см. рис. 5). Например, фильтры Hide application scope (Скрыть область приложения), Hide session scope (Скрыть область сессии) и Hide request scope (Скрыть область запроса) скрывают от представления все объекты в соответствующей области, а фильтр Hide system objects скрывает объекты, которые в зоне Preferences были сконфигурированы как "системные" (см. раздел "Параметры Preferences").
Указанные фильтры можно эффективно использовать для уменьшения информационной нагрузки на представление посредством скрытия объектов, не представляющих интереса. Например, объекты, охваченные приложением, изменяются редко, что позволяет вам полностью скрыть их от представления.
Возможна одновременная активация нескольких фильтров.
Рисунок 5. Фильтры
Условные обозначения
Трассировочная информация, отображаемая в представлении, "декорируется" с использованием цветов, пиктограмм и выделения шрифта. Доступны следующие элементы декорирования:
- Объект, который был создан в процессе выполнения той или иной фазы жизненного цикла, отображается на зеленом фоне (цвет конфигурируется в зоне Preferences).
- Значение, которое было изменено в процессе выполнения той или иной фазы жизненного цикла, отображается на желтом фоне (цвет конфигурируется в зоне Preferences).
- Значение, которое было создано или изменено в процессе выполнения той или иной фазы жизненного цикла, отображается жирным шрифтом.
- Компонент, информация для которого не была предоставлена, отображается в дереве компонентов курсивом .
- Компонент с некорректной информацией отображается в дереве компонентов в сопровождении небольшой красной пиктограммы "X". Эта пиктограмма распространяется на все родительские узлы этого компонента, вплоть до узла представления.
- Фаза, в которой установлена контрольная точка (см. раздел "Отладка"), отображается с небольшой пиктограммой контрольной точки (синяя точка).
Отладка
Все описанные выше функции трассировки не требовали, чтобы сервер находился в режиме отладки. Использование опции JSF Trace позволяет увидеть массу типичной "отладочной" информации (значения различных объектов, пути исполнения), избежав при этом сложностей реальной отладки.
Тем не менее у вас по-прежнему может возникать необходимость отладки приложения. В таких случаях, когда сервер работает в режиме отладки, функция JSF Trace предоставляет две дополнительные возможности, ориентированные именно на отладку:
- Специальные контрольные точки JSF
- Выражения наблюдения (watch) для охваченных объектов и для атрибутов представления
Контрольные точки
При использовании представления JSF Trace до или после любой из фаз жизненного цикла JSF можно устанавливать контрольные точки.
Чтобы установить контрольную точку, нажмите правой кнопкой мыши на узел дерева, который предшествует нужной фазе (или следует за ней), или воспользуйтесь пунктом Breakpoints (Контрольные точки) в меню представления (см. рис. 6). После того, как контрольная точка будет установлена, на пиктограмме соответствующей фазы появляется небольшая дополнительная пиктограмма, указывающая на присутствие контрольной точки. Удаление контрольных точек производится таким же способом.
Когда приложение достигает контрольной точки, его исполнение приостанавливается, после чего разработчику становятся доступны все обычные средства отладки. Например, в представление Variables (Переменные) будет автоматически включен объект FacesContext
в его текущем состоянии. FacesContext
- это корневой узел всей информации о состоянии JSF; поэтому вы сможете просмотреть все аспекты приостановленного приложения, раскрывая различные узлы объекта FacesContext
.
Рисунок 6. Меню Breakpoints (Контрольные точки)
Выражения наблюдения (watch)
Одна из самых распространенных задач, выполняемых с приостановленным приложением, состоит в проверке состояния одного из объектов типа JSF-managed bean. Хотя все объекты типа managed bean (и другие охваченные объекты) можно отыскать посредством просмотра объекта FacesContext
, доступного в представлении Variables, этот способ отыскания нужных объектов может оказаться трудоемким и длительным. Для удобства решения этой задачи представление JSF Trace позволяет создавать т.н. выражения наблюдения ( watch ) для охваченных объектов и атрибутов представления. После того как такое выражение будет создано, в представлении Expressions (Выражения) автоматически появляется соответствующий объект.
Примечание.
Выражения типа Watch Expression оцениваются только в том случае, если исполнение кода приложения приостановлено (в классах, находящихся в папке JavaSource
проекта, например, в ваших собственных компонентах managed bean). Выражения не оцениваются, когда достигается контрольная точка в базовом коде JSF или в файле jsf-trace.jar
.
Для создания выражения наблюдения для какого-либо объекта нажмите правой кнопкой мыши в представлении и из появившегося ниспадающего меню выберите пункт Add Watch Expression (Добавить выражение Watch Expression) или воспользуйтесь пунктом Watches в меню представления (см. рис. 7).
Рисунок 7. Меню Watches (Выражения наблюдения)
Изменять и удалять существующие выражения наблюдения можно с помощью представления Expressions.
На рис. 8 показано представление Expressions (Выражения) с выражением наблюдения, добавленным для охваченного запросом bean-объекта с именем "person", а также представление Variables (Переменные), в котором демонстрируется текущее состояние объекта FacesContext
.
Рисунок 8. Представление Expressions (Выражения) и представление Variables (Переменные)