Foros del Web » Programación para mayores de 30 ;) » Java »

Un Action se me ejecuta dos veces

Estas en el tema de Un Action se me ejecuta dos veces en el foro de Java en Foros del Web. Buenas Tardes! Perdonad que os moleste otra vez. Pero tengo un problema "muy raro" que no tengo ni idea de porqué ocurre. Bien, me di ...
  #1 (permalink)  
Antiguo 09/08/2008, 13:50
 
Fecha de Ingreso: julio-2008
Mensajes: 26
Antigüedad: 15 años, 8 meses
Puntos: 0
Un Action se me ejecuta dos veces

Buenas Tardes!

Perdonad que os moleste otra vez. Pero tengo un problema "muy raro" que no tengo ni idea de porqué ocurre. Bien, me di cuenta que me da un NullPointer en un Action (Struts 1.3.8). Tras mirarlo mucho me di cuenta que se ejecutaba dos veces (lo supe por los logs). O sea, que cuando se manda la URL cuyo path es ese action, el action hace el execute dos veces consecutivas. Muy raro no?

Os pongo dicho Action, pero vamos, no tiene nada raro:

public static Log log = LogFactory.getLog(DeleteUserAdminAction.class);

@Override
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
ActionForward forward = null;

long id_usuario = Long.parseLong(request.getParameter("id_usuario")) ;
String nombre = request.getParameter("nombre");
String apellidos = request.getParameter("apellidos");

UsuarioDao.deleteUser(id_usuario);

log.info("El Usuario " + nombre + " " + apellidos + " ha sido eliminado de la Aplicación");

forward = mapping.findForward("Success");

return forward;
}

En el struts-config.xml tampoco hay nada raro:

<action path="/DeleteUserAdminAction" type="actions.DeleteUserAdminAction" validate="false">
<forward name="Success" path="/WEB-INF/jsps/user/deletedUser.jsp"/>
</action>

¿Alquien tiene alguna remota idea de porqué puede ser?

Muchas gracias de nuevo.

Un saludo.
  #2 (permalink)  
Antiguo 09/08/2008, 13:55
Avatar de djagu_26  
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 518
Antigüedad: 16 años, 3 meses
Puntos: 6
Respuesta: Un Action se me ejecuta dos veces

A mi me pasaba eso con un bean de request, se me ejecutaba dos veces y me borraba un parametro

saludos
__________________
"La magia no existe, la programacion si"

A/P Agustin Sivoplas
[email protected]
  #3 (permalink)  
Antiguo 09/08/2008, 14:09
 
Fecha de Ingreso: julio-2008
Mensajes: 26
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Un Action se me ejecuta dos veces

Cita:
Iniciado por djagu_26 Ver Mensaje
A mi me pasaba eso con un bean de request, se me ejecutaba dos veces y me borraba un parametro

saludos
Como se soluciona esto? Es decir, ¿Qué hiciste tú al respecto?

Muchas gracias

Saludos
  #4 (permalink)  
Antiguo 09/08/2008, 17:04
 
Fecha de Ingreso: agosto-2008
Ubicación: Cajamarca
Mensajes: 49
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Un Action se me ejecuta dos veces

Hola ElCrackdel83,

No tengo idea para tu problema, pero tengo comentarios sobre tu codigo. Voy a escribirlos en ingles, es mas facil para mi.

1. You should use the ActionFormBeans functionality of Struts instead of the following lines, it's more object oriented, and also more simple I think

long id_usuario = Long.parseLong(request.getParameter("id_usuario")) ;
String nombre = request.getParameter("nombre");
String apellidos = request.getParameter("apellidos");

http://struts.apache.org/1.3.8/userGuide/building_model.html#actionform

2. You should not call the DAO directly from your Actions, you should call Service classes instead. A Service class contains methods that merge calls to several DAO methods. And also you should not use static methods for the DAO.

UsuarioDao.deleteUser(id_usuario);

3. Also you should take care because in the case of your Action, someone can change the "id_usuario" by hand in the URL and so remove any user.

4. When you log at debug or info level, don't forget to put a Log.isDebugEnabled or Log.isInfoEnabled test, it can enhanced performance in production.

I hope this advices can help you !

Cimballi
  #5 (permalink)  
Antiguo 10/08/2008, 02:08
 
Fecha de Ingreso: julio-2008
Mensajes: 26
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Un Action se me ejecuta dos veces

Cita:
Iniciado por Cimballi Ver Mensaje
Hola ElCrackdel83,

No tengo idea para tu problema, pero tengo comentarios sobre tu codigo. Voy a escribirlos en ingles, es mas facil para mi.

1. You should use the ActionFormBeans functionality of Struts instead of the following lines, it's more object oriented, and also more simple I think

long id_usuario = Long.parseLong(request.getParameter("id_usuario")) ;
String nombre = request.getParameter("nombre");
String apellidos = request.getParameter("apellidos");

http://struts.apache.org/1.3.8/userGuide/building_model.html#actionform

2. You should not call the DAO directly from your Actions, you should call Service classes instead. A Service class contains methods that merge calls to several DAO methods. And also you should not use static methods for the DAO.

UsuarioDao.deleteUser(id_usuario);

3. Also you should take care because in the case of your Action, someone can change the "id_usuario" by hand in the URL and so remove any user.

4. When you log at debug or info level, don't forget to put a Log.isDebugEnabled or Log.isInfoEnabled test, it can enhanced performance in production.

I hope this advices can help you !

Cimballi

Thank you so much! I'll consider properly your pieces of advice.

I know you are right. But I'm a new developer. It's still hard for me.

Thank you so much.

About the problem of executing twice my Action, I've read that it might be a bug.

I'll read more on the Internet.

Regards.
  #6 (permalink)  
Antiguo 11/08/2008, 08:15
Usuario no validado
 
Fecha de Ingreso: junio-2008
Mensajes: 386
Antigüedad: 15 años, 9 meses
Puntos: 10
Respuesta: Un Action se me ejecuta dos veces

Hola,

¿Y si entra al metodo execute??

Probablemente te hace falta agregar una clase que te mapeara tu forma de tu jsp, es decir, un ActionForm, y deberas de agregarla en tu struts-config.xml.

Ejemplo, suponiendo que tienes una clase llamada "Persona.java" y tiene las variables id, nombre, apellidos, en el struts-config.xml deberas de agregarla asi:

<form-beans>
<form-bean name="personaForm" type="com.ejemplo.PersonaForm"/>
</form-beans>

Y en tu tag "<action" te faltaria:

<action path="/DeleteUserAdminAction" type="actions.DeleteUserAdminAction" name="personaForm" validate="false">
<forward name="Success" path="/WEB-INF/jsps/user/deletedUser.jsp"/>
</action>

Y en tu clase Action recuperarias las variables asi:

Persona persona=(Persona)form;
long id_usuario = Long.parseLong(persona.getId()) ;
String nombre = persona.getNombre();
String apellidos = persona.getApellidos();

saludos!
  #7 (permalink)  
Antiguo 11/08/2008, 08:46
 
Fecha de Ingreso: julio-2008
Mensajes: 26
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Un Action se me ejecuta dos veces

Cita:
Iniciado por Bunburyscom Ver Mensaje
Hola,

¿Y si entra al metodo execute??

Probablemente te hace falta agregar una clase que te mapeara tu forma de tu jsp, es decir, un ActionForm, y deberas de agregarla en tu struts-config.xml.

Ejemplo, suponiendo que tienes una clase llamada "Persona.java" y tiene las variables id, nombre, apellidos, en el struts-config.xml deberas de agregarla asi:

<form-beans>
<form-bean name="personaForm" type="com.ejemplo.PersonaForm"/>
</form-beans>

Y en tu tag "<action" te faltaria:

<action path="/DeleteUserAdminAction" type="actions.DeleteUserAdminAction" name="personaForm" validate="false">
<forward name="Success" path="/WEB-INF/jsps/user/deletedUser.jsp"/>
</action>

Y en tu clase Action recuperarias las variables asi:

Persona persona=(Persona)form;
long id_usuario = Long.parseLong(persona.getId()) ;
String nombre = persona.getNombre();
String apellidos = persona.getApellidos();

saludos!
En primer lugar, muchísimas gracias por tu comentario.

No puedo hacer eso que dices del ActionForm, pues vengo de una JSP en la que muestro en una tabla todos los usuarios, y en la ultima columna tengo 3 botones (que son 3 links), uno para ver en detalle, otro para un update, y el tercero para borrar. Por tanto paso como parámetro en el link (en la url) la id del usuario, y por eso la recupero como la recupero.

No obstante lo que me sigue mosqueando es el tema del que el execute se me ejecuta dos veces (lo sé seguro porque he puesto System.out.println para confirmarlo). Por lo que he podido ver por ahí pienso que es un BUG de Struts, que no tengo ni idea de como voy a eludir.

Muchísimas gracias. Acepto cualquier comentario que pueda mejorar mi situación.

Un saludo.
  #8 (permalink)  
Antiguo 11/08/2008, 08:52
Usuario no validado
 
Fecha de Ingreso: junio-2008
Mensajes: 386
Antigüedad: 15 años, 9 meses
Puntos: 10
Respuesta: Un Action se me ejecuta dos veces

Eso no es ningun problema, puedes NO usar el ActionForm, pero entonces en el link debes enviar solo el Id del usuario y cacharlo en el Action con un request.getParameter("") y borrarlo.
  #9 (permalink)  
Antiguo 11/08/2008, 09:03
 
Fecha de Ingreso: julio-2008
Mensajes: 26
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Un Action se me ejecuta dos veces

Cita:
Iniciado por Bunburyscom Ver Mensaje
Eso no es ningun problema, puedes NO usar el ActionForm, pero entonces en el link debes enviar solo el Id del usuario y cacharlo en el Action con un request.getParameter("") y borrarlo.
En serio? Me aconsejas crear un ActionForm, vacio por supuesto, y asociarlo al Action del Delete correspondientemetne en el struts-config.xml, aunque luego ni recupere datos de él en el Action y nisiquiera reescriba el método validate. Porque en el atributo validate del action en el struts-config.xml, debo de poner true o false?

Muchas gracias por tu ayuda.

Un saludo.
  #10 (permalink)  
Antiguo 11/08/2008, 09:17
Usuario no validado
 
Fecha de Ingreso: junio-2008
Mensajes: 386
Antigüedad: 15 años, 9 meses
Puntos: 10
Respuesta: Un Action se me ejecuta dos veces

Te dije que NO usaras el ActionForm y que mandaras como parametro en el link el id de usuario.
  #11 (permalink)  
Antiguo 11/08/2008, 09:19
Usuario no validado
 
Fecha de Ingreso: junio-2008
Mensajes: 386
Antigüedad: 15 años, 9 meses
Puntos: 10
Respuesta: Un Action se me ejecuta dos veces

jejejejej.... creo que me explique mal.

Mejor dicho, deja asi como esta configurado tu struts-config.xml (no asocies ningun ActionForm) y solo en el link manda el id del usuario y en el Action lo recuperas con un request.getParameter("");

Me explico??

disculpa!
  #12 (permalink)  
Antiguo 11/08/2008, 09:20
 
Fecha de Ingreso: agosto-2008
Ubicación: Cajamarca
Mensajes: 49
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Un Action se me ejecuta dos veces

ElCrackdel83,

Estaria mas facil de responderte si mostras el codigo.
Por ejemplo, cual es el codigo del link en la JSP que llama con el problema ?

Cimballi
  #13 (permalink)  
Antiguo 11/08/2008, 09:29
 
Fecha de Ingreso: julio-2008
Mensajes: 26
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Un Action se me ejecuta dos veces

Cita:
Iniciado por Bunburyscom Ver Mensaje
jejejejej.... creo que me explique mal.

Mejor dicho, deja asi como esta configurado tu struts-config.xml (no asocies ningun ActionForm) y solo en el link manda el id del usuario y en el Action lo recuperas con un request.getParameter("");

Me explico??

disculpa!
Sí, así exactamente es como lo hago ahora mismo! Sin usar ActionForm, y pasando en la url el parámetro id, y luego recuperándolo con un request.getParameter

Por eso me raya que se llame dos veces el execute, porque ocn el update hago exactamente lo mismo y no pasa nada.

Muchas gracias y perdona mi confusión. Lo leí mal. Sorry!
  #14 (permalink)  
Antiguo 11/08/2008, 09:34
 
Fecha de Ingreso: julio-2008
Mensajes: 26
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Un Action se me ejecuta dos veces

Cita:
Iniciado por Cimballi Ver Mensaje
ElCrackdel83,

Estaria mas facil de responderte si mostras el codigo.
Por ejemplo, cual es el codigo del link en la JSP que llama con el problema ?

Cimballi
Aprecio un montón tu ayuda. Esta es la línea de código dle link (está dentro de una tabla que está dentro de un iterate:

<html:link href="DeleteUserAdminAction.do?id_usuario=${user.i d_usuario}" title="Eliminar a este Usuario de la Aplicación"><html:image src="${pageContext.request.contextPath}/im/ic_remove.gif" /></html:link>


Y esta la entrada en struts-config.xml:

<action path="/DeleteUserAdminAction" type="actions.DeleteUserAdminAction" validate="false">
<forward name="Success" path="/WEB-INF/jsps/user/deletedUser.jsp"/>
</action>

Y este el código del execute:

public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
ActionForward forward = null;

long id_usuario = Long.parseLong(request.getParameter("id_usuario")) ;
Usuario usuario = UsuarioDao.selectUserById(id_usuario);

UsuarioDao.deleteUser(id_usuario);

log.info("El Usuario " + usuario.getNombre() + " " + usuario.getApellidos() + " ha sido eliminado de la Aplicación");

forward = mapping.findForward("Success");

return forward;
}

Si pongo al principio del execute un System.out.println("HOLA") en la consola del glassfish v2 veré HOLA HOLA, y la explosión correspondiente por null pointer exception en el usuario.getNombre() (porque a la segunda vez ya está borrado y evidentemente recupera nulo de la BD).

Muchas gracias por tu ayuda.

Un saludo.
  #15 (permalink)  
Antiguo 11/08/2008, 09:55
 
Fecha de Ingreso: agosto-2008
Ubicación: Cajamarca
Mensajes: 49
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Un Action se me ejecuta dos veces

Una idea : he visto que tu usas images. Y parece que hay un problema con empty images tags, <img src="" />. Verifica que no hay este tags en tu html.

Cimballi
  #16 (permalink)  
Antiguo 11/08/2008, 10:22
 
Fecha de Ingreso: julio-2008
Mensajes: 26
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Un Action se me ejecuta dos veces

Cita:
Iniciado por Cimballi Ver Mensaje
Una idea : he visto que tu usas images. Y parece que hay un problema con empty images tags, <img src="" />. Verifica que no hay este tags en tu html.

Cimballi
Qué va! para nada! los img que uso, en todos tengo una imagen definida en el atributo src.

Gracias
  #17 (permalink)  
Antiguo 18/03/2011, 17:49
 
Fecha de Ingreso: marzo-2011
Mensajes: 1
Antigüedad: 13 años, 1 mes
Puntos: 0
Respuesta: Un Action se me ejecuta dos veces

a mi tambien se me duplica por ejemplo los System.out.println() cualquiera eso me hace suponer que se ejecutan dos veces
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 19:48.