Ver Mensaje Individual
  #9 (permalink)  
Antiguo 12/04/2011, 11:03
chabier
 
Fecha de Ingreso: abril-2011
Ubicación: Zaragoza
Mensajes: 6
Antigüedad: 13 años, 7 meses
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!!!!