Consultar base de datos cada X segundos – java ajax jsf

Pregunta:


Lo que necesito hacer es lo siguiente, no sé porque pero si se actualiza un dato en base de datos no me lo pinta de una vez en mi vista, debo volver a correr mi proyecto para ver la actualización del dato. Me gustaría hacer un método que cada 5 segundos consulte la base de datos y me actualice el dato que quiero.

Me han dicho que puedo hacerlo con f:ajax pero no lo sé utilizar, si me pudieran dar un ejemplo para guiarme lo agradecería mucho.

La base de datos es MySQL, utilizo JavaServerFaces y la conexión la realizo por medio de JPA.

Preguntado por: Lina Cortés

Comunidad

La estrategia explicada en la respuesta de @PabloPéres-Aradros es una solución conocida como polling. Esto eso, el cliente consulta cada cierto tiempo al servidor. Debes utilizar setInterval para que un método se ejecute en un intervalo de tiempo. Sucede que JSF, por defecto, coloca ciertos parámetros en el cliente para asegurarse del estado de la vista y así evitar los ataques CSRF, de manera que utilizar el método que explica Pablo no resulta “tan sencillo” al utilizar JSF al hacerlo todo manualmente. De todas formas, JSF sí soporta realizar poll.

Si utilizas JSF puro, lo mejor sería delegar la acción a un componente con <f:ajax>:

<h:form id="idForm">
    <!-- ... contenido ... -->
    <!-- Nota: el componente DEBE ser visible, sino no se ejecutará. -->
    <h:commandButton id="idBoton" action="#{bean.metodoParaRefrescar}">
        <f:ajax render="idComponenteARefrescar" />
    </h:commandButton>
    <!-- ... contenido ... -->
</h:form>

Y crear una función JavaScript:

setInterval(function() {
        document.getElementById("idForm:idBoton").click()
    }, 3000); //cada 3 segundos, adáptalo a tus necesidades

Si utilizas una librería como PrimeFaces, considera que ya provee un componente propio para hacer poll (código adaptado de la página de ejemplos de PrimeFaces).

<h:form id="idForm">
    <h:outputText id="txtContador" value="#{bean.numero}" />
    <!--
        Cada 3 segundos ejecutar una petición y ejecutar
        de lado del servidor el método declarado en listener
    -->
    <p:poll interval="3" listener="#{bean.incrementar}"
        update="txtContador" />
</h:form>

Considera esto como un ejemplo simple. Tu método de lado del servidor puede ejecutar las llamadas a base de datos necesarias. Asimisimo, deberías medir el tiempo de respuesta del servidor y de actualización de la página para colocar el valor de tu intervalo.

Existe otra estrategia que se llama push, que consiste en que el servidor ejecuta las operaciones en intervalos de tiempo y notifica al cliente que debe actualizarse. BalusC (gurú en Java y JSF) explica cómo utilizar push en JSF en esta respuesta, traducido parcialmente:

Hasta el nuevo de JSF 2.3 <f:websocket> (issue 1396), la librería estándar de JSF no ofrece facilidades para esto. Necesidas acudir a librerías de terceros por ahora:

El nuevo componente de JSF 2.3 <f:websocket> está ampliamente basado en <o:socket>.

Para la descripción de tu problema, en mi opinión, usaría polling. De todas formas, corresponde a ti evaluar las alternativas y elegir la más conveniente a utilizar.

te hago un ejemplo de como sería el código ajax:

function ajax() {          

        var oReq = new XMLHttpRequest();
        oReq.open("POST", "tufuncionphp.php", true);

        oReq.onload = function (oEvent) {
            if (oReq.status == 200) {
                document.getElementById("divobjetivo").innerHTML = oReq.responseText;
            }
        };
        oReq.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        oReq.send(datos);
}

Te explico, para que funcione ajax, siempre hay que crear un objeto tipo XMLHttpRequest.

Lo indispensable es que en el objeto.open, introduzcas si es tipo POST o GET y la URL de tu PHP.

La función de objeto.onload se ejecuta cuando el código de PHP se ha ejecutado. El método .responseText, recoge el texto de respuesta de PHP, y luego ya lo insertas donde quieras, en mi ejemplo lo dejo preparado para que lo metas en un campo especificado por una id. En el document.getElementById(“divobjetivo”), cambia el divobjetivo por la id de tu elemento donde quieras recargar la informacion.

Por último, es en objeto.send(), se pasan los campos que quieres enviar para simular el envío de un formulario a el PHP, en formato “dato1=datos&dato2=datos2”.

Si quieres que esto se ejecute cada 5 segundos, introduces el código en un setInterval, tal que así.

function ajax() {          
setInterval(function(){
        var oReq = new XMLHttpRequest();
        oReq.open("POST", "tufuncionphp.php", true);

        oReq.onload = function (oEvent) {
            if (oReq.status == 200) {
                document.getElementById("divobjetivo").innerHTML = oReq.responseText;
            }
        };
        oReq.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        oReq.send(datos);

},5000);
}

Espero haberme explicado bien. Un saludo.

Para eso se tiene dos opciones una es que justo un momento antes de que tu consulta te regrese el resultado del comando se ejecute un comando select donde se llame nuevamente todo lo que tenga esa tabla.
La otra es la misma forma pero usando lo que con temporizadores para que cada cierto tiempo la sentencia se vuelva a ejecutar nuevamente.

Fuente

Related Posts:

Actualizar información con ajax php mysql – php jquery mysql
Pregunta: Tengo esta simple consulta que lo que simplemente me muestra las visitas de la web, pero quisiera que fuera automático con ajax ya que ...
listar datos en una vista parcial pasandolos desde una ventana modal – ajax asp.net-mvc asp.net-mvc-5
Pregunta: Tengo una ventana modal con un formulario del cual quiero retornar los datos ingresados a una vista parcial y ponerlos en lista como se ...
Tomcat no encuentra los recursos – java angularjs http
Pregunta: Bueno tengo una aplicación con AngularJS que hace peticiones al API de gitHub como un ejemplo para aprender a usar AngularJS, pero el problema ...
Crear cuenta regresiva N segundos mientras se visualiza una Activity en Android – java android
Pregunta: Quiero implementar una cuenta regresiva de N segundos, que se inicie cuando la Activity se muestre, se pare el contador cuando el usuario decide ...
Cambiar un valor string a un entero – python django ajax
Pregunta: Con el siguiente código quiero hacer una validación donde valide si un dato que voy a ingresar es mayor a otro que ya tengo, ...
¿Es legal leer imágenes y descripciones de otro sitio web y ponerlas en mi app? – java woocommerce
Pregunta: ¿Es legal leer imágenes y descripciones de otro sitio web y ponerlas en mi programa? Supongamos que quiero hacer una aplicación como la de ebay, ...
Problema con consulta JPQL + JPA + JSF + EJB – java jsf jpa
Pregunta: @Override public Usuario iniciarSesion(Usuario us){ Usuario usuario = null; String consulta; try { ...
No encuentra el audio dentro de src – java
Pregunta: Tengo una carpeta "audios" dentro de "src", para cuando construya el proyecto pueda reproducir los audios. Intento abrir el audio pero me salta "java.lang.NullPointerException" ...
¿Como saber con Apache POI y java si una columna en excel esta oculta? – java apache-poi
Pregunta: Hola estoy importando archivos excel con extensión xls y xlsx pero mi duda es como poder detectar si la columna de una celda esta ...
Spinner y EditText – java android
Pregunta: Tengo este código para cargar un spinner con datos de una base de datos: private class Getfrutas extends AsyncTask<Void, Void, Void> { ...
¿Cómo enviar datos de una pagina JSP a un Servlet sin un form? – java jsp java-ee
Pregunta: Tengo un problema. No logro recibir un valor por GET en el Servlet, no se por qué. Aquí el código JSP: <html> ...
Ayuda con un Calendario en Linea de Codigo – java
Pregunta: Pues se supone que mi código debería imprimir en algunos meses 31 días según una de mis condiciones pero no lo hace de hecho ...
¿ Por qué se me detiene la aplicación al usar este pequeño código? – java android bottombar
Pregunta: Tengo un bottomBar donde tengo 5 opciones, la última es la del mapa de google API. Mi problema es que al hacer click en ...
Exception java.lang.NumberFormatException al intentar un “.size” dentro de una EL – java jsp jboss
Pregunta: Estoy teniendo una Exception en el siguiente código dentro de un jsp: <c:if test="${usuarios.size gt 10}"> usuarios es un ArrayList que objetos. usuarios no esta vacío ya ...
¿ Cómo implemento este código para android 6.0? – java android
Pregunta: Tengo en un Fragment implementado el Google API y FUNCIONA. Pero funciona en mis 3 móviles que son jellybean, kitkat y lollipop. El ...
Tags:, ,

Add a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *