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 :

[Débutant] Tag Text et type "complexe" ?


Sujet :

Struts 1 Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 55
    Points : 47
    Points
    47
    Par défaut [Débutant] Tag Text et type "complexe" ?
    Bonjour tout le monde,
    je débute sur Struts et je n'arrive pas à utiliser un type "complexe" dans un tag "text". Je m'explique :
    - j'ai une classe Personne et une classe Nom.
    - la classe Nom est composée de 2 String : firstname, lastname
    - la classe Personne a un membre Nom

    Quand j'accède via les taglib bean, je peux tout à fait faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	<bean:write name="person" property="nom.firstname"/>
    	<bean:write name="person" property="nom.lastname"/>
    par contre, impossible de faire la meme chose avec le taglib html text. Si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	Nom : <html:text property="nom.firstname" /><br />
    	Prenom : <html:text property="nom.lastname" /><br />
    ca me genere une exception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    javax.servlet.ServletException: Invalid argument looking up property: "nom.firstname" of bean: "org.apache.struts.taglib.html.BEAN"
    Merci d'avance pour vos lumieres

  2. #2
    Expert éminent

    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
    Points : 7 778
    Points
    7 778
    Par défaut
    Essaie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	Nom : <html:text name="person" property="nom.firstname" /><br />
    	Prenom : <html:text name="person" property="nom.lastname" /><br />
    Modératrice Java - Struts, Servlets/JSP, ...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 55
    Points : 47
    Points
    47
    Par défaut
    j'avais testé entre temps, mais ca me sort toujours une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    javax.servlet.ServletException: Invalid argument looking up property: "nom.firstname" of bean: "person"
    je comprends pas pourquoi il me dit qu'il ne trouve pas cette propriété ... j'ai meme essayé de passer l'attribut firstname de Nom en public des fois que, mais non ...

  4. #4
    Expert éminent

    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
    Points : 7 778
    Points
    7 778
    Par défaut
    Ton objet person est une propriété d'une ActionForm ou tu l'as simplement mis dans le scope via un setAttribute ?
    Modératrice Java - Struts, Servlets/JSP, ...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 55
    Points : 47
    Points
    47
    Par défaut
    Personne est un ActionForm, c'est le bean de mon formulaire :

    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
    public class PersonFormBean extends ActionForm {
    	private int age;
    	private Nom nom;
     
    	public Nom getNom() {
    		return nom;
    	}
    	public void setNom(Nom nom) {
    		this.nom = nom;
    	}
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
     
    }

  6. #6
    Membre éprouvé
    Avatar de yolepro
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 918
    Points : 1 144
    Points
    1 144
    Par défaut
    Tu as un problème de conception..

    Si tu utilises html:text, il faut appeler les proprietes de ton form.

    Donc si tu as un form person avec une propriete nom... et bien tu appelles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html:text name="person" property="nom" />
    Maintenant rien ne t'empeche de mettre un objet User contenant une propriete firstname dans ton form. et du coup de l'appeler comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html:text name="person" property="user.firstname" />
    Bien sur il faut que user ait des accesseurs get et set de firstname.
    Etre c'est etre relatif.

  7. #7
    Expert éminent

    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
    Points : 7 778
    Points
    7 778
    Par défaut
    Alors, si j'ai bien compris, tu as un form-bean déclaré comme ceci dans le struts-config.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <form-bean name="person" type="unPackage.PersonFormBean "/>
    Et dans l'Action qui initialise le formulaire, tu as codé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    PersonFormBean person = (PersonFormBean) form ;
    person.setNom(nom) ;
    Dans le mapping de cette Action, tu as mis l'attribut name="person".

    Si c'est bien ça, dans la jsp, ceci devrait fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html:text name="person" property="nom.firstname" />
    Si j'ai tout faux, donne-moi plus de précision : mapping de l'Action dans le struts-config.xml, code de l'Action qui initialise le formulaire...
    Modératrice Java - Struts, Servlets/JSP, ...

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 55
    Points : 47
    Points
    47
    Par défaut
    yolepro : je vois pas de différence entre ce que tu me dis et ce que je fais

    c_nvy : tu as bien compris ce que je fais (à ceci près que je n'essaye meme pas d'initialiser mon formulaire, simplement de l'afficher avec un tag html:text)

    pour plus d'info, voici mon mapping :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <form-beans>
    		<form-bean name="person" type="struts.PersonFormBean"></form-bean>
    	</form-beans>
    	<action-mappings>
    		<action path="/initFormPers"
    			name="person"
    			type="struts.InitFormPersAction"
    			input="/errors.do">
    			<forward name="formPerson" path="/formPerson.jsp"></forward>		
    		</action>
    	</action-mappings>
    ma classe Nom (dans le doute, j'en ai refais une qui étend ActionForm, je sais pas si c'est nécessaire ...) :
    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
    package struts;
     
    import org.apache.struts.action.ActionForm;
     
    public class NomFormBean extends ActionForm {
    	private String firstname;
    	private String lastname;
    	public String getFirstname() {
    		return firstname;
    	}
    	public void setFirstname(String firstname) {
    		this.firstname = firstname;
    	}
    	public String getLastname() {
    		return lastname;
    	}
    	public void setLastname(String lastname) {
    		this.lastname = lastname;
    	}
    }
    ma classe Personne :
    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
    package struts;
     
    import java.util.Collection;
     
    import org.apache.struts.action.ActionForm;
     
    public class PersonFormBean extends ActionForm {
    	private int age;
    	private NomFormBean nom;
     
    	public NomFormBean getNom() {
    		return nom;
    	}
    	public void setNom(NomFormBean nom) {
    		this.nom = nom;
    	}
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    }
    et ma jsp :
    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
    <%@ taglib prefix="html" uri="/WEB-INF/struts-html.tld" %>
    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
        pageEncoding="ISO-8859-1"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Insert title here</title>
    </head>
    <body>
    	<h1>Ajout d'une personne</h1>
    	<html:form action="addPerson.do">
    		Nom : <html:text name="person" property="nom.firstname" /><br />
    		Prenom : <html:text name="person" property="nom.lastname" /><br />
    		Age : <html:text property="age" /><br />
    		Evenement : <html:select property="events" multiple="true" size="10" >
    						<html:options property="eventsDispos"/>
    		</html:select>
    		<html:submit />
    	</html:form>
    </body>
    </html>
    j'pensais avoir compris la philosophie struts, visiblement quelques ficelles m'échappent

  9. #9
    Expert éminent

    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
    Points : 7 778
    Points
    7 778
    Par défaut
    Mais si tu n'initialises pas ton formulaire, à quoi sert ton Action InitFormPersAction ?
    Qu'as-tu codé dedans ?

    Ce qui n'est pas clair dans ton discours, c'est que tu dis que tu as une classe Personne mais en fait, elle s'appelle PersonFormBean et non Personne.

    Petite précision : si dans le mapping de ton Action de path /addPerson, tu as codé l'attribut name="person", il n'est pas utile de le mettre dans le tag html:text.
    Modératrice Java - Struts, Servlets/JSP, ...

  10. #10
    Membre éprouvé
    Avatar de yolepro
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2002
    Messages : 918
    Points : 1 144
    Points
    1 144
    Par défaut
    Citation Envoyé par DemonKN
    yolepro : je vois pas de différence entre ce que tu me dis et ce que je fais
    Ce que tu fais est vraiment bizarre.
    Tu connais la différence entre un Bean et un Form ?

    Pour tes objets PersonFormBean et NomFormBean extends tous les deux ActionForm ???

    C'est quand même pas compliqué d'avoir un bean User tel que suit :
    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
     
    public final class User implements Serializable {
     
    	private String lastname;
     
    	private String firstname;
     
    	public String getFirstname() {
    		return firstname;
    	}
     
    	public void setFirstname(String firstname) {
    		this.firstname = firstname;
    	}
     
    	public String getLastname() {
    		return lastname;
    	}
     
    	public void setLastname(String lastname) {
    		this.lastname = lastname;
    	}
    }
    Et ensuite dans ton form tu as :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public final class tonForm extends ActionForm {
     
    	private User user;
     
     
    	public User getUser() {
    		return user;
    	}
     
    	public void setUser(User user) {
    		this.user = user;
    	}
     
    }
    Et enfin une fois que dans ton action tu as rempli ton Form avec un User tu forward vers ta JSP qui fait ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html:text name="tonForm" property="user.firstname" />
    Etre c'est etre relatif.

  11. #11
    Expert éminent sénior


    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    7 856
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 7 856
    Points : 34 380
    Points
    34 380
    Par défaut
    Bonjour,

    sur le dernier point (la taglib), il me semble (mais je n'ai pas l'occasion de vérifier) que la notation pointée dans la taglib <html: de struts ne soit pas supportée. Dans ce cas, il faut utiliser la taglib <nested: qui elle l'accepte.

    Eric

  12. #12
    Expert éminent

    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
    Points : 7 778
    Points
    7 778
    Par défaut
    Citation Envoyé par Ricky81
    Bonjour,

    sur le dernier point (la taglib), il me semble (mais je n'ai pas l'occasion de vérifier) que la notation pointée dans la taglib <html: de struts ne soit pas supportée. Dans ce cas, il faut utiliser la taglib <nested: qui elle l'accepte.

    Eric
    Ca fonctionne, je l'ai déjà utilisé mais avec un form-bean initialisé.

    Donc, dans le cas de DemonKN, tu dois avoir raison, le tag nested doit être le plus adapté.

    Et pour le reste, il faut suivre les conseils de yolepro.
    Modératrice Java - Struts, Servlets/JSP, ...

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 55
    Points : 47
    Points
    47
    Par défaut
    yolepro : pour un modérateur tu ne sembles pas avoir bcp de patience tu crois que j'ai mis [débutant] dans mon titre pour faire joli ?

    donc la différence entre bean et form je pense l'avoir saisie, le truc c'est que je redéclarais tous les champs de mon bean dans le form pas malin, je te l'accorde. Maintenant j'ai refais plus propre.

    c_nvy : l'init de mon formulaire charge une liste d'evenements rattachés à une personne, donc rien à voir avec mon probleme, c'est pour ça que je n'ai pas encombré le sujet de ce code là.

    et je n'arrive à rien, ni avec le nested ni avec le html Voici mes classes :

    Mon bean Person :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    public class Person {
    		private int id;
    		private int age;
    		private Set events = new HashSet();
    		private Nom nom;
     
    		public int getAge() {
    			return age;
    		}
    		public void setAge(int age) {
    			this.age = age;
    		}
    		public Set getEvents() {
    			return events;
    		}
    		public void setEvents(Set events) {
    			this.events = events;
    		}
    		public int getId() {
    			return id;
    		}
    		public void setId(int id) {
    			this.id = id;
    		}
    		@Override
    		public String toString() {
    			if (nom != null) return nom.getFirstname()+ " " + nom.getLastname()+ " : " + age + " ans";
    			else return "Nom non renseigné";
    		}
    		public Nom getNom() {
    			return nom;
    		}
    		public void setNom(Nom nom) {
    			this.nom = nom;
    		}
    }
    ma classe Nom :
    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
    27
    public class Nom {
    	public String firstname;
    	public String lastname;
    	public Nom() {
    	}
    	public Nom(String firstname, String lastname) {
    		this.firstname = firstname;
    		this.lastname = lastname;
    	}
    	public String getFirstname() {
    		return firstname;
    	}
    	public void setFirstname(String firstname) {
    		this.firstname = firstname;
    	}
    	public String getLastname() {
    		return lastname;
    	}
    	public void setLastname(String lastname) {
    		this.lastname = lastname;
    	}
    	@Override
    	public boolean equals(Object obj) {
    		Nom other = (Nom)obj;
    		return (firstname.equalsIgnoreCase(other.getFirstname()) && lastname.equalsIgnoreCase(other.getLastname()));
    	}
    }
    mon form PersonBeanForm :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class PersonFormBean extends ActionForm {
    	private Person personne;
     
    	public Person getPersonne() {
    		return personne;
    	}
     
    	public void setPersonne(Person personne) {
    		this.personne = personne;
    	}
    }
    et mon jsp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <body>
    	Détail d'une personne : 
    	<bean:write name="person" property="personne.nom.firstname"/>
    	<bean:write name="person" property="personne.nom.lastname"/>
    </body>
    et l'erreur que j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	<h1>Ajout d'une personne</h1>
    	<html:form action="addPerson.do">
    		<html:text name="person" property="personne.nom.firstname" />
    		<html:text name="person" property="personne.nom.lastname" />
    	</html:form>
    un petit bout de mon struts-config :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    	<form-beans>
    		<form-bean name="person" type="struts.PersonFormBean"></form-bean>
    	</form-beans>
    	<action-mappings>
    		<action 
    			path="/detailPersonne"
    			name="person"
    			type="struts.DetailPersonneAction">
    			<forward name="detail" path="/detailPersonne.jsp"></forward>
    		</action>
     
    		<action path="/listPersonne"
    			parameter="/listPersonne.jsp"
    			type="org.apache.struts.actions.ForwardAction">
    		</action>
     
    		<action path="/initFormPers"
    			name="person"
    			type="struts.InitFormPersAction"
    			input="/errors.do">
    			<forward name="formPerson" path="/formPerson.jsp"></forward>		
    		</action>
     
    		<action path="/formPerson"
    			parameter="/formPerson.jsp"
    			type="org.apache.struts.actions.ForwardAction" />
     
    		<action path="/addPerson"
    			name="person"
    			input="/errors"
    			type="struts.PersonFormAction">
    			<forward name="detail" path="/detailPersonne.jsp"></forward>
    		</action>
     
    		<action path="/errors"
    			parameter="/errors.jsp"
    			type="org.apache.struts.actions.ForwardAction" />
     
    	</action-mappings>
    j'appelle mon formulaire par l'url initFormPers.do.

    Merci de vous être penchés sur mon probleme

    edit : j'ai oublié de vous mettre la "nouvelle" erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Invalid argument looking up property: "personne.nom.firstname" of bean: "person"

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 55
    Points : 47
    Points
    47
    Par défaut
    un détail "marrant" que je viens de constater ... si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <nested:text name="person" property="lastname" />
    j'ai une nouvelle exception :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    No getter method for property: "lastname" of bean: "person"
    on ne doit pas retaper tous les getter/setter dans le bean du formulaire quand meme, si ?

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 55
    Points : 47
    Points
    47
    Par défaut
    j'ai finalement trouvé : mon objet personne contenu dans mon formBean était null, c'est pour ça qu'il me lançait une exception en faisant persone.nom.firstname ...

    merci pour votre aide en tout cas, ca m'a aidé à clarifier certains autres points

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

Discussions similaires

  1. [MySQL] Sauvegarder du texte (db mysql) CR, single-quote, double-quote, etc
    Par vandeyy dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 12/03/2007, 11h22
  2. Réponses: 5
    Dernier message: 15/04/2005, 14h22

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