JSF 2.3 +
Для этого вы можете использовать @Push
и <f:websocket>
. Ниже приведен пример запуска, который обновляет таблицу данных после события в области приложения, запущенного серверной частью.
<h:dataTable id="notifications" value="#{bean.notifications}" var="notification">
<h:column>#{notification.message}</h:column>
</h:dataTable>
<h:form>
<f:websocket channel="push">
<f:ajax event="updateNotifications" render=":notifications" />
</f:websocket>
</h:form>
@Named @ApplicationScoped
public class Bean {
private List<Notification> notifications;
@Inject
private NotificationService service;
@Inject @Push
private PushContext push;
@PostConstruct
public void load() {
notifications = service.list();
}
public void onNewNotification(@Observes Notification newNotification) {
notifications.add(0, newNotification);
push.send("updateNotifications");
}
public List<Notification> getNotifications() {
return notifications;
}
}
@Stateless
public class NotificationService {
@Inject
private EntityManager entityManager;
@Inject
private BeanManager beanManager;
public void create(String message) {
Notification newNotification = new Notification();
newNotification.setMessage(message);
entityManager.persist(newNotification);
beanManager.fireEvent(newNotification);
}
public List<Notification> list() {
return entityManager
.createNamedQuery("Notification.list", Notification.class)
.getResultList();
}
}
JSF 2.2-
Если вы еще не используете JSF 2.3, вам нужно обратиться к сторонним библиотекам JSF.
Следует отметить, что <o:socket>
был основой для JSF 2.3 <f:websocket>
. Так что если вы нашли много общего, то это правильно.
PrimeFaces использует Атмосфера под капотами (что сложно настроить без Maven). Атмосфера поддерживает веб-сокеты с переходом на SSE и длительным опросом. ICEfaces основан на древней технике long polling . Все они не реализуют собственный API-интерфейс JSR356 WebSocket, который был представлен только позже в Java EE 7.
OmniFaces использует собственный JSR356 WebSocket API (поддерживается на всех серверах Java EE 7 и Tomcat 7.0.27+). Поэтому его также проще всего настроить и использовать (один JAR, один контекстный параметр, один тег и одна аннотация). Для этого требуется только CDI (нетрудно установить на Tomcat ), но он позволяет вам даже выдвигать артефакты не из JSF (например, @WebServlet
). В целях безопасности и сохранения состояния просмотра JSF он поддерживает только одностороннюю передачу (сервер-клиент), а не наоборот. Для этого вы можете продолжать использовать JSF ajax обычным способом. JSF 2.3 <f:websocket>
в основном основан на OmniFaces <o:socket>
, поэтому вы обнаружите много общего в их API ( JSF - OmniFaces ).
Кроме того, вы также можете использовать опрос вместо нажатия. Практически каждая библиотека JSF, поддерживающая ajax, имеет компонент <xxx:poll>
, такой как PrimeFaces с <p:poll>
. Это позволяет отправлять каждые X секунд ajax-запрос на сервер и обновлять содержимое при необходимости. Это только менее эффективно, чем толчок.
Смотри также: