Newsgroup: it.comp.java
Titolo: come usate i Tiles in Struts?

salve a tutti....
dopo un po incazzature sono riuscito a far funzionare i tiles (con
definizione su xml) in struts
(c'è un errore sugli esempi del sito che ho gia segnalato ad apache)...
veniamo al punto...
vorrei adottare un template semplice per il quale l'unica cosa che cambia di
volta in volta è il contenuto centrale (quindi header fisso, menu fisso,
ecc)
Mi vengono in mente 2 soluzioni:
1)
dopo aver definito il layout base su una jsp che richiama i tile da una def
su xml
scrivo la mia jsp richiamando la def e facendo l'overide del body al volo
(funziona, provato)
miapagina.jsp:
<tiles:insert definition="layout">
  <tiles:put name="body">
      rimpiazzo al volo il body con tutto quello che voglio: tag html, pezzi
di codice java, eccc...
    <table border="1">
      <tr>
       <td>con</td>
        <td>tabelle</td>
      </tr>
    </table>
    <hr>
    e anche script java
    <%
     String s = "stringa da codice!!!";
    %>
    bla bla <br>
    <% for (int i = 0; i < 3; i++) { %>
      <b><%=s%></b><br/>
    <% } %>
  </tiles:put>
</tiles:insert>
2 SOLUZIONE
miapagina.jsp contiene solo ed esclusivamente html (e codice java), insomma
è il body vero e proprio senza riferimenti ai tile;
aggiungo un def sul file xml, estendendo il layout di base e facendo
l'overide del body in modo da puntare a miapagina.jsp
Quando devo chiamare la pagina che desidero, per esempio da una action,
faccio il forward al nome del template (devo provarla ancora)
In questo modo però, per ogni body diverso ho una nuova def in xml.
Che soluzione usate (o mi consigliate)????

> Che soluzione usate (o mi consigliate)????
Come definizione tiles potresti fare:
<definition name="base" path="/jsp/base.jsp" >
  <put name="main" value="/jsp/blank.jsp" />
</definition>
...
<definition name="pagina1" extends="base">
    <put name="main" value="/jsp/pagina1.jsp"/>
</definition>
ecc..
in base.jsp metti:
<tiles:insert attribute="main"/>
in struts config metti:
<action path="/pagina1"  [...]>
      <forward name="ok" path="pagina1"/>
</action>
HTH


quindi mi stai dicendo di usare la 2 opzione che ho detto
e pertanto hai una def (che estende la base) su xml, per ogni jsp che devi
mostrare...?
scusa se puntualizzo ma mi interessa proprio sapere se è normale avere
decine di micro definizioni in xml solo
per rimpiazzare il body....


Allora prova a fare un forward sempre alla stessa definizione tiles e
passa come parametro il nome del frammento che mostra il body (ad
esempio, mettilo nella requst)
<tiles:insert name="pathTo/${page}.jsp" ignore="true"/>

Allora prova a fare un forward sempre alla stessa definizione tiles e
passa come parametro il nome del frammento che mostra il body (ad
esempio, mettilo nella requst)
<tiles:insert name="pathTo/${page}.jsp" ignore="true"/>
ehm... non ho capito...
puoi chiarirmi questa tecnica? grazie


Niente di particolare.. nella tua implementazione di action metti in
request un attibuto di nome page con valore il nome della pagina da
visualizzare.
Non hai più quindi le varie configurazioni di pagine ma ti basi su una
convenzione, ovvero la pagina che mostra il risultato della action si
"aspetta"
di avere un attributo di nome "page" nella request e compone la jsp di
conseguenza.


        <form-bean name="RispostaSingolaForm"
type="miopack.struts.RispostaSingolaForm"/>
        <form-bean name="RispostaMultiplaForm"
type="miopack.struts.RispostaMultiplaForm"/>
        <form-bean name="RispostaApertaForm"
type="miopack.struts.RispostaApertaForm"/>
    </form-beans>
    <action-mappings>
        <action input="/codice.do" name="CheckCodiceForm" path="/
questionario" scope="request"
type="miopack.struts.InizializzaLingueQuestionario">
            <forward name="molte" path="/sceglilingua.do"/>
            <forward name="una" path="/inizializza.do"/>
            <forward name="ko" path="/codice.do"/>
        </action>
        <action input="/sceglilingua.do" path="/linguascelta"
name="LinguaForm" type="miopack.struts.Lingua" scope="request" >
            <forward name="ok" path="/inizializza.do"/>
        </action>
        <action path="/inizializza"
type="miopack.struts.InizializzaQuestionario">
            <forward name="ok" path="/prossima.do"/>
        </action>
        <action input="/singola.do" path="/singola_risp"
name="RispostaSingolaForm" type="miopack.struts.RispostaSingola"
scope="request">
            <forward name="ok" path="/prossima.do"/>
        </action>
        <action input="/multipla.do" path="/multipla_risp"
name="RispostaMultiplaForm" type="miopack.struts.RispostaMultipla"
scope="request">
            <forward name="ok" path="/prossima.do"/>
        </action>
        <action input="/aperta.do" path="/aperta_risp"
name="RispostaApertaForm" type="miopack.struts.RispostaAperta"
scope="request">
            <forward name="ok" path="/prossima.do"/>
        </action>
        <action path="/prossima"
type="it.enginsoft.qo.struts.ProssimaDomanda">
            <forward name="singola" path="/singola.do"/>
            <forward name="multipla" path="/multipla.do"/>
            <forward name="aperta" path="/aperta.do"/>
            <forward name="ko" path="/codice.do"/>
        </action>
        <action path="/singola" forward="domandaSingola"/>
        <action path="/multipla" forward="domandaMultipla"/>
        <action path="/aperta" forward="domandaAperta"/>
        <action path="/sceglilingua" forward="mostraLingua"/>
        <action path="/domanda" forward="mostraDomanda"/>
        <action path="/codice" forward="mostraCodice"/>
        <action path="/index" forward="mostraCodice"/>
        <action path="/viewLogin" forward="mostraLogin"/>
        <action path="/protected/dato" forward="dato"/>
        <action path="/failLogin" forward="failLogin"/>
    </action-mappings>
    <message-resources parameter="it/enginsoft/qo/conf/
ApplicationResource"/>
    <plug-in className="org.apache.struts.tiles.TilesPlugin">
        <set-property property="definitions-config" value="/WEB-INF/
tiles-defs.xml"/>
    </plug-in>
</struts-config>
titles-def.xml
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 1.3//EN"
"
http://struts.apache.org/dtds/tiles-config_1_3.dtd
">
<tiles-definitions>
    <definition name="layout" path="/jsp/layout/Layout.jsp">
        <put name="menu" value="/jsp/menu.jsp"/>
        <put name="titolo" value="QO" type="string" />
        <put name="copy" value="®" type="string" />
    </definition>
    <definition name="layout_2" path="/jsp/layout/Layout.jsp">
        <put name="menu" value="/jsp/datiQuestionario.jsp"/>
        <put name="titolo" value="QO" type="string" />
        <put name="copy" value="®" type="string" />
    </definition>
    <definition name="mostraLogin" extends="layout">
        <put name="corpo" value="/jsp/login.jsp"/>
    </definition>
    <definition name="mostraCodice" extends="layout">
        <put name="corpo" value="/jsp/codice.jsp"/>
    </definition>
    <definition name="mostraLingua" extends="layout">
        <put name="corpo" value="/jsp/sceltaLingua.jsp"/>
    </definition>
    <definition name="failLogin" extends="layout">
        <put name="corpo" value="/jsp/error_login.jsp"/>
    </definition>
    <definition name="erroreCodice" extends="layout">
        <put name="corpo" value="/jsp/error_codice.jsp"/>
    </definition>
    <definition name="dato" extends="layout">
        <put name="corpo" value="/jsp/protected/dato.jsp"/>
    </definition>
    <definition name="mostraDomanda" extends="layout_2">
        <put name="corpo" value="/jsp/mostraDomanda.jsp"/>
    </definition>
    <definition name="domandaSingola" extends="layout_2">
        <put name="corpo" value="/jsp/rispostaSingola.jsp"/>
    </definition>
    <definition name="domandaMultipla" extends="layout_2">
        <put name="corpo" value="/jsp/rispostaMultipla.jsp"/>
    </definition>
    <definition name="domandaAperta" extends="layout_2">
        <put name="corpo" value="/jsp/rispostaAperta.jsp"/>
    </definition>
</tiles-definitions>
ora, quando vuoi vedere una pagina chiami /path.do se vuoi che venga
eseguita.
capito?
ciao