[Java struts] Problème requete de type GET

Personnellement, j’ai cru comprendre que Struts 1 c’est puissant, mais trop complexe, au contraire de Webworks, qui était puissant mais simple. D’où struts 2 qui reprend Web Work en changeant le nom.

(bref, ensuite, je fais pas du Struts à la pelle, j’aime pas JSP et les taglibs certes puissantes, mais qui n’aident en rien à la relecture, etc).

Un exemple… Tu vas pouvoir me dire à quel niveau ça coince (N.B.: Je simplifie à l’extrème :wink: )

Requête Utilisateur (via browser) toto.do

Le serveur reçoit la requête (GET /toto.do HTTP/1.1 …)
C’est un .do, comme configuré au niveau de web.xml, le .do est associé au contrôleur Struts (l’unique servlet de Struts)
Le contrôleur Struts récupère la requête, cherche la ressource toto
toto a été associé a la classe traitementToto.java dans le fichier struts-config.xml
La classe TraitementToto.java (une Action au sens Struts) effectue différents traitements (ex : appel à une base de donnée -mal-)
A la fin de son action, il veut restituer une page à l’utilisateur, appelle une jsp (C’est encore un exemple)
Pour appeler la jsp, au niveau de Struts-config, on a défini différentes valeurs de forward (ex : succes -> totoSucces.jsp, echec -> totoEchec.jsp)
la dernière ligne de l’action est (peut être en fait) un findForward(“succes”)

L’utilisateur reçoit le contenu défini par le fichier totoSucces.jsp (même si lui a saisi toto.do)

okiiii!! ca y est je pense avoir tout compris :slight_smile:

alors en vertue de ce que tu m avais expliqué j ai continué mon bonhomme de chemin:

dans struts-config.xml j ai ajouté:


j ai corrigé (largement) mon fichier GestionPanier.java et a la fin j ai ceci:


/*
 * GestionPanier.java
 *
 * Created on 25 mai 2007, 21:13
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

/**
 *
 * @author Florent
 */

import java.io.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import javax.servlet.*;
import javax.servlet.http.*;


    /** Creates a new instance of GestionPanier */


public class GestionPanier extends HttpServlet {
  public ArrayList doGet(HttpServletRequest request, HttpServletRequest response)
                          throws ServletException, IOException, ClassNotFoundException, SQLException {

 String identifiant = request.getParameter("ID");
 String MARQUE = null,MODELE = null,COULEUR = null;
 int PRIX;
 ArrayList liste = new ArrayList();
 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='"+identifiant+"'";
 //System.out.println("select * FROM \"NFE114\".\"VEHICULE\" WHERE MARQUE='"+saisie+"'");
 resultat = statement.executeQuery(sql);
 while(resultat.next())
     {
     int ID = resultat.getInt(1);
     //String MARQUE = resultat.getString(2);
     PRIX = resultat.getInt(3);
     //java.sql.Date date = resultat.getDate(4);
     int row = resultat.getRow();
     //System.out.println(saisie);
     //System.out.println("Données contenues dans la ligne "+row);
     //System.out.println("id : "+ID+" marque : "+MARQUE+" prix : "+PRIX+" modele : "+MODELE+" couleur : "+COULEUR+" <html:link href=panier.do?id='"+ID+"'>Panier</>");
     //objet= "id : "+ID+" marque : "+MARQUE+" prix : "+PRIX+" modele : "+MODELE+" couleur : "+COULEUR+" <html:link href=panier.do?id='"+ID+"'>Panier</>";
     liste.add(new RechercheVehiculeParMarque(resultat.getInt(1), resultat.getString(2),resultat.getString(3),resultat.getInt(4),resultat.getString(5)));
     }
     return liste;
 }
    
}

et mon fichier affichage (affichagepanier.jsp):


<%@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>Résultat recherche</title>
    </head>
    
    <body>
         Résultat de la recherche:<br><br>
        <logic:notPresent name="resultatrecherche">Aucun résultat retourné</logic:notPresent>
        
        <logic:present name="resultatrecherche">
            <table border="1">
                <thead>
                    <tr>
                        <th><bean:message key="ID.id" /></th>
                        <th><bean:message key="ID.marque" /></th>
                    </tr>
                </thead>
                <tbody>
                    <logic:iterate id="clients" name="resultatrecherche">
                        <tr>
                            <td><bean:write name="clients" property="ID"/></td>
                            <td><bean:write name="clients" property="MARQUE"/></td>
                            <td><html:link action="fiche.do" paramId="id" paramName="clients" paramProperty="ID">Voir la fiche</html:link></td>
                            <td><html:link action="panier.do" paramId="id" paramName="clients" paramProperty="ID">Panier</html:link></td>
                        </tr>
                    </logic:iterate>
                </tbody>
            </table>
        </logic:present>
       
       
        
    </body>
</html>

Quand je clique sur le lien d’origine (<html:link action=“panier.do” paramId=“id” paramName=“clients” paramProperty=“ID”>Panier</html:link>) j ai l’erreur:

No action instance for path /panier could be created

qu en pensez vous?

merci

Ben oui… Dans ton exemple, je lis


public class GestionPanier extends HttpServlet {

Je n’ai pas dit quelque part que le contrôleur Struts est la seule servlet de Struts?

Essaie de repenser ton code sur le modèle que tu as fourni là : www.clubic.com…


public class GestionPanier extends Action {

Ca devrait un peu mieux marcher :wink:

mais…mon problème n’est pas uniquement lié à une erreur de mon lien .do?

No action instance for path /panier could be created ???

ca voudrait dire qu il faut sur le meme principe que je crée un public ActionForward execute?

mais dans ce cas ou est l’intéret du action présent dans le struts-config.xml?


a moins que ca voudrait dire que contrairement a ce qui a été fait on a dans l'ordre:
  • une page qui a le lien avec la paramètre que je veux
  • il est lu dans le struts-config et est orienté vers un (dans mon cas) GestionPanier.java
  • GestionPanier.java récupère les infos du paramètres passé dans l’URL et annaonce les variables dont j’aurais besoin (déclaration)
  • envoi ces infos vers GestionPanierAction.java avec son public ActionForward execute qui envoi tout vers la méthode qui gère et fait la requete sur la BDD et retourne les résultats (dans mon cas liste)
  • selon le struts-config.xml on envoi vers la page de résultat via le forward vers (dans mon cas) AffichagePanier.jsp

Ce raisonnement est exactement le meme que celui que j ai fait (a qq adaptation pres) pour un formulaire…
Pourtant je trouve ca particulièrement lourd si il faut refaire le meme système avec un lien de type GET…

Es ce que tous les fichiers que j ai indiqué sont nécessaires?
Je pense qu il est possible de plus ou moins fusionner GestionPanier.java et GestionPanierAction.java. Mais es ce possible (vu mon niveau surtout) et es ce que c est judicieux?

Es ce que le code que j ai mis plus haut est cohérent dans le fonctionnement global (meme si la construction est pas très bonne)?

Non… GestionPanier est inutile, c’est la servlet de Struts qui gère la récupération des infos de ton formulaire… Dans le Struts-config, tu peux déclarer une classe (simple javaBean avec Getters et Setters) qui correspond à ton formulaire, et qui sera automatiquement rempli. Le plus pratique est d’utiliser un dynaActionForm (Regarde sur internet)…

oui exact j ai vu passer dynaActionForm passer quand j’étudiais le ActionForm.

Mais dans mon cas si on considère donc que GestionPanier est inutile (donc reste que gestionPanierAction), il faut également lui mettre ActionForward execute qui appelle la méthode qui gère la BDD (donc sur le me mprincipe que sur mon autre topic)?

Et donc vu l’erreur ca pourrait donc venir de ce manque “d’action” qui entrainerait l’erreur “No action instance for path /panier could be created”?

(Pour l’instant j ai déja du mal a comprendre ce que je fais, je vais donc essayer de bien comprendre avant d’ajouter de nouvelle fonctionnalité et/ou optimiser le code avec des facilités)

Il te dit qu’il ne peut pas instancier d’Action avec GestionPanier… Parce que GestionPanier n’est pas une Action, non?

Donc c est bien ca:

  • il faut que je corrige comme tu m as dit en mettant extend ActionForm (ca c est fait)
  • que je crée une ActionForward execute dans GestionPanier avec ce que je veux faire dedans et un return sucess qui signalera la fin du code
  • que je récupère le résultat dans mon fichier résultat.

C’est correct?

Yep :wink:

Ton execute va reprendre le contenu de ton doGet, le return findForward(“success”) ira chercher la page associée dans struts-config

serais je enfin entrain de comprendre :wink:

mouai j ai encore des progrès a faire. Voici le code que je viens de faire:



import java.io.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;


public class GestionPanier extends Action {
    
    /* forward name="success" path="" */
    private final static String SUCCESS = "sucess";
    public ArrayList liste = new ArrayList();
    /** Creates a new instance of GestionPanier */
    public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception 
            {
            HttpSession session = request.getSession();
 
            String identifiant = request.getParameter("ID");
            Gestion(identifiant);
            if(liste != null)
                {
                session.setAttribute("resultatrecherche" , liste);
                }
            return mapping.findForward(SUCCESS);
            }

  //private ArrayList   throws ServletException, IOException, ClassNotFoundException, SQLException 
  private ArrayList Gestion(String identifiant) throws ClassNotFoundException, SQLException
    {
    String MARQUE = null,MODELE = null,COULEUR = null;
    int PRIX;
    
    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='"+identifiant+"'";
    //System.out.println("select * FROM \"NFE114\".\"VEHICULE\" WHERE MARQUE='"+saisie+"'");
    resultat = statement.executeQuery(sql);
    while(resultat.next())
        {
        int ID = resultat.getInt(1);
        //String MARQUE = resultat.getString(2);
        PRIX = resultat.getInt(3);
        //java.sql.Date date = resultat.getDate(4);
        int row = resultat.getRow();
        //System.out.println(saisie);
        //System.out.println("Données contenues dans la ligne "+row);
        //System.out.println("id : "+ID+" marque : "+MARQUE+" prix : "+PRIX+" modele : "+MODELE+" couleur : "+COULEUR+" <html:link href=panier.do?id='"+ID+"'>Panier</>");
        //objet= "id : "+ID+" marque : "+MARQUE+" prix : "+PRIX+" modele : "+MODELE+" couleur : "+COULEUR+" <html:link href=panier.do?id='"+ID+"'>Panier</>";
        liste.add(new RechercheVehiculeParMarque(resultat.getInt(1), resultat.getString(2),resultat.getString(3),resultat.getInt(4),resultat.getString(5)));
        }
     return liste;
    }
    
}

et j ai toujours la meme erreur : No action instance for path /panier could be created…

j ai fait les modfis mais j ai toujours le meme problème : No action instance for path /panier could be created


faut il créer un dossier panier dans le projet et y mettre GestionPanier.java?

je comprends pas cette erreur

pourtant je pense avoir totu crée comme il faut la!

oui il y est bien

mais je passe directement par netbeans pour lancer le projet, je crée par le fichier .war

Ce message n’était pas conforme aux règles d’utilisation du nouveau forum :

personne?

Tu as moyen de faire un export avec sources et le mettre en ligne?

c est bon tout marche. Dans le strut-config j avais mis gestionpanier.java…au lieu de gestionpanier

question subsidiaire:
dans mon getParameter, je recupère le paramètre ID envoyé par le lien GET panier.do?id=‘1’

le problème c est que getParamater est en String alors que je voudrais etre en int (a cause de la requète derriere)

au niveau de la javadoc j ai rien trouvé qui puisse récupérer les paramètres de type int.

La transformation d’un string en int avec integer.parseint ne fonctionne pas.

comment puis je faire?

Comment ça ‘Ne fonctionne pas’?