mvc - jsf tutorial
¿Cómo puede el servidor enviar cambios asíncronos a una página HTML creada por JSF? (5)
JSF 2.3+
Puede usar @Push
y <f:websocket>
para esto. A continuación se muestra un ejemplo de patada de salida que actualiza una tabla de datos sobre un evento con ámbito de aplicación disparado por el back-end.
<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-
Si aún no está en JSF 2.3, debe dirigirse a bibliotecas de JSF de terceros.
- OmniFaces tiene
<o:socket>
(JSR356 WebSocket + CDI) - PrimeFaces tiene
<p:socket>
(Atmosphere) - ICEfaces tiene ICEpush (sondeo largo)
Notado debe ser que el <o:socket>
fue la base para el JSF 2.3 <f:websocket>
. Entonces, si ha encontrado muchas similitudes, entonces eso es correcto.
PrimeFaces usa Atmosphere debajo de las carcasas (lo cual es difícil de configurar sin Maven). Atmosphere admite websockets con respaldo a SSE y larga votación. ICEfaces se basa en la antigua técnica de votación larga . Todos ellos no implementan la API nativa JSR356 WebSocket que se introdujo más tarde en Java EE 7.
OmniFaces utiliza API nativa JSR356 WebSocket (compatible con todos los servidores Java EE 7 y Tomcat 7.0.27+). Por lo tanto, también es más fácil de configurar y usar (un JAR, un parámetro de contexto, una etiqueta y una anotación). Solo requiere CDI (no es difícil de instalar en Tomcat ), pero le permite incluso presionar desde un artefacto que no sea JSF (por ejemplo, un @WebServlet
). Por razones de seguridad y mantenimiento de estado de vista JSF, solo admite la inserción unidireccional (servidor a cliente), y no al revés. Para eso puedes seguir usando JSF ajax de la manera habitual. El JSF 2.3 <f:websocket>
se basa principalmente en OmniFaces <o:socket>
, por lo tanto, encontrará muchas similitudes en sus API ( JSF - OmniFaces ).
Alternativamente, también puede usar sondeo en lugar de presionar. Prácticamente, todas las bibliotecas de componentes JSF conscientes de ajax tienen un componente <xxx:poll>
, como PrimeFaces con <p:poll>
. Esto le permite enviar exery X segundos una solicitud ajax al servidor y actualizar el contenido siempre que sea necesario. Es solo menos eficiente que push.
Ver también:
Cuando creamos una página JSF, una solicitud del cliente permite la generación de HTML dinámicamente utilizando una combinación de código Java y HTML. ¿Podemos introducir ganchos en la página HTML utilizando el marco JSF, que permite al servidor actualizar la página HTML en función de los eventos asincrónicos que ocurren más adelante en el servidor, generalmente a través de diferentes hilos?
Lo más simple para usted puede ser la introducción del componente "encuesta" de la biblioteca ajax4jsf: https://ajax4jsf.dev.java.net/nonav/documentation/ajax-documentation/entire.html#d0e1955
No necesitará la reconfiguración de la aplicación y grandes cambios en la página JSF (solo se agrega a4j: componente de encuesta)
Funcionó muy bien en algunos de mis proyectos.
No puedes empujar nada. Necesita sondear los datos de su código de cliente. Los componentes web crean la página y luego finaliza. No está destinado a seguir funcionando en busca de algún tipo de nueva información para enviarla al cliente.
Tal vez su aplicación no sea fácil de escribir como una aplicación web. Intentaría un applet conectado a un puerto de servidor para recibir nuevos eventos tal vez usando JMS. Ver este artículo http://it.toolbox.com/blogs/enterprise-web-solutions/applet-and-jms-using-glassfish-and-jdk-6-34816
Puedes echar un vistazo a Seam (consulta este artículo para ver una discusión sobre cómo usar Seam con JSF y AJAX).
Cuando usé Seam la última vez, fue bastante lento, sin embargo. Es posible que desee crear su propio componente JSF que genere JavaScript (por ejemplo, usando jQuery como se explica en este artículo ).
Si necesita actualizaciones Comet con todas las funciones (Ajax inverso), etc., vale la pena echar un vistazo a la biblioteca DWR .