<h:commandButton ... onclick="jsf.push.open('foo')">
<f:ajax ... />
</h:commandButton>
<f:websocket id="foo" channel="bar" scope="view" ...
connected="false" />
Java Platform, Enterprise Edition (Java EE) 8 Учебник по Java EE |
Назад | Вперёд | Содержание |
Вы можете использовать необязательный атрибут connected для управления автоматическим переподключением веб-сокета.
<f:websocket … connected="#{bean.pushable}" />
По умолчанию для атрибута connected установлено значение true
, и оно интерпретируется как инструкция JavaScript для открытия или закрытия push-соединения веб-сокета. Если значение является выражением EL и оно установлено в false
во время запроса ajax, то принудительное соединение будет явно закрыто во время oncomplete
этого запроса ajax.
Вы также можете явно установить для него значение false
и вручную открыть push-соединение на стороне клиента, вызвав jsf.push.open(clientId)
, передав идентификатор клиента компонента.
<h:commandButton ... onclick="jsf.push.open('foo')">
<f:ajax ... />
</h:commandButton>
<f:websocket id="foo" channel="bar" scope="view" ...
connected="false" />
Если вы намереваетесь использовать однократное push-уведомление и не ожидаете больше сообщений, вы можете при желании явно закрыть push-соединение со стороны клиента, вызвав jsf.push.close(clientId)
, передав компоненту ID клиента. Например, в функции слушателя JavaScript onmessage
, как показано ниже:
function someWebsocketListener(message) {
// ... jsf.push.close('foo');
}
Когда сессия или представление автоматически закрываются сервером с кодом причины закрытия 1000
(и, следовательно, не закрываются вручную клиентом через jsf.push.close(clientId)
), это означает, что время жизни сессии или представления истекло.
@ApplicationScoped
public class WebsocketObserver {
public void onOpen(@Observes @Opened WebsocketEvent event) {
String channel = event.getChannel();
// Возвращает <f:websocket channel>.
Long userId = event.getUser();
// Возвращает <f:websocket user>, если есть.
// ...
}
public void onClose(@Observes @Closed WebsocketEvent event) {
String channel = event.getChannel();
// Возвращает <f:websocket channel>.
Long userId = event.getUser();
// Возвращает <f:websocket user>, если есть.
CloseCode code = event.getCloseCode();
// Возвращает код причины закрытия.
// ...
}
Вы можете использовать дополнительную функцию слушателя JavaScript onopen
для обработки события открытия веб-сокета на стороне клиента. Эта функция вызывается при первой попытке подключения, независимо от того, будет ли она успешной. Он не будет вызываться, когда веб-сокет автоматически переподключит разорванное соединение после первого успешного соединения.
<f:websocket ... onopen="websocketOpenListener" />
function websocketOpenListener (channel) {
// ...
}
Функция слушателя JavaScript onopen
вызывается с одним аргументом: channel
(имя канала, особенно полезно, если у вас есть глобальный слушатель).
Вы можете использовать дополнительную функцию слушателя JavaScript onclose
для обработки события завершения (корректного или некорректного) работы веб-сокета. Эта функция вызывается, когда первая попытка подключения не удалась или сервер возвратил код причины закрытия 1000
(нормальное закрытие) или 1008
(нарушение политики безопасности) или было превышено максимальное кол-во попыток повторное соединения. Он не будет вызываться, если веб-сокет делает попытку автоматического переподключения при разорванном соединении после первого успешного соединения.
<f:websocket ... onclose="websocketCloseListener" />
function websocketCloseListener(code, channel, event) {
if (code == -1) {
// Веб-сокеты не поддерживаются клиентом.
} else if (code == 1000) {
// Корректное завершение (как результат истёкшей сессии или представления).
} else {
// Некорректное завершение (как результат ошибки).
}
}
Функция слушателя JavaScript onclose
вызывается с тремя аргументами:
code
: код причины закрытия в виде целого числа. Если это -1
, веб-сокет не поддерживается клиентом. Если это 1000
, то он был нормально закрыт. В противном случае, если это не 1000
, то может быть ошибка.
channel
: название канала
event
: объект CloseEvent
Назад | Вперёд | Содержание |