IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Struts 1 Java Discussion :

Balises struts imbriquees


Sujet :

Struts 1 Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 27
    Par défaut Balises struts imbriquees
    Bonjour!

    Je me trouve confronte a un problème que de nombreux utilisateurs ont du avoir avant moi, malheureusement je n'y ai pas encore trouve de solution. Je m'explique: dans mon application, un utilisateur peut créer des liens, avec un nom et une url. Je souhaite mettre en place une JSP a travers laquelle l'utilisateur pourra modifier ces liens. Dans le formulaire j'utilise du code JAVA, car je ne sais pas comment affecter une valeur d'un bean dans le champ value:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <logic:iterate id="lien" name="listLiens">
    <tr>
    	<td><bean:write name="lien" property="nomLien" /></td>
    	<td><html:text property="<%=((LinksModel)lien).getNomLien()%>" size="40" maxlength="100" value="<%=((LinksModel)lien).getAdresseLien()%>" /></td>				
    </tr>
    </logic:iterate>
    Cela fonctionne tres bien, mais ca ne me semble pas être une bonne solution. Dans l'absolu je voudrais remettre au niveau des paramètres "property" et "value" la valeur que j'obtiens avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <bean:write name="lien" property="nomLien" />
    donc en quelque sorte imbriquer des balises struts, ce qui ne fonctionne pas. Auriez vous une idée (ou un lien vers une page qui traite ce probleme)?

    Merci beaucoup!

  2. #2
    Expert confirmé

    Femme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Par défaut
    Pour permettre la modification de la propriété nomLien des objets de type LinksModel présent dans la collection listLiens, il faut que la collection listeLiens soit une propriété de l'ActionForm et que le tag logic:iterate soit dans un tag html:form.

    Ensuite,

    soit tu ajoutes l'attribut indexed="true" dans le tag html:text comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <logic:iterate id="lien" name="nomDuFormBean" property="listLiens">
    <tr>
    	<td><html:text name="lien" property="nomLien" indexed="true" size="40" maxlength="100" /></td>				
    </tr>
    </logic:iterate>
    et tu codes getter et setter indexés sur l'objet de type LinksModel dans l'ActionForm.

    soit plus simplement tu utilises les tags nested :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <nested:iterate property="listLiens">
    <tr>
    	<td><nested:text property="nomLien" size="40" maxlength="100" /></td>				
    </tr>
    </nested:iterate>
    soit tu ajoutes l'attribut indexId dans le tag logic:iterate et tu utilises l'index et une EL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <logic:iterate id="lien" name="nomDuFormBean" property="listLiens" indexId="index">
    <tr>
    	<td><html:text property="listLiens[${index}].nomLien" size="40" maxlength="100" /></td>				
    </tr>
    </logic:iterate>
    cette solution fonctionne en J2EE 1.4 (Servlet 2.4/JSP 2.0) ou plus.

    Si tu es en J2EE 1.3, tu peux utiliser la tld struts-html-el.tld :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <logic:iterate id="lien" name="nomDuFormBean" property="listLiens" indexId="index">
    <tr>
    	<td><html-el:text property="listLiens[${index}].nomLien" size="40" maxlength="100" /></td>				
    </tr>
    </logic:iterate>
    sans oublier d'ajouter au début de la jsp la directive taglib qui pointe sur cette tld.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 27
    Par défaut
    Woawww! quelle réponse complète, claire et rapide! Je vais regarder un peu tout ça, ça ne pourra pas me faire de mal. Un grand merci!

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 27
    Par défaut
    Bonjour,

    j'essaie de mettre en place la 3e solution, qui me semble très proche de ce que j'avais, mais ce n'est pas très concluant. J'ai place exactement le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <logic:present name="listLiens">
    	<bean:define id="listLiens" name="listLiens" scope="session" />
    	<logic:iterate id="lien" name="listLiens">
    		<tr>
    		<td><bean:write name="lien" property="nomLien" /></td>
    		<td><html:text property="${lien.nomLien}" size="40" maxlength="100" value="${lien.nomLien}" /></td>				
    		</tr>
    	</logic:iterate>
    </logic:present>
    Mais dans ce cas la chaine ${lien.nomLien} est affichée. Dois-je déclarer mon objet lien quelque part?

    J'ai aussi essaye avec le code que tu m'avais donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <logic:present name="listLiens">
    	<bean:define id="listLiens" name="listLiens" scope="session" />
    	<logic:iterate id="lien" name="listLiens" property="listLiens" indexId="index">
    		<tr>
    		<td><bean:write name="lien" property="nomLien"/></td>
    		<td><html:text property="listLiens[${index}].nomLien" size="40" maxlength="100" value="listLiens[${index}].adresseLien" /></td>				
    		</tr>
    	</logic:iterate>
    </logic:present>
    Dans ce cas j'obtiens le message d'erreur suivant:

    org.apache.jasper.JasperException: An exception occurred processing JSP page /modifier_lien.jsp at line 21

    18: <table>
    19: <logic:present name="listLiens">
    20: <bean:define id="listLiens" name="listLiens" scope="session" />
    21: <logic:iterate id="lien" name="listLiens" property="listLiens" indexId="index">
    22: <tr>
    23: <td><bean:write name="lien" property="nomLien"/></td>
    24: <td><html:text property="listLiens[${index}].nomLien" size="40" maxlength="100" value="listLiens[${index}].adresseLien" /></td>

    Auriez vous une idee de ce que j'ai mal fait?

  5. #5
    Expert confirmé

    Femme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Par défaut
    Le premier code que tu as fourni ne peut pas fonctionner.

    Par contre, concernant le second, dans l'attribut name du tag logic:iterate, il faut mettre le nom du form-bean et non le nom de la collection, et il ne faut pas faire de bean:define.
    En fait, au lieu de mettre la collection listLiens dans le scope session, il faut initialiser la collection listLiens du form-bean via son setter dans l'Action qui s'exécute avant l'affichage de la page :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TonActionForm tonActionForm=(TonActionForm) form ;
    tonActionForm.setListLiens(listLiens) ;
    Pour que cela fonctionne, il faut référencer le form-bean dans le mapping de cette Action, dans le struts-config.xml.

    Sinon, il ne faut pas préciser d'attribut value dans le tag html:text.
    Avec le code que je t'ai fourni, le champ sera automatiquement renseigné avec la valeur de la propriété nomLien de chaque objet de type LinksModel constituant la collection listLiens.
    De plus, comme je l'ai précisé précédemment, pour que l'EL ${index} soit interprétée, il faut être en J2EE 1.4 ou plus. Apparemment, ce n'est pas le cas.

    Peux-tu montrer le début de ton web.xml et préciser quel serveur d'applications tu utilises et sa version ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 27
    Par défaut
    Je m'aperçois qu'il y a pas mal de notions qui me sont encore très vagues... enfin bon je pense avoir réussi a avancer quelque peu sur ce problème en suivant tes conseils. Pour expliquer rapidement:

    - 1 JSP appelle l'action StartModifyLinksAction
    - Celle-ci est déclarée dans le struts-config associée au bean ListLink (ActionForm ayant pour attribut une liste + getter/setter)
    - Elle initialise ce bean via son setter et envoie a la JSP modifier_lien.jsp

    A ce moment j'utilise le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    <html:form action="/ChangingLinksDetails.do">
    	<logic:present name="listLiens">
    		<logic:iterate id="lien" name="ListLinks" property="listLinks">
    		<tr>
    			<td><bean:write name="lien" property="nomLien"/></td>
    			<td><html:text name="lien" property="adresseLien" size="40" maxlength="100"/></td>				
    		</tr>
    		</logic:iterate>
    	</logic:present>
     
    	<tr>
    		<td><html:submit value="Submit" /></td>
    		<td><html:submit value="Cancel" onclick="window.close()" /></td>
    	</tr>
    </html:form>
    Qui affiche bien ce que je veux. J'ai modifier l'endroit ou il était question d'EL, car je n'arrivais pas a le faire fonctionner (problème de version? je crois pourtant bien être en 1.4 :s), je ne suis pas sur d'en avoir besoin mais peut-être ai-je tort?

    Le problème qui se pose maintenant est que je ne récupère aucune information de formulaire dans l'Action invoquée ensuite. Cette derniere est ainsi definie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <action path="/ChangingLinksDetails" type="links.action.ModifyLinkAction"
    		 	scope="request" name="ListLinks" input="/modifier_lien.jsp">
    ListLink étant le même bean utilise que dans l'action précédente, et modifier_lien.jsp la page contenant le formulaire. N'ayant jamais manipule de listes dans mes formulaires, tout cela est assez confus...

    Un grand merci pour toutes vos aides ou contributions!

    PS: j'utilise Tomcat 6.0. Je ne suis pas certain de savoir ou trouver la version J2EE utilisee. J'ai cherche un peu dans les propriétés du projet, et trouve "JDK compiler compliace 1.4"

    Le début de mon web.xml (y a-t-il des choses a modifier?):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    <?xml version="1.0" ?>
    <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
    <web-app>
    <display-name>Test_struts</display-name>
        <servlet>
            <servlet-name>action</servlet-name>
            <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
            <init-param>
                <param-name>debug</param-name>
                <param-value>4</param-value>
            </init-param>
            <init-param>
                <param-name>config</param-name>
                <param-value>/WEB-INF/struts-config.xml</param-value>
            </init-param>
            <init-param>
                <param-name>detail</param-name>
                <param-value>2</param-value>
            </init-param>
            <init-param>
                <param-name>validate</param-name>
                <param-value>true</param-value>
            </init-param>
            <load-on-startup>2</load-on-startup>
        </servlet>

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Scriplet dans balises struts
    Par Mister Nono dans le forum Struts 1
    Réponses: 19
    Dernier message: 12/03/2007, 17h21
  2. scriptlets à l'interieur d'une balise struts
    Par gloglo dans le forum Struts 1
    Réponses: 3
    Dernier message: 21/12/2006, 10h08
  3. Balise struts non interpretée
    Par TomyMak dans le forum Struts 1
    Réponses: 3
    Dernier message: 22/11/2006, 15h23
  4. valeur champ javaScript/ balise struts
    Par chouchou93 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 19/06/2006, 16h10
  5. Problème balise struts / weblogic
    Par DarkWark dans le forum Weblogic
    Réponses: 2
    Dernier message: 18/05/2006, 22h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo