<context-param>
<param-name>javax.faces.ENABLE_WEBSOCKET_ENDPOINT</param-name>
<param-value>true</param-value>
</context-param>
Java Platform, Enterprise Edition (Java EE) 8 Учебник по Java EE |
Назад | Вперёд | Содержание |
Чтобы настроить веб-сокеты для использования в веб-приложениях JSF, сначала включите конечную точку веб-сокета, используя контекстный параметр в web.xml
:
<context-param>
<param-name>javax.faces.ENABLE_WEBSOCKET_ENDPOINT</param-name>
<param-value>true</param-value>
</context-param>
Если ваш сервер настроен для запуска контейнера веб-сокетов на порте TCP, отличном от контейнера HTTP, вы можете использовать необязательный целочисленный контекстный параметр javax.faces.WEBSOCKET_ENDPOINT_PORT
чтобы явно указать порт:
<context-param>
<param-name>javax.faces.WEBSOCKET_ENDPOINT_PORT</param-name>
<param-value>8000</param-value>
</context-param>
Объявите тег f:websocket
в представлении JSF с именем канала и функцией JavaScript слушателя onmessage
.
Следующий пример ссылается на существующую функцию слушателя JavaScript:
<f:websocket channel="someChannel"
onmessage="someWebsocketListener" />
function someWebsocketListener(message, channel, event) {
console.log(message);
}
В этом примере объявляется встроенная функция слушателя JavaScript:
<f:websocket channel="someChannel"
onmessage="function(m){console.log(m);}" />
Функция слушателя JavaScript onmessage
вызывается с тремя аргументами:
message
: push-сообщение как объект JSON
channel
: название канала
event
: объект MessageEvent
При успешном подключении веб-сокет открывается по умолчанию до тех пор, пока документ открыт, и он будет автоматически переподключаться с увеличивающимися интервалами, когда соединение закрыто или прервано, в результате таких событий, как ошибка сети или перезагрузка сервера. Он не будет автоматически переподключён, если первая попытка подключения не удалась. Веб-сокет будет неявно закрыт после выгрузки документа.
В коде Java инъецируйте PushContext
используя аннотацию @Push
на заданном канале в любом Managed-бине CDI, таком как @Named
или @WebServlet
, куда вы хотите отправить push-сообщение. Затем вызовите PushContext.send(Object)
с любым объектом Java, представляющим push-сообщение.
Например:
@Inject @Push
private PushContext someChannel;
public void sendMessage(Object message) {
someChannel.send(message);
}
По умолчанию имя канала берётся из имени переменной, в которую происходит инъецирование.
При желании имя канала можно указать с помощью атрибута channel
. В следующем примере контекст вставки для имени канала foo
инъецируется в переменную bar
.
@Inject @Push(channel="foo") private PushContext bar;
Объект сообщения будет закодирован как JSON и доставлен в качестве аргумента сообщения функции слушателя JavaScript onmessage
, связанной с именем канала. Это может быть строка, коллекция, отображение (Map) или JavaBean.
Назад | Вперёд | Содержание |