Recuperer la valeur selectionnée avec struts

Fermé
juliette123 Messages postés 23 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 1 janvier 2009 - 28 sept. 2008 à 15:41
juliette123 Messages postés 23 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 1 janvier 2009 - 10 oct. 2008 à 19:46
Bonjour,
je travaille avec struts,
j'ai une liste deroulante et j'ai besoin de recuperer la valeur selectionnée pour la soumettre comme parametre a une fonction java.

j'ai pensé à faire:

request.setAttribute("valeur",......????.............);
pouvez vous m'aider,je suis tout à fait bloquée!!

9 réponses

juliette123 Messages postés 23 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 1 janvier 2009 3
29 sept. 2008 à 12:00
salut Marco,ça fait plaisir de te retrouver sur le forum.
oui,je travaille tjs avec struts1
voici le code de la liste:

<logic:iterate id="utilisateur" name="utilisateur"  scope="session" type="data.Utilisateur">
<td class="Style2"> Objectifs individuel :</td>
	<td>
                        <select name="objIndiv" id="objIndiv" onChange=update(this); >
                        <%	Iterator it = GetList.getObjByUserId(id).iterator(); 
		String ob=null;
		while(it.hasNext()){
		ObjIndiv objindiv =(ObjIndiv)it.next();
		ob=objindiv.getLibelleObjIndiv();				
	         %>			
             <option type="text" size="50" value="<%=objindiv.getLibelleObjIndiv()%>"><%=ob %> </option>
	               <%}%> </select>  </td>  
</logic:iterator>


mon dernier recours est d'utiliser Ajax,mais je me suis dite qu'il est impossible que struts ne fait pas ça
1
Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 329
29 sept. 2008 à 22:02
Bonsoir,
Dans ta jsp tu utilises le tag <select> qui n'est pas un tag Struts.
Pour faire ce que tu souhaites, tu dois utiliser le tag struts <html:select> (l'attribut property te permet de spécifier le nom du paramètre qui sera envoyé dans ta requête lors du submit).
Cependant, ce tag <html:select> doit être inclus dans un tag <s:form>, et la valeur ne sera donc envoyée que lorsque tu feras un submit de ton formulaire.

Par contre, si tu veux récupérer ta valeur dès que tu la changes, il te faut utiliser ajax (soit pour forcer un submit du formulaire, je n'ai jamais fait ça mais j'imagine que c'est possible; soit pour créer un xmlHttpRequest pour envoyer la nouvelle valeur au serveur).

Cordialement,
0
juliette123 Messages postés 23 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 1 janvier 2009 3 > Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009
30 sept. 2008 à 12:16
bonjour,
j'ai essayé avec le tag html:select,mais il me genère cette erreur:Cannot find bean under name maListe

avec dans l'action:
HttpSession session=request.getSession(true);
session.setAttribute("maListe", GetListe.getOrientation());
return mapping.findForward("showFiche");


et dans la jsp:
<html:form action="/userFiche">
       <html:select property="libelleorientation">
	<html:options collection="maListe" property= "name " labelProperty= "name "/>
       </html:select>
       <html:submit/><html:cancel/>
</html:form>


j'ai beau cherché sur le net,il y'a pas mal de personne qui ont eu cette erreur,mais pas de solution!!
0
Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 329 > juliette123 Messages postés 23 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 1 janvier 2009
1 oct. 2008 à 14:37
Salut,
Tout d'abord, vérifie bien que maListe n'est pas null. Ensuite essaie ça stp :
<logic:present name="maliste">
 <html:form action="/userFiche">
        <html:select property="libelleorientation">
 	<html:options collection="maListe" property= "name " labelProperty= "name "/>
        </html:select>
        <html:submit/><html:cancel/>
 </html:form>
</logic:present>


Si ça ne fonctionne pas de suite, essaie de mettre maListe dans la request et non pas dans la session (je ne sais pas si ça répond à ton besoin, mais essaie tout de même).

Cordialement,
0
Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 329
28 sept. 2008 à 21:00
Salut juliette123,
Tu bosses toujours avec struts1 ?
Quel tag utilises-tu? html:select?

Cordialement,
0
juliette123 Messages postés 23 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 1 janvier 2009 3
2 oct. 2008 à 22:37
salut marco,effectivement il s'est averé que maListe était vide,il y'avait un probleme au niveau de la methode qui la recupère.
alors j'ai essayé avec une autre liste dont je suis sûre qu'elle n'est pas vide et elle marche très bien ,avec cette methode:
public static List getPhaseByCode(){
		Session session = HibernateSessionFactory.getSession();
		List list = null;
		 try{
			Query query=session.createQuery(" from Phase u "  );
			
			list =query.list();
			
			
		}catch(Exception ex){
			ex.printStackTrace();
		}
		return list;
	}


mais dès que j'ajoute une condition du type:

public static List getPhaseByCode(String code){
		Session session = HibernateSessionFactory.getSession();
		List list = null;
		 
		
		try{
		Query query=session.createQuery(" from Phase u where u.codeObjIndiv=" +code );
			
			list =query.list();
			
			
		}catch(Exception ex){
			ex.printStackTrace();
		}
		return list;
	}


je pense que c'est juste un problme de requette
0
juliette123 Messages postés 23 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 1 janvier 2009 3
2 oct. 2008 à 22:54
rebonjours,
j'ai essayé avec d'autres attributs dans la requette(idPhase,numPhase...)et ça marche très bien,le probleme c'est que l'association Phase,ObjIndiv est une association many to one,à chaque ObjIndiv correspond plusieurs phases,peut etre que le probleme vient de là
0
Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 329
2 oct. 2008 à 23:07
Bonsoir Juliette,
Ok, on passe donc d'un problème Struts à un problème Hibernate. On avance.
Peux-tu me donner le code de ta classe Phase stp ?
Ce qui m'intéresse surtout c'est :
- comment tu déclares l'attribut codeObjIndiv ?
- quelles annotations as tu utilisé pour configurer ta relation ManyToOne (ou si tu n'utilises pas d'annotations, peux-tu joindre ton fichier xml stp).

Merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
juliette123 Messages postés 23 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 1 janvier 2009 3
2 oct. 2008 à 23:16
voici le fichier Phase.hbm.xml:
<hibernate-mapping>
    <class name="data.Phase" table="PHASE" schema="BASE">
        <id name="idphase" type="java.lang.Long">
            <column name="IDPHASE" precision="22" scale="0" />
            <generator class="increment"></generator>
        </id>
        <many-to-one name="objIndiv" class="data.ObjIndiv" fetch="select">
            <column name="CODE_OBJ_INDIV" length="20" not-null="true" />
        </many-to-one>
        <property name="libellePhase" type="java.lang.String">
            <column name="LIBELLE_PHASE" length="100" />
        </property>
        <property name="dateDeb" type="java.util.Date">
            <column name="DATE_DEB" length="7" />
        </property>
        <property name="dateFin" type="java.util.Date">
            <column name="DATE_FIN" length="7" />
        </property>
        <property name="duree" type="java.lang.String">
            <column name="DUREE" length="20" />
        </property>
        <property name="numphase" type="java.lang.Long">
            <column name="NUMPHASE" precision="22" scale="0" not-null="true" />
        </property>
        <set name="necessiters" inverse="true">
            <key>
                <column name="IDPHASE" precision="22" scale="0" not-null="true" />
            </key>
            <one-to-many class="data.Necessiter" />
        </set>
    </class>
</hibernate-mapping>


la classe Phase.java:

public class Phase extends AbstractPhase implements java.io.Serializable {

    // Constructors

    /** default constructor */
    public Phase() {
    }

	/** minimal constructor */
    public Phase(ObjIndiv objIndiv, Long numphase) {
        super(objIndiv, numphase);        
    }
    
    /** full constructor */
    public Phase(ObjIndiv objIndiv, String libellePhase, Date dateDeb, Date dateFin, String duree, Long numphase, Set necessiters) {
        super(objIndiv, libellePhase, dateDeb, dateFin, duree, numphase, necessiters);        
    }
   
}


et la classe AbstactPhase.javva:
public abstract class AbstractPhase  implements java.io.Serializable {


    // Fields    

     private Long idphase;
     private ObjIndiv objIndiv;
     private String libellePhase;
     private Date dateDeb;
     private Date dateFin;
     private String duree;
     private Long numphase;
     private Set necessiters = new HashSet(0);


    // Constructors

    /** default constructor */
    public AbstractPhase() {
    }

	/** minimal constructor */
    public AbstractPhase(ObjIndiv objIndiv, Long numphase) {
        this.objIndiv = objIndiv;
        this.numphase = numphase;
    }
    
    /** full constructor */
    public AbstractPhase(ObjIndiv objIndiv, String libellePhase, Date dateDeb, Date dateFin, String duree, Long numphase, Set necessiters) {
        this.objIndiv = objIndiv;
        this.libellePhase = libellePhase;
        this.dateDeb = dateDeb;
        this.dateFin = dateFin;
        this.duree = duree;
        this.numphase = numphase;
        this.necessiters = necessiters;
    }
//accessors


pas de codeObjIndiv!!
0
Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 329
3 oct. 2008 à 00:56
Rebonsoir,
Je pense que c'est normal que ta requête "from Phase u where u.codeObjIndiv=" +code ne marche pas, vu que tu n'as pas d'attribut codeObjIndiv.

Dans ta classe AbstractPhase tu as ceci :
private ObjIndiv objIndiv;

//Et je suppose l'accesseur correspondant :
public ObjIndiv getObjIndiv() {
 return objIndiv;
}


Tes objets Phase vont donc hériter de cet attribut et de cette méthode, donc en principe la requête suivante devrait marcher :
"from Phase u where u.objIndiv = " + code

Cependant, si c'est effectivement le cas, tu aurais du avoir une exception lors de ta précédente requête signalant que ta classe Phase ne possède pas d'argument codeObjIndiv.

Si cette solution ne fonctionne pas, on regardera alors plus en avant dans le fichier xml.
0
juliette123 Messages postés 23 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 1 janvier 2009 3
3 oct. 2008 à 01:03
oui c'est ce que je me suis dis,mais objIndiv est une classe,il s'agit en fait d'une table,qu'est ce que j'aurais donc dans code,l'id??
0
Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 329
3 oct. 2008 à 12:16
Bonjour,
Oui, la requête que tu tapes ici c'est du HQL, c'est-à-dire que tu dois faire abstraction de la réalisation SQL pour utiliser ta conception objet. Quand tu fais u.toto, Hibernate ne va pas regarder si tu as une colonne 'toto' dans ta table Phase, mais il va essayer d'accéder à la méthode getToto() de ta classe Phase.

Cordialement,
0
juliette123 Messages postés 23 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 1 janvier 2009 3
3 oct. 2008 à 01:10
ça a marché ,je lui est donné l'id.ouf un probleme de moins,mtn je doix voir cet histoir d'Ajax
0
juliette123 Messages postés 23 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 1 janvier 2009 3
4 oct. 2008 à 01:36
bonjours,
comme je t'es dis ça a marché en utilisant l'id,mais je l'id qui est ici le code est de type String,alors je ne sais pas quoi faire au nivau de la declaration de la fct:
ça:
public static List getPhaseByCode(ObjIndiv code){
		Session session = HibernateSessionFactory.getSession();
		List list = null;
		 
		
		try{
			Query query=session.createQuery(" from Phase u where objIndiv="+code );
			
			list =query.list();
			
			
		}catch(Exception ex){
			ex.printStackTrace();
		}
		return list;
	}


ou ça:
public static List getPhaseByCode(String code){
		Session session = HibernateSessionFactory.getSession();
		List list = null;
		 
		
		try{
			Query query=session.createQuery(" from Phase u where objIndiv="+code );
			
			list =query.list();
			
			
		}catch(Exception ex){
			ex.printStackTrace();
		}
		return list;
	}

sachant que le code que je vais utiliser c'est la valeur selectionnée dans le select des objectifs,et que je vais recuperer avec ajax,il sera dond de type String
0
Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 329
10 oct. 2008 à 19:32
Salut Juliette,
Désolé pour le manque de réactivité, j'étais en vacances.
Je dirais que la réponse dépend de ta façon de coder. Mes solutions :

1- Tu reçois un string de ta request. Ce string (ton id), tu vas l'utiliser pour faire une recherche en BD afin de récupérer ton objet ObjIndiv, et une fois récupéré, tu vas faire appel à ta méthode getPhaseByCode( ObjIndiv obj).

2- Si ton objet indiv est uniquement composé du code, tu crées un constructeur prenant un string en argument, tu crées ton objet et tu fais appel à ta méthode getPhaseByCode( ObjIndiv obj).

La première méthode est plus gourmande parce que tu fais une vérification en BD : si ton objet n'existe pas (erreur de saisie de l'utilisateur ou tentative de piratage), une exception est levée et tu peux la traiter. Cependant, cette vérification est une requête en base de donnée, donc tu dois t'arranger pour l'insérer dans une transaction existante si tu veux que ce ne soit pas trop coûteux en temps.
En général c'est ce qui est fait : il faut toujours vérifier les données envoyées dans la request avant de les traiter tels quels.
Ainsi, la seconde méthode est plus risquée : tu crées un objet directement depuis la string récupérée, sans vérifier que ton objet indiv existe en base, et ça peux être dangereux.

Cordialement,
0
juliette123 Messages postés 23 Date d'inscription dimanche 7 septembre 2008 Statut Membre Dernière intervention 1 janvier 2009 3
10 oct. 2008 à 19:46
salut marco,j'espère que tes vaccances se sont bien passées.En fait j'ai fini par utiliser String code,et depuis j'ai travaillé sur ajax afin de recuperer le code,chose que j'ai reussis à faire,mais voilà que je m'affronte à un nouveau probleme,dailleurs j'ai posté un message ici:

http://www.commentcamarche.net/forum/affich 8816182 probleme de methode parametrable?#
0