JSF 2 - очистка атрибутов компонента при загрузке страницы?

Реальный вопрос: есть ли способ очистить определенные атрибуты для всех компонентов при начальной загрузке страницы?

Справочная информация:

В моем приложении у меня есть интерфейсный уровень JSF 2.0, который общается с сервисным уровнем (сервисный уровень состоит из bean-компонентов Spring, которые внедряются в управляемые bean-компоненты).

Уровень службы выполняет свою собственную проверку, и я выполняю ту же проверку на уровне внешнего интерфейса, используя свои собственные классы проверки, чтобы попытаться каким-то образом избежать дублирования кода. Эти классы валидаторов не являются валидаторами JSF, они просто POJO.

Я выполняю только проверку действия, поэтому в методе действия я выполняю проверку, и только если оно действительно, я обращаюсь к сервисному уровню.

Когда я выполняю проверку, я устанавливаю styleClass и title в UIComponents с помощью отражения (поэтому, если UIComponent имеет методы setStyleClass(:String) или setTitle(:String), то я использую их).

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

Есть ли способ очистить атрибуты styleClass и title при каждой начальной загрузке страницы?

Спасибо,

Джеймс

P.S. Я использую метод действия для проверки из-за некоторых проблем, которые у меня были раньше с JSF 1.2 и его методами проверки, но не могу вспомнить, почему... поэтому я использую метод действия для проверки.


person jamiebarrow    schedule 18.03.2010    source источник
comment
должен ли я реализовать PhaseListener? Я мог бы очистить их для компонентов, из которых я хочу их очистить в управляемом компоненте, но PhaseListener может избавить меня от необходимости делать это вручную для каждого компонента? Я бы не стал очищать styleClass, просто удалив из него определенный класс "ошибок", так что думаю, что это может быть возможным решением... это PhaseListener путь, и на какой фазе он должен действовать, я предполагаю, что первая фаза   -  person jamiebarrow    schedule 18.03.2010


Ответы (1)


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

person jamiebarrow    schedule 18.03.2010
comment
Мне нужен был доступ ко всем компонентам в дереве компонентов. У PhaseListener нет доступа к этому, поэтому использование ViewHandler... неэффективно. Все еще пытаюсь найти лучшее решение. - person jamiebarrow; 23.03.2010