lien dans un tableau

Nikko
lien dans un tableau

bonjour,

Dans mon application web (servlet+JSP), j'affiche les résultats d'une requête dans un tableau (le résultat retourné afficher les caractéristiques de produits). A ce tableau, je rajoute une colonne où j'insère un lien.

Ce lien doit donc rediriger l'utilisateur vers une autre page JSP, une page de réservation. Dans cette page de réservation, j'ai une liste de produit.

Ma question est de savoir, comment je peux mettre par défaut une information contenu dans la ligne du tableau où l'utilisateur a cliqué, dans ma page de réservation ?

Voici le code de ma requête et de mon tableau:

public String listetous() throws SQLException {
		String tableau = "<table border =1 align=center cellpadding='7'><tr><td colspan='6'><center><b><font color='green'>Liste des produits</font></center></td></tr><tr><td><font color='green'><center>Code</center></font></td><td><font color='green'><center>Modele</center></font></td><td><font color='green'><center>Marque</center></font></td><td><font color='green'><center>Type</center></font></td><td><font color='green'><center>Numéro de série</center></font></td><td><font color='green'><center>Afficher</center></font></td><font color='black'>";
		String produit = tableau;
		Statement st = conn.createStatement();
		ResultSet rs = st.executeQuery("SELECT * FROM produit;");
		rs.last();
		int nb = rs.getRow(); 
		rs.beforeFirst();
		int i = 1;
		while(i<=nb){
			rs.absolute(i);
			produit+="<tr><td>"+rs.getString(1)+"</td><td>"+rs.getString(2)+"</td><td>"+rs.getString(3)+"</td><td>"+rs.getString(4)+"</td><td>"+rs.getString(5)+"</td><td><a href=\"reservation_adm.jsp\">réservation</a> ou <a href=\"suppr_adm.jsp\">suppression</a></td></tr>" ;
			i++;
		}
		produit+="</font></table></center>";
		return produit;
	}

Il faudrait que le type de produit (soit rs.getString(4) ) soit gardé en mémoire et soit mis en valeur par défaut dans ma page de réservation.

Si vous avez une quelconque idée, je suis preneur !
Merci d'avance.

willbback
Re: lien dans un tableau

Bonjour,
tu dois simplement le mettre en paramètre de ta requête. Pour cela, il te faut ajouter le champ à la fin de l'url de la page du style ?=
Ton code d'affichage de la ligne devient alors :

			rs.absolute(i);
			produit+="<tr><td>"+rs.getString(1)+"</td><td>"+rs.getString(2)+"</td><td>"+rs.getString(3)+"</td><td>"+rs.getString(4)+"</td><td>"+rs.getString(5)+"</td><td><a href=\"reservation_adm.jsp?type_produit="+rs.getString(4)+"\">réservation</a> ou <a href=\"suppr_adm.jsp\">suppression</a></td></tr>" ;
			i++;

Il ne te restera plus qu'à récupérer le paramètre "type_produit" dans la page reservation_adm.jsp.
Bon courage...

Nikko

Merci beaucoup willback, je t'avoue que ton aide m'a été très précieuse tout au long de mon stage (qui se termine aujourd'hui :cry: ).

Je vais mettre ça en place dès que j'aurais finis de mettre des commentaires illustrant chaque ligne de mon programme (un travail long et pénible quand il y a plus de 1000 lignes de code :( )

Nikko

J'ai un problème malgré l'aide que tu m'as apporté. Je récupère un joli "null" dans ma liste, plutôt que la valeur que je souhaite...

je te mets ici le code de me JSP

<p align="center"> <font face="Broadway" size ="3">Type de produit :</font></p>
<p align="center"> <font face="Broadway" size ="3"><select name="codetype"> 
	<option value=<%=request.getParameter("type_produit")%>><%=request.getParameter("libelle") %></option>

Et ici le code de ma fonction de mon programme

	while(i<=nb){
			rs.absolute(i);
			produit+="<tr><td>"+rs.getString(1)+"</td><td>"+rs.getString(2)+"</td><td>"+rs.getString(3)+"</td><td>"+rs.getString(4)+"</td><td>"+rs.getString(5)+"</td><td><a href=\"reservation_adm.jsp?type_produit="+rs.getString(4)+"\"&&libelle=\"+rs.getString(6)\">réservation</a> ou <a href=\"suppr_adm.jsp\">suppression</a></td></tr>" ; 
			i++;
		}

Vraiment galère :X

willbback

Où se trouve le null ? dans la liste déroulante partie affichée ou dans la partie des valeurs... ?
je pense que ton code dans ta fonction a un problème, essaie ça :

while(i<=nb){ 
         rs.absolute(i); 
         produit+="<tr><td>"+rs.getString(1)+"</td><td>"+rs.getString(2)+"</td><td>"+rs.getString(3)+"</td><td>"+rs.getString(4)+"</td><td>"+rs.getString(5)+"</td><td><a href=\"reservation_adm.jsp?type_produit="+rs.getString(4)+"&libelle="+rs.getString(6)+"\">réservation</a> ou <a href=\"suppr_adm.jsp\">suppression</a></td></tr>" ; 
         i++; 
      }

Le paramètre n'était pas renseigné au final, il y avait trop de "
Nikko

Merci, la valeur affichée dans la liste est "null". Désormais, ca marche ! :D

Merci beaucoup !

Nikko

Je rencontre encore un problème avec cette ****** liste. Je mets mon code pour mieux expliquer ensuite.

<p align="center"> <font face="Broadway" size ="3"><select name="codetype"> 
<%String type = request.getParameter("type_produit");
String libelle = request.getParameter("libelle");%>
	<option value=<%=type%>><%=libelle %></option>
	<%Class.forName("com.mysql.jdbc.Driver");
	Connection con = DriverManager.getConnection("jdbc:mysql://localhost/projet", "root", "mysql");
	Statement st = con.createStatement();
	ResultSet rs = st.executeQuery("SELECT libelle, codetype FROM type;");
	rs.last();
	int nb=rs.getRow();
	rs.beforeFirst();
	int i = 1;
	String code = new String();
	String lib = new String();
	while(i<=nb){
		rs.absolute(i);
		if(rs.getString(2).equals(type))
			rs.next();
		else if(rs.getString(2).equals(type)==false){
			code = rs.getString(2);
			lib = rs.getString(1);
		}%>
	<option value=<%=code%>><%=lib %> 
	<%i++;
	}%>
  </option></select></font></p>

Je crée d'abord un premier choix en récupérant les paramètres qui sont passés dans l'URL. ensuite, je fais un requête SQL pour alimenter le reste de la liste. Et, pour éviter le doublon, j'ai mis ce if. Mais quand je déroule ma liste, j'obtiens quand même un doublon (le doublon n'est jamais celui que je récupère dans les paramètres de l'URL) alors que lorsque je test dans un main avec des syso(), il ne m'affiche pas ce doublon...

Décidément, cette liste m'est insuportable !

willbback

Bonjour,
Mais non, le problème est tout simple. Tu utilises 2 sorte de parcours des résultats de ta requête. Du coup, tu as généré des incohérences involontaires.
Je m'explique :

    Soit tu utilise "rs.absolute(i); " pour accéder à un enregistrement précit avec une variation de i, c'est ce que tu a fait. Soit tu utilise "rs.next();" ce que tu as fait également.
"rs.next()" fait avancé le curseur d'un enregistrement, malheureusement, tu rappel l'enregistrement avec la position absolue. Voilà pourquoi tu as des doublons.
Enlève ce "rs.next()", je pense que ça iras beaucoup mieux....
Voilà le code corrigé :
<p align="center"> <font face="Broadway" size ="3"><select name="codetype"> 
<%String type = request.getParameter("type_produit"); 
String libelle = request.getParameter("libelle");%> 
   <option value=<%=type%>><%=libelle %></option> 
   <%Class.forName("com.mysql.jdbc.Driver"); 
   Connection con = DriverManager.getConnection("jdbc:mysql://localhost/projet", "root", "mysql"); 
   Statement st = con.createStatement(); 
   ResultSet rs = st.executeQuery("SELECT libelle, codetype FROM type;"); 
   rs.last(); 
   int nb=rs.getRow(); 
   rs.beforeFirst(); 
   int i = 1; 
   String code = new String(); 
   String lib = new String(); 
   while(i<=nb){ 
      rs.absolute(i); 
      if(rs.getString(2).equals(type)==false){ 
         code = rs.getString(2); 
         lib = rs.getString(1); 
      }%> 
   <option value=<%=code%>><%=lib %> 
   <%i++; 
   }%> 
  </option></select></font></p>
willbback

Juste pour info, une écriture de ton code un peu plus belle, à mon avis. Ce qui n'engage que moi bien sûs :

<p align="center"> <font face="Broadway" size ="3"><select name="codetype"> 
<%String type = request.getParameter("type_produit"); 
String libelle = request.getParameter("libelle");%> 
   <option value=<%=type%>><%=libelle %></option> 
   <%Class.forName("com.mysql.jdbc.Driver"); 
   Connection con = DriverManager.getConnection("jdbc:mysql://localhost/projet", "root", "mysql"); 
   Statement st = con.createStatement(); 
   ResultSet rs = st.executeQuery("SELECT libelle, codetype FROM type where codetype <> '"+ type +"';"); 
   String code = new String(); 
   String lib = new String(); 
   while(rs.next() != null ){ 
%>
   <option value=<%=rs.getString(2)%>><%=rs.getString(1) %> 
   <%   }%> 
  </option></select></font></p> 

Mais surtout, si on utilise toutes les possibilitées du HTML... on en vient avec le code suivant :
<p align="center"> <font face="Broadway" size ="3"><select name="codetype"> 
<%String type = request.getParameter("type_produit"); 
   <%Class.forName("com.mysql.jdbc.Driver"); 
   Connection con = DriverManager.getConnection("jdbc:mysql://localhost/projet", "root", "mysql"); 
   Statement st = con.createStatement(); 
   ResultSet rs = st.executeQuery("SELECT libelle, codetype FROM type;"); 
   String check; 
   while(rs.next() != null ){ 
    if (type.equal(rs.getString(2))) {
        check="selected";
    } else {
        check="";
    }
%>
   <option value=<%=rs.getString(2)%> <%=check%>><%=rs.getString(1) %> 
   <%   }%> 
  </option></select></font></p> 

Tu ne passe plus qu'un seul paramètre, celui du code du produit choisit.
Le fait de mettre "selected" sur un élèment de la liste positionne directement la liste sur cette valeur.
De plus, il serait bon de mettre les paramètres connexions à ta base en constante dans ton application ou mieux dans un fichier de configuration. En effet, si ton serveur change, tu devras changer toutes tes pages, ce qui est :
    fastidieux source de bug (un oubli est toujours possible)
    dangereux (si le serveur ne compile pas ta page pour une raison ou une autre, tu communique l'information à l'utilisateur de la page, sur les forums etc...)
Je ne rentres pas dans le problème et toutes les discussions sur les requêtes dans les JSP, mais ça c'est vraiment important à s'en soucier. En effet, normalement une application change de base selon son sycle de développement (base de développement, base de validation, base de production). C'est une problèmatique très classique en informatique.