[Java struts] Problème requete de type GET

la requete me renvoi une erreur me disant que vu que le champ de la BDD est en INTEGER, il ne lui faut pas du CHAR…comme c est le cas puisque getparameter utilise du STRING et chose que je comprends pas, meme avec integer.parseint dans la requete voit toujours du CHAR…

Bonjour,
je ne connait pas bien Struts alors je ne voudrais pas dire de bêtise, mais Integer.parseint() renvoie bien un int, et lève une exception s’il ne peut pas, le porblème si situe sûrement au niveau de ta requête, il faut des quotes ’ si c’est du String ou date et rien si c’est un int
par exemple ici:

tu concatène tout en String, peut importe le type de la variable dans ce cas, mais il vaudrait mieux gérer des “couches” applicative pour extraire l’appel de la requête dans une méthode avec des arguement typées, et compiler la requête avec des ? comme argument:
prepareStatement
puis remplir les argument avec des PreparedStatement.setInt etc.
puis exécuter le statement par Statement.execute();
Edité le 11/06/2007 à 11:45

exact c’était juste ca le problème!

totu fonctionne paraitement bien maintenant!!

merci bien!

rebonjour,

j ai un dernier problème. J ai ajouté une validation de la commande après afficga du panier, j ai donc un bouton submit.

Toute la gestion fonctionne tres tres bien

j ai juste un petit soucis justement au niveau de ce submit. En effet je gère un bean hidden auquel je lui attribue un ID en fonction des résultat de la requete. (Si c est l article 1, ID=1, article 2 ID=2,…)

j ai fait ca:
<html:hidden property=“ID” value=’<bean:write name=“clients” property=“ID”/>’/>

ce code ne marche pas malheureusement. Mais le tout se compléter de façon dynamique le contenu de ce champ et lui donner systèmatiquement le contenu de <bean:write name=“clients” property=“ID”/>

comment peut on faire?

merci

Il me semble que Struts n’interprète pas sur plusieurs niveaux

Solution méga basique
<Input type=“hidden” value="<bean:write name=“clients” property=“ID”/>" />

Sinon pourquoi ID et pas id?
Edité le 11/06/2007 à 21:50

bon je retire ce que j ai dis j ai bel et bien un soucis:

voici le formulaire de base:


            <html:form action="ValiderCommande">
            <Input type="text" property="ident" value="<bean:write name="clients" property="ID"/>" />
            <html:submit>Valider la commande</html:submit>
            <html:errors />
            </html:form> 

le struts-config:


   <form-beans>
        <form-bean name="ValiderCommande" type="ValiderCommande"/>
    </form-beans>

        <action input="/AfficherPanier.jsp" name="ValiderCommande" path="/ValiderCommande" scope="session" type="ValiderCommandeAction">
            <forward name="sucess" path="/CommandeFinale.jsp"/>
        </action>

puis ValiderCommande.java


/*
 * RechercheVehiculeParMarque.java
 *
 * Created on 18 avril 2007, 18:11
 */

import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionForm;

/**
 *
 * @author Florent
 * @version
 */

public class ValiderCommande extends ActionForm {

    private int ID;
    private int PRIX;
    private String MARQUE;
    private String MODELE;
    private String COULEUR;
    private int ident;
  


  /** Creates a new instance of colonne */
    public ValiderCommande(int ID,String MARQUE, String MODELE, int PRIX, String COULEUR) {
        this.MARQUE = MARQUE;
        this.MODELE = MODELE;
        this.PRIX = PRIX;
        this.COULEUR = COULEUR;
        this.ID=ID;
    }
    


  public int getIdent(){
    return ident;
  }
  
   public void setIdent(int ident){
    ident=ident;
  }
    /**
     * @return
     */


   public int getID(){
    return this.ID;
  }
  
   public void setID(int ID){
    this.ID=ID;
  }
    
    public int getPRIX() {
        return PRIX;
    }
    
    /**
     * @param i
     */
    public void setPRIX(int PRIX) {
        PRIX = PRIX;
    }
    /**
     * @return
     */
    public String getMARQUE() {
        return MARQUE;
    }
    
    /**
     * @param string
     */
    public void setMARQUE(String MARQUE) {
        this.MARQUE = MARQUE;
    }

    /**
     * @return
     */
    public String getMODELE() {
        return MODELE;
    }
    
    /**
     * @param string
     */
    public void setMODELE(String MODELE) {
        this.MODELE = MODELE;
    }

    /**
     * @return
     */
    public String getCOULEUR() {
        return COULEUR;
    }
    
    /**
     * @param string
     */
    public void setCOULEUR(String COULEUR) {
        this.COULEUR = COULEUR;
    }
    
    
    /**
     *
     */
    public ValiderCommande() {
        super();
        // TODO Auto-generated constructor stub
    }
    
    public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
        ActionErrors errors = new ActionErrors();
        return errors;
    }
}

puis ValiderCommandeAction.java:


/*
 * RechercheVehiculeParMarqueAction.java
 *
 * Created on 18 avril 2007, 19:01
 */

import java.sql.*;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.*;
import java.util.ArrayList;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.DriverManager;


/**
 *
 * @author Florent
 * @version
 */

public class ValiderCommandeAction extends Action {
    
    /* forward name="success" path="" */
    private final static String SUCCESS = "sucess";
    public ArrayList liste = new ArrayList();
    
    /**
     * This is the action called from the Struts framework.
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @throws java.lang.Exception
     * @return
     */
 // permet de réenvoyer le contenu du résultat a la page résultat
    public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception 
            {
            HttpSession session = request.getSession();
            ValiderCommande Form = (ValiderCommande)form;
            int ident = Form.getIdent();
            ValiderCommande(ident);
            if(liste != null)
                {
                session.setAttribute("resultatrecherche" , liste);
                }
            return mapping.findForward(SUCCESS);
            }
   
 
 private ArrayList ValiderCommande(int ident) throws ClassNotFoundException, SQLException
         {
         ResultSet resultat = null;
         Class.forName("org.apache.derby.jdbc.ClientDriver");
         Connection conn =DriverManager.getConnection("jdbc:derby://localhost:1527/Application", "nfe114", "nfe114");
         Statement statement = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
         String sql = "select * FROM \"NFE114\".\"VEHICULE\" WHERE ID="+ident+"";
         resultat = statement.executeQuery(sql);
         while(resultat.next())
             {
             liste.add(new ValiderCommande(resultat.getInt(1), resultat.getString(2), resultat.getString(3), resultat.getInt(4), resultat.getString(5)));
             }
           return liste;
           }
 }

et enfin le resultat:


<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%--
The taglib directive below imports the JSTL library. If you uncomment it,
you must also add the JSTL library to the project. The Add Library... action
on Libraries node in Projects view can be used to add the JSTL 1.1 library.
--%>
<%--
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 

--%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Commande Validée</title>
    </head>
    
    <body>
         Merci pour votre commande:<br><br>
        <logic:notPresent name="resultatrecherche">Aucun résultat retourné</logic:notPresent>
        Récapitulatif:
        <logic:present name="resultatrecherche">
            <table border="1">
                <thead>
                    <tr>
                        <th><bean:message key="ID.marque" /></th>
                        <th><bean:message key="ID.prix" /></th>
                        <th><bean:message key="ID.modele" /></th>
                    </tr>
                </thead>
                <tbody>
                    <logic:iterate id="clients" name="resultatrecherche">
                        <tr>
                            <td><bean:write name="clients" property="MARQUE"/></td>
                            <td><bean:write name="clients" property="PRIX"/></td>
                            <td><bean:write name="clients" property="MODELE"/></td>
                        </tr>
                    </logic:iterate>
                </tbody>
            </table>
        </logic:present>
       
      Prix total: <bean:write name="clients" property="PRIX"/> €TTC. 

    </body>
</html>

le problème que j ai est au niveau de la récupération de la variable issu du formulaire text du début.
En cette valeur est correcte au debut, mais a la fin la requete fait sa demande comme si cette valeur était a 0!!! (alors qu elle est bien vue a 1 par exemple.

Qu en pensez vous?

Pour te repondre a ta question myself : il s’agit pour moi d’un “code” pour repérer les variable issu de la bdd et celle qui ne le sont pas. C’est pour cela par exemple que ident (la variable qui pose problème dans mon code) n est pas en majuscule :slight_smile:
Cette règle n’est pas forcément vraie partout…je dois justement revoir le code pour le mettre mieux d aplomb

Ca ne pourrait pas venir de là?


public void setIdent(int ident){
 ident=ident;
 }

Edité le 12/06/2007 à 08:51

qu a t il de particulier?

c’est que ce setter ne fait rien comme beaucoup de tes setter: il faut préciser this.ident=ident.

C’est pour ça que je trouve ambigu de noter ses paramètres du même nom que les attributs, une des solution consiste à les préfixer par p: pIdent, pPrix etc. :wink:
autre remarque: les majuscules sont à proscrires pour des variables, on ne les utilise que pour des constantes niveau lisibilité. (habitude héritée du C)
:slight_smile:
Edité le 12/06/2007 à 09:54

j avais déja essayé avec this.ident=ident mais ca ne change rien du tout…

sinon pour le reste…j ai encore des habitudes a prendre :wink:

Bon… Qu’entends-tu par ‘cette valeur est correcte au debut’, et à partir d’où ne l’est-elle plus?

Tu as joué avec le debugger?

en fait quand je fais afficher le champs input je la vois bien correctement…

non pas utilisé le debugger (et je sais pas l’utiliser je t avouerais)

vous allez rire en fait j ai l impression que struts ne gère pas de façon identique les champs html:text et input, je m explique:

Je ne comprenais pas pourquoi j avais ce problème alors qu’avant ca marchait bien avec un autre code sur lequel je m étais largement inspiré.

Jai donc essayé avec
<html:text property=“ident” value=“0”></html:text> (avec value soit 0 ou à 1) et la TOUT MARCHE!!! je recupère bien dans la BDD la bonne ligne correctement

Donc la gestion que j ai faite pour <Input type=“text” property=“ident” value="<bean:write name=“clients” property=“ID”/>" /> n’est donc pas adaptée avec un input mais avec un html:text

Es t il possible d’intégrer le html:text avec le bean:write ? (apparement non)
Qu elle est la gestion des champs input avec struts?

merci

Non, effectivement, il ne gère pas de la même façon…

A quoi correspond l’attribut property de ton input?

heu…a rien?

en fait j ai voulu me baser quand j ai vu que ca marchait pas sur le meme principe que les html:text et c est la ou j ai rajouté le property…j ai pensé que c’était le “nom” du champs

Le html:text est réinterprété, mais pas le input… Regarde le html généré en sortie pour le html:text, cela devrait t’aider :wink:

ah la truc!!!
j’étais vraiment proche de la vérité effectivement :wink:

Pour résoudre mon problème j ai totu simplement remplacer le property par …name dans le input et ca marche NICKEL!!!

et la tout fonctionne parfaitement bien!!

merci bien :slight_smile: