К основному контенту

XPages. Диалог с пользователем. Уведомления с помощью FacesMassage. Часть 1

Для улучшения восприятия пользователем приложения, с которым он общается было бы не плохо взаимодействовать с ним через отправку ему уведомлений (например, "Документ успешно сохранен". В цикле XPages. Диалог с пользователем буду рассматривать различные варианты отправки и отображения сообщений/уведомлений пользователю, двигаясь последовательно от простейших и не самых симпатичных до вполне радующих глаз.
В определенный момент планирую перейти от OneUI темы (как в скриншотах, так и в демо-приложении) к Bootstrap, вероятно, описав нюансы подключения и перехода отдельным постом.
В конце будет получен Java-класс (Bean), отвечающий за отправку сообщений и 1-2 Custom Control для их корректных отображений.


Сегодня рассмотрим простейший вариант отправки сообщений пользователю для взаимодействия с ним.

Теоретическая часть
JSF поддерживает отправку/отображение сообщений (об ошибках или других действиях). Сообщение представляет собой класс FacesMessage (javax.faces.application.FacesMessage)
Вы можете наблюдать эту картину, если используете компонент из стандартной палитры xp:messages или xp:message для отображения ошибок при проверки введенных данных.

Отправка сообщения осуществляется через метод addMessage класса FacesContext (javax.faces.context.FacesContext). Получить экземпляр FacesContext можно через его статический метод FacesContext.getCurrentInstance().

Метод имеет следующую сигнатуру:
addMessage(String clientId, FacesMessage message), где
clientId - идентификатор компонента, с которым связано сообщение, если его не задать - глобальное сообщение.
message - собственно сам объект сообщения.

Практическое применение
Шаг 1. Java Bean
Положим начало Java-классу. В нем пока будет только 1 метод - postMessage, принимающий в качестве параметра тип сообщения (FacesMessage.Severity), заголовок и текст сообщения.
Примечания:
1. Класс не будет статическим, т.к. планируется к использованию именно, как Java Bean (т.е. предполагает наличие public конструктора без параметров
2. А вот сам метод для его удобства использования в коде будет статическим

package livescripts.util;

import java.io.Serializable;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
public class MessageBean implements Serializable {
 private static final long serialVersionUID = 1L;
 
 public static void postMessage(final FacesMessage.Severity severity, final String summary, final String detail) {
  FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(severity, summary, detail));
 }
}

Шаг 2. Подключение Java Bean
В Faces-config.xml (найти его можно, например, в Package Explorer, папка WEB-INF) прописываем загрузку нашего класса. Он нам будет нужен на протяжении всей работы, а значит его область - session

<managed-bean-name>MessageBean</managed-bean-name>
<managed-bean-class>livescripts.util.MessageBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>

Шаг 3. Отображение
Тут пока все совсем просто: кидаем на xPage компонент xp:messages...и все, дальше все будет сделано за нас.
Какие нюансы:
1. Независимо от типа сообщения мы всегда будем видеть однотипное отображение
2. Каждая отправка сообщения будет затирать предыдущее (как при Full, так и при Partial Update)
3. Если отправить в одном действии несколько сообщений - они все успешно отобразятся.

Шаг 4. Вызов
Пример для типа FacesMessage.SEVERITY_INFO:
- из Java:
MessageBean.postMessage(FacesMessage.SEVERITY_INFO, "Информация!", "Текст сообщения");

- из JavaScript:
MessageBean.postMessage(javax.faces.application.FacesMessage.SEVERITY_INFO, "Информация!", "Текст сообщения");

Посмотреть пример можно в Demo-приложении.

Если вам понравился пост, жмите +1, делитесь в соц. сетях и форумах! Буду признателен! :)

p.s. Ввел новый тег xPages-по-русски!

Комментарии

Популярные сообщения из этого блога

Занимательные алгоритмы. Поиск цикла в односвязном списке

И снова про тараканов, которые иногда возникают в голове. Как-то раз, засыпая, я задумался на курьезными задачками из своей сферы деятельности (Lotus Notes), которые можно было бы задать на собеседовании, плавно перешел к воспоминаниям о своих первых собеседования, когда опыта работы еще не было. Опыт самих собеседований у меня не велик а места, где задавались действительно интересные задачи (а не задачки типа: написать сортировку массива любым известным способом) вообще равны одному - это ABBYY. Как минимум одна задачка в списке на знание и понимание классических алгоритмов, описанных в книге Дональда Кнута -  Искусство программирования .

Unit-testing object validation when validator has DI

Summary Unit test object validation when validator(s) has a dependency. For instance, we have some custom field and cross-field validators. Want to test their combination. Additionally some of validators have dependencies, injected through constructor or setters. You're not using property injection, right? Shortcut If you are just searching for an answer, here's the fast way: Declare CustomConstraintValidatorFactory that implements javax.validation.ConstraintValidatorFactory Override getInstance method and on facing your constraint validator class instantiate it Otherwise delegate validator construction to org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorFactoryImpl Build validator factory and provide it your CustomConstraintValidatorFactory Build validator, using that factory... Go to demo project on GitHub for details:  https://github.com/MrArtemAA/blog-demos/blob/master/test-validator-with-injection/src/test/java/ru/artemaa/d

Lotus Notes FAQ. 8/9 Eclipse. Как настроить уведомления о Sametime сообщениях

Н а написание данной "инструкцию" натолкнул мой коллега. Помню, первый раз сам долго искал, как отключить постоянно выпрыгивающие уведомления о новых сообщениях в Sametime. И так, речь идет о клиентах IBM Notes 8+ версии Standart (Eclipse based). Как настроить уведомления о Sametime сообщениях?