Datos duplicados con Struts 1
Hola que tal colegas, les tengo una preguntita. El punto es el siguiente: Desde x.jsp llamo a un action(listarCategorias.do) a traves de un link, en dicho action recupero esa lista y se la seteo al request en el setAttribute, en la configuracion de struts-config.xml los forrward del mismo estan configurados para que llame a Categorias.jsp , en el que creo una tabla dinamica iterando el objeto del request que setee en el Action. La pregunta es: cuando tengo cargados unos datos en Categorias.jsp, al dar F5 me carga los mismos datos pero los anexa debajo de los que ya tenia, eso pasa al dar F5 las veces que sean, como soluciono esto?
Espero sus comentarios, gracias!.
- Inicie sesión o regístrese para enviar comentarios
redirect
F5 recarga la página, reenviando los datos y reinvocando toda la acción que los inserta. Para evitar eso tendrías que modificar la respuesta de tu acción para que al final devuelvas un redirect (aunque sea a la misma página), de modo que ya no se pueda dar reload (normalmente los navegadores no permiten dar reload de una página a la cual llegaste por un redirect). Pero no me preguntes cómo se hace eso en struts porque no tengo idea. En JSP creo que tienes que modificar el código de respuesta en el servlet o JSP e indicar el URL a donde se debe redirigir el navegador.
Gracias por contestar. He
Gracias por contestar. He redireccionado dentro de la configuracion de struts a un .do el cual llama a Categorias.jsp pero sigue haciendo lo mismo, ya intente todo lo que se,ya borre la cache desde la directiva meta dentro del jsp, borre el buffer(autoFlush="false") que utiliza para guardar los datos de salida(en este caso marca una exception)pero no logro que no se dupliquen datos. Se me hace que es un simple truco de struts que no encuentro. Seguire investigando a ver que encuentro, tambien espero sus comentarios de los que tuvieron este bug alguna vez. Gracias!.
Redirect after post
Lee sobre el patrón de diseño Redirect-after-post, es la solución a esta problemática:
Saludos.
Hola benek, lei el patrón,
Hola benek, lei el patrón, lo que entendí fue esto
1. Recibo la petición Post enviada por el usuario, en este caso la recibe mi servlet de struts el cual la direcciona a un Action(listar categorias).
2. Se ejecuta la lógica asociada a la petición, en mi caso listo las categorias
3. Envío al cliente una respuesta con código HTTP 30x (Redirect), indicando al agente de usuario que debe solicitar otra página, en la que despliego en mi tabla dinamica la informacion de las categorias.
4. El navegador obtiene dicha página mediante una petición de tipo Get.
No se si esto aplique con struts, en una aplicación web sin frameworks el redirect se haría así response.sendRedirect("Categorias.jsp") al hacer esto, cuando el usuario por causas "demoniacas" pulse F5 o actualizar lo que va a lograr es que el navegador vuelva a solicitar la pagina en la que devuelvo la respuesta a la petición anterior(desplegando la lista de categorias) pero en ningun momento vuelve a hacer la lógica que se menciono anteriormente.
La cuestion es que no se como hacer esto con struts, mi configuración es la siguiente:
intente con ponerle a los forward la propiedad redirect="true" pero me manda una excepción NullPointerException.
Espero comentarios, gracias.
Problema solucionado con struts
Hola colegas, de nuevo aqui escribiendo. No habia tenido oportunidad de continuar resolviendo el problema antes planteado pero hoy me di a la tarea de checarlo a fondo y de contarles mi experiencia. La situación es muy simple, struts trabaja de una manera un tanto rara(en mi opinión). Al dar F5 o actualizar la pagina ejecuta el Action que me devulve la lista de Categorias, como sabran el método que ejecuta el action es el "execute", al ejecutarse por primera vez llama a toda la clase action configurada en struts-config.xml que contiene el método dicho, en el cual uno de tantos objetos que creaba de forma global para la clase era el objeto de negocio Bo, en el constructor de éste creo el objeto que contedra las listas al cual lo igualo a null y despues creo una referencia a él, así que la segunda vez que se llamba al action, este no llamaba de nuevo a toda la clase sino que struts veia que ya la habia llamado una vez y lo que hacia era sólo llamar al metodo "execute", por lo tanto no creaba otro objeto de negocio y mantenia el que se creo la primera vez de forma global, que sucede?, que al no crear de nuevo el objeto, éste no llamaba al contructor que me igualaba a null y creaba una referencia al objeto que mandaba a traer a las listas, por lo tanto, dicho objeto se llenaba con la informacion que tenia anteriormete y la de la nueva consulta, y así, sucesivamente iba acumulando los resultados, es por eso que en la vista me duplicaba información. De igual manera aprení lo que me sugirio "benek" y lo tomaré en cuenta para otros desarrollos que no incluyan struts y si alguien tiene un buen manual de struts se los agradeceria que me lo manden. Espero haberme explicado para ayudar a otros que tengan este detalle con struts. Saludos!!!
Scope
Creo tu problema fue el scope del Action en el struts-config, tal vez lo tenias de session, lo mejor sería de request para que evitaras ese problemas y no darle tanta vuelta buscando una solución
Hola Luiguisf, no creo que
Hola Luiguisf, no creo que fuera eso porque lo tenia en request, los scope que tengo en session son el de login y logout, pero gracias por tu opinión. Aprovechando tendrán alguna información sobre Tiles en struts, algo entendible y sobre el uso de DynaActionForms, se los agradeceria mucho. Saludos!
Tiles
Tiles en Struts es como Facelets para JSF.
Si no mal recuerdo es sencillo, solo tienes que incluir las taglibs para ocupar Tiles y ya puedes insertar bloques de páginas para menúes, header, footer y demás. Te dejo este PDF con un ejemplo:
Sobre los DynaActionForms, la verdad yo nunca los ocupé, son para situaciones muy específicas en las que necesitas propiedades dinámicas en tus beans para no tener que crear varios ActionForms, nunca me encontré con ese caso (y de habérmelo encontrado tal vez hubiera preferido tener varios ActionForms, por simplicidad). ¿Realmente los necesitas?
Saludos.
@_benek
Hola benk, gracias por la
Hola benk, gracias por la información, me sirvio de mucho. Sobre los DynaActionForms no los necesito, solo es simple curiosidad. Lo que me interesa es aprender la mayor parte de Struts 1 para continuar con Struts 2 y de ahi con Spring. Sobre este último alguna información completa será bien recibida. Gracias y estamos en contacto. Saludos!!!
DynaActionForm
Hola para usar dynactionforms en lugar de declarar tu form como lo harias normalmente:
Lo harias así:
y tu execute así:
Estoy en un proyecto (un poco viejo) que las usa y si dan algo de lata, solo nos ahorramos crear una form normal.