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

Problema con Struts 2, realiza varias llamadas a un action

Estas en el tema de Problema con Struts 2, realiza varias llamadas a un action en el foro de Java en Foros del Web. Buenas. Soy novato por estos lares, pero sin embargo este foro siempre ha sido un punto de referencia donde buscar dudas. Hoy estoy un poco ...
  #1 (permalink)  
Antiguo 07/04/2011, 17:34
 
Fecha de Ingreso: abril-2011
Ubicación: Zaragoza
Mensajes: 6
Antigüedad: 13 años
Puntos: 0
Problema con Struts 2, realiza varias llamadas a un action

Buenas.
Soy novato por estos lares, pero sin embargo este foro siempre ha sido un punto de referencia donde buscar dudas.

Hoy estoy un poco perdido, os explico... si se explicarme...
Estoy usando struts2 para hacer un proyecto.

Cuando desde un formulario en un jsp hago una llamada a un action, este se lanza:
- En firefox 6 veces
- En Opera 1 vez
- En explorer 1 vez
- En Safari 3 veces
- En Chrome 6 veces

Es decir

el jsp

Código PHP:
<s:form name="formLogin" action="acceso" method="post" >
    <
input name="user"/>
    <
input name="pass" type="password"/>
    <
a href="#" onclick="formLogin.submit();"><img src="./res/botonLogin.png"/></a>
</
s:form
struts.xml

Código PHP:
<action name="acceso" method="login" class="es.infoower.login.LoginAction">
    <
result name="success" type="tiles">entrada.tiles</result>
    <
result name="error" type="tiles">login.tiles</result>
</
action
el action

Código PHP:
public class LoginAction extends ActionSupport {

    private 
String user;
    private 
String pass;

    public 
String login() {
        
System.out.println("paso por aquí");
    }

el "paso por aquí" aparece 6 veces en el log (en caso de firefox)

¿alguien sabe por qué puede ser, qué me está pasando o qué estoy haciendo mal?

Me está volviendo loco.
  #2 (permalink)  
Antiguo 08/04/2011, 12:21
 
Fecha de Ingreso: abril-2011
Ubicación: Zaragoza
Mensajes: 6
Antigüedad: 13 años
Puntos: 0
Respuesta: Problema con Struts 2, realiza varias llamadas a un action

¿nadie me puede echar una mano?
Es que sigo igual de perdido. No se por qué puede pasar.

Estoy mirando los interceptores, a ver si es que son ellos los que lanzan varias veces la llamada... pero no se por donde me pega el aire.
  #3 (permalink)  
Antiguo 08/04/2011, 17:28
 
Fecha de Ingreso: enero-2008
Mensajes: 197
Antigüedad: 16 años, 3 meses
Puntos: 10
Respuesta: Problema con Struts 2, realiza varias llamadas a un action

Hola,

1. Podrias poner el struts.xml completo?
2. Como manejas tus Actions, Spring managed? O simple con Struts
3. Si son Spring Managed defines tus Actions como Prototype o Singleton.
4. Puedes invocar la accion simplemente con un input type submit, no con un link

Otra cosa, tu Action define las propiedades pero no veo tus setters por lo que el Interceptor no va a poder hacer el binding.
  #4 (permalink)  
Antiguo 08/04/2011, 19:45
 
Fecha de Ingreso: abril-2011
Ubicación: Zaragoza
Mensajes: 6
Antigüedad: 13 años
Puntos: 0
Respuesta: Problema con Struts 2, realiza varias llamadas a un action

Buenas hualro.
Gracias por contestar!
Es proyecto es más grande, os puse una parte sólo para no marearos, pero intento completar un poco más.

Código PHP:
<struts>
    <
constant name="struts.enable.DynamicMethodInvocation" value="true" />
    <
constant name="struts.devMode" value="true" />
    <
constant name="struts.custom.i18n.resources" value="ApplicationResources" />

    <
package name="login" extends="struts-default" namespace="/">

        <
result-types>
            <
result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" />
        </
result-types>

        <
action name="login">
            <
result type="tiles">login.tiles</result>
        </
action>

        <
action name="logout" method="logout" class="LoginAction">
            <
result name="logout" type="tiles">login.tiles</result>
        </
action>

        <
action name="acceso" method="login" class="LoginAction">
            <
result name="success" type="tiles">entrada.tiles</result>
            <
result name="error" type="tiles">login.tiles</result>
        </
action>

    </
package>
</
struts
Los actions los manejo con Struts, no uso Spring.


Lo del link lo tengo puesto en ese caso por poner la imagen en medio sin tener que modificar los estilos del botón.
En otros puntos lo tengo hecho son <s:submit/> incluso con <s:submit action="elquetoque"/>

Como ves en el struts.xml uso DMI para hacer la invocación de los actions en caso de necesitarla.

Lo de los setters lo omití en el código que puse por acortar un poco y no marear mucho, pero están puestos todos los get y set correspondientes.
De hecho, no tengo problema con el login, pilla bien el usuario y la contraseña, el problema... es que se loguea 6 veces...

Es ese caso... podría darme por vencido.... y mirar hacia otro lado... al fin y al cabo no hay "problema", porque el usuario o entra o no. Pero cuando llego a la hora de guardar datos... es donde se fastidia el asunto. Porque me guarda los datos, tantas veces como se invoque automáticamente el action, y eso sí que no lo puedo dejar pasar.

Muchas gracias!
  #5 (permalink)  
Antiguo 09/04/2011, 11:58
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: Problema con Struts 2, realiza varias llamadas a un action

Para saber exactamente que está pasando deberías utilizar el debugger, que para eso eso están.

Teniendo en cuenta que dices que el problema varía según el navegador, lo lógico es pensar que el código está bien, ya que esa parte se ejecuta en el servidor y es la misma para todos los navegadores.

Entonces el problema tiene que estar entre el navegador y el servidor. Yo nunca he usado tiles, pero me imagino que o no están bien construidos o no estás gestionando bien los result.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #6 (permalink)  
Antiguo 09/04/2011, 13:07
 
Fecha de Ingreso: abril-2011
Ubicación: Zaragoza
Mensajes: 6
Antigüedad: 13 años
Puntos: 0
Respuesta: Problema con Struts 2, realiza varias llamadas a un action

Si me he hartado de usar el debugger, pero es que ya no se ni donde poner los puntos de ruptura.

Siempre he dado los tiles por bien puestos, pero voy a investigar por esa parte a ver si hay algo que se me ha pasado.

¿Conocéis alguna buena herramienta para interceptar las llamadas del navegador? Vamos, algún proxy que sea facil de usar. Miraré también si el problema puede venir de la llamada del navegador.

Esto es lo bonito de la programación, hacer de detective, buscar pruebas, y poco a poco ir acorralando al bug. Pero de momento, el bug sigue matando.
  #7 (permalink)  
Antiguo 09/04/2011, 13:53
 
Fecha de Ingreso: enero-2008
Mensajes: 197
Antigüedad: 16 años, 3 meses
Puntos: 10
Respuesta: Problema con Struts 2, realiza varias llamadas a un action

Hay un proxy que se llama Charles, es muy bueno pero a veces complicado :) uno sencillo de usar es FureBug, puedes hacer persistentes los requests y ver como se ejecuta intenta eso es en el tab de "net" creo.

No creo que sea tiles, yo si lo he usado y no tiene nada que ver ya que eso pasa al final... Lo que no estoy seguro es por que usas DMI si no hay wildcards aunque como dices solo me pasas un fragmento....

Que logger usas? Podrias settear todos los logs de struts a un nivel alto para que te arroje toda la informacion posible incluso mas alto que debug. Log4j me imagino no? Con eso podrias ver por donde pasa el request ya que hay varios interceptores que entran en juego pero segun yo ellos no tienen nada que ver.

Otra cosa es ver como tienes la declaracion de tus paquetes veo que tienes uno de login, pero no se si esa misma accion este repetida en otros paquetes? o como la tienes mapeada hay acciones globales?
  #8 (permalink)  
Antiguo 10/04/2011, 03:06
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 14 años, 11 meses
Puntos: 306
Respuesta: Problema con Struts 2, realiza varias llamadas a un action

Yo pondría los breakpoints en la línea que utilizas para comprobar que se repite, en la salida del action, y en la jsp/tile destino.

Si después de pasar un result, no llegas a ningún jsp/tile sino que se vuelve a llamar al action, el problema no estará en los tiles, ya que ni siquiera llega a ellos. Además podrás ver la diferencia de variables y objetos que hay en el momento de una salida falsa y la de verdad.

Si después del result del action, pasa por el jsp/tile y vuelve a llamar al action, el problema lo tienes en el tile/jsp.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #9 (permalink)  
Antiguo 12/04/2011, 11:03
 
Fecha de Ingreso: abril-2011
Ubicación: Zaragoza
Mensajes: 6
Antigüedad: 13 años
Puntos: 0
Respuesta: Problema con Struts 2, realiza varias llamadas a un action

Gracias a los dos!!!!

Perdonar que haya estado un poco ausente.

Estaba escribiendo una parrafada, pero creo que acabo de encontrar de donde viene el error.

Os explico. Está relacionado con el tiles.

Seguramente será por algo que ya desde el principio no me gustaba absolutamente nada, pero que no sabía hacer mejor.
Voy a intentar explicar lo que he visto, y a ver si me podéis aconsejar como hacer una correcta programación de esta parte.

¿sebéis como funcionan los tiles?

El tiles.xml yo tengo definido lo siguiente:

Código PHP:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
       "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
       "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
<tiles-definitions>
    
    <definition name="login.tiles"  template="/base/Login.jsp">
        <put-attribute name="estilos" value="./css/login.css"/>
    </definition>
    
    <definition name="base" template="/base/Base.jsp">
        <put-attribute name="header" value="/base/Header.jsp" />
        <put-attribute name="menu" value="/base/Menu.jsp" />
        <put-attribute name="body" value="" />
        <put-attribute name="emergente" value="" />
        <put-attribute name="footer" value="/base/Footer.jsp" />
        <put-attribute name="estilos" value="css/estilos.css"/>
        <put-attribute name="cssPropios1" value=""/>
        <put-attribute name="cssPropios2" value=""/>
        <put-attribute name="cssPropios3" value=""/>
        <put-attribute name="cssPropios4" value=""/>
        <put-attribute name="jsPropios1" value=""/>
        <put-attribute name="jsPropios2" value=""/>
        <put-attribute name="jsPropios3" value=""/>
        <put-attribute name="jsPropios4" value=""/>
    </definition>

    <definition name="error.tiles" extends="base">
        <put-attribute name="title" value="Error page" />
        <put-attribute name="body" value="/base/Error.jsp" />
    </definition>

    <definition name="entrada.tiles" extends="base">
        <put-attribute name="body" value="/mipagina/MiPagina.jsp" />
        <put-attribute name="cssPropios1" value="css/estilosPresentacion.css"/>
    </definition>
</tiles-definitions>

Así como veíais en el struts.xml con llamar al tiles que sea, ya cargo todo lo que necesito, sin tener que estar construyendo cada página entera. Así sólo cambio el contenido.

en Base.jsp tengo lo siguiente metido en la etiqueta <head>:

Código PHP:
<head>
        <
link type="text/css" rel="stylesheet" href="<tiles:getAsString name="estilos"/>"/>
        <
link type="text/css" rel="stylesheet" href="<tiles:getAsString name="cssPropios1" ignore="true"/>"/>
        <
link type="text/css" rel="stylesheet" href="<tiles:getAsString name="cssPropios2" ignore="true"/>"/>
        <
link type="text/css" rel="stylesheet" href="<tiles:getAsString name="cssPropios3" ignore="true"/>"/>
        <
link type="text/css" rel="stylesheet" href="<tiles:getAsString name="cssPropios4" ignore="true"/>"/>
        <
script type="text/javascript" src="<tiles:getAsString name="jsPropios1" ignore="true"/>"></script>
        <script type="text/javascript" src="<tiles:getAsString name="jsPropios2" ignore="true"/>"></script>
        <script type="text/javascript" src="<tiles:getAsString name="jsPropios3" ignore="true"/>"></script>
        <script type="text/javascript" src="<tiles:getAsString name="jsPropios4" ignore="true"/>"></script>
        <script src="./pluggins/jquery.js" type="text/javascript"></script>
        <script src="./js/jsGenerico.js" type="text/javascript"></script>
        <link href='./res/favicon.ico' rel='icon' type='image/gif'/>
        <link href='./res/favicon.ico' rel='shortcut icon' type='image/gif'/>
</head> 
como veis, cargo los estilos y los js llamando al tiles con <tiles:getAsString name="jsPropios4" ignore="true"/>
Se supone que si en el tiles hay un valor definido para jsPropios4 (o cualquier otro) lo carga, y si no hay nada definido, no lo carga.

Pues bien, el fallo es que si no hay nada definido, se vuelve loco, según el navegador que sea, debe de volver a llamar a ver si a la segunda vez lo encuentra.

La solucion "CHAPUCERA" es crearse un css vacio y otro js vacio, y poner el tiles de la siguiente forma:

Código PHP:
        <definition name="base" template="/base/Base.jsp">
        <
put-attribute name="header" value="/base/Header.jsp" />
        <
put-attribute name="menu" value="/base/Menu.jsp" />
        <
put-attribute name="body" value="" />
        <
put-attribute name="emergente" value="" />
        <
put-attribute name="footer" value="/base/Footer.jsp" />
        <
put-attribute name="estilos" value="css/estilos.css"/>
        <
put-attribute name="cssPropios1" value="css/vacio.css"/>
        <
put-attribute name="cssPropios2" value="css/vacio.css"/>
        <
put-attribute name="cssPropios3" value="css/vacio.css"/>
        <
put-attribute name="cssPropios4" value="css/vacio.css"/>
        <
put-attribute name="jsPropios1" value="js/vacio.js"/>
        <
put-attribute name="jsPropios2" value="js/vacio.js"/>
        <
put-attribute name="jsPropios3" value="js/vacio.js"/>
        <
put-attribute name="jsPropios4" value="js/vacio.js"/>
    </
definition
Así, encuentra un archivo (que esta vacio, pero que existe) y lo carga. Si algún tiles sobreescribe algun css o js, carga los sobre escritos en vez de los vacíos.


Esto ma parece chapucero, sucio, y muy poco óptimo. Pero no se otra forma de hacerlo bien.

Pensaba que el artributo ignore de <tiles:getAsString name="jsPropios4" ignore="true"/> haría que si no hay un tiles, lo ignorase... pero no, pasa de mi.

Incluso he intentado poner la parte del tiles así, sin el value, por si acaso es que interpreta que value ="" es "algo".

<put-attribute name="jsPropios3"/>
<put-attribute name="jsPropios4"/>

Pero no, así simplemente da un error, y no hace nada.

¿Lo dicho, alguna forma o consejo para, usando tiles, cargar dinamicamente los recursos css o js que necesite?

Sino, en un principio lo dejaré así, pero ya os digo que no me gusta, pero voy jodido de tiempo y el "si funciona, no lo toques" ahora mismo, por desgracia, prevalece ante el hacer las cosas bonita y correctamente.

Gracias por vuestra ayuda e ideas!!!!
  #10 (permalink)  
Antiguo 12/04/2011, 14:53
 
Fecha de Ingreso: enero-2008
Mensajes: 197
Antigüedad: 16 años, 3 meses
Puntos: 10
Respuesta: Problema con Struts 2, realiza varias llamadas a un action

Hola,

Como bien dices, tiles sirve para generar una estructura que se repite constantemente como el header, menu principal, footer, imports etc etc etc... y solo pasar o construir lo que realmente cambia como el body o contenido, siguiendo esta logica, no se por que quisieras pasar el css y js a cada tiles que generes?????? te imaginas definir 300 tiles? siguiendo esa logica suena redundante. Es mi muy personal punto de vista pero si usas tiles lo mas logico es que quieras minimizar lo repetitivo, y solo generarte el jsp correspondiente (body) y definir el tile y llamarlo con struts. No veo por que a cada tile mandarle los estilos y js que usa....

Yo en tu lugar tendria mucho cuidado de hacer eso porque al meter estilos y js a cada tile podrias meter bugs que sobreescriban los estilos definidos o generar conflictos, yo tendria todo eso en un tile general base que no se mueve y tener mis estilos mas generales, tambien por performance, si tu tienes tus estilos y js cargados es mas facil y mejor navegar por tu aplicacion.

Si aun asi quieres irte por ese camino entonces te recomiendo mejor Sitemesh, es similar nadamas que podrias definir tus estilos en el header y sitemesh aplicaria el patron de decorator decorando tu jsp.
Lo que definas en head se pasara y se agregara al head base(general) y mejor aun no tendrias que definir nada de lado de struts. Es mucho mas eficiente que tiles en ese aspecto, ya que solo tendrias que definir tu jsp en cambio con tiles defines el tiles la estructura, lo llamas con struts generas el jsp etc...

Cualquier cosa aqui estamos :)
  #11 (permalink)  
Antiguo 12/04/2011, 16:52
 
Fecha de Ingreso: abril-2011
Ubicación: Zaragoza
Mensajes: 6
Antigüedad: 13 años
Puntos: 0
Respuesta: Problema con Struts 2, realiza varias llamadas a un action

Gracias hualro!!!

No conocía Sitemesh. Lo he estado mirando y leyendo información de él, y parece muy interesante.
Pero por lo que veo, es parecido a tiles no?

Yo tengo un archivo Base.jsp que tiene el <head> que he puesto antes, y a continuación tiene:

Código PHP:
<body>
        <
div id="contenedorDatos">
            <
div id="cabecera">
                <
tiles:insertAttribute name="header" />
            </
div>
            <
tiles:insertAttribute name="emergente" />
            <
div id="contenidoSinMenu">
                <
tiles:insertAttribute name="body" />
            </
div>
            <
div id="pie">
                <
tiles:insertAttribute name="footer" />
            </
div>
        </
div>
    </
body
Se podría decir, que este es mi layout.

Así pues, con Sitemesht haces un jsp de contenido y lo que está dentro del la etiqueta <body>, automáticamente se pone dentro del layout donde lo hayas definido que va el <decorator:body/>

Desde struts llamas al jsp que quieres, y Sitemesh carga todo el decorado (a menos que hayas excluido la pagina)

Con tiles, la diferencia sería que tienes que definir un archivo intermedio, que une el jsp con el <tiles:insertAttribute name="body" /> diciendole por ejemplo:

Código PHP:
<definition name="pagina.tiles" extends="base">
        <
put-attribute name="title" value="Pagina" />
        <
put-attribute name="body" value="/mipagina.jsp" />
        <
put-attribute name="cssPropios1" value="css/estilosDePagina.css"/>
        <
put-attribute name="jsPropios2" value="js/jsDePagina.js"/>
    </
definition
Aquí estoy cogiendo todo lo definido en base, y sobreescribiendo lo que necesito.

Y desde struts llamas al tiles no al jsp.


¿Con Sitemesh puedes tener un <head> en cada pagina? ¿Supongo que también pillará el head de la pagina Base (layout) no?

A las alturas que estoy del proyecto, y sin conocer a fondo Sitemesh no puedo cambiar ahora, pero en proximos proyectos, intentaré investigarlo mejos y más a fondo para poder usarlo.
¿Crees que es mejor que tiles?
  #12 (permalink)  
Antiguo 12/04/2011, 22:32
 
Fecha de Ingreso: enero-2008
Mensajes: 197
Antigüedad: 16 años, 3 meses
Puntos: 10
Respuesta: Problema con Struts 2, realiza varias llamadas a un action

No se si sea mejor Sitemesh que tiles :D Lo que si te puedo decir es que para desarrollo de aplicaciones con muchas vistas es mas facil generar un jsp y listo a diferencia de tiles que necesitas forzosamente la definicion de tiles y del lado de struts llamarlo con un result type lo que me parece un poco intrusivo.

Si puedes definir un layout base, y si gustas puedes mandar un jsp junto con su head y el head del jsp se va a agregar al head base por lo que podria solucionar tu problema.

Saludos!!! me avisas si necesitas un ejemplo con struts 2 sitemesh y spring ;)

Etiquetas: llamadas, struts, acciones
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




La zona horaria es GMT -6. Ahora son las 11:56.