[Java struts] Problème requete de type GET

bonsoir,

j ai un gros soucis. J’ai le lien:


<bean:define id="myBeanValue" name="myBean" property="myProperty" />
   <html:link href="panier.do?prop='1'" />

comment doit on gérer le fichier panier.do?

J ai ensuite creer un fichier gererpanier.java qui contient:


import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;


    /** Creates a new instance of GestionPanier */
    public class GestionPanier extends HttpServlet {
    
    public void doGet(HttpServletRequest req,HttpServletResponse res)throws ServletException, IOException {
        
    String prop = req.getParameter("prop");

    }
    
}

j ai par contre beaucoup de mal à unifier tout ca…
comment peut on faire?
j arrive pas a trouver des documentations correctes sur google

merci d’avance

personne?

Pas fait de struts 1, mais du 2.

Mais struts c’est du mapping path http -> classe Java (action struts).

Si tu expliquais mieux ton problème…

je m explique :

j ai un “tableau” avec des liens du genre <html?#58;link href=“panier.do?id=‘1’” /> avec le numéro id qui évolue avec la ligne

le principe est que je dois donc traiter ce paramètre id en question dans un code.
Ce code doit récupérer ce paramètre, et l’utiliser pour faire une requete dans une base de données et afficher le résultat

La un bouton doit s’afficher pour valider la commande (mais ca on verra plus tard).

Mon problème actuel est que:

  • le lien c est bon normalement
  • je n’arrive pas a comprendre ce qu on doit mettre dans le fichier .do, meme si j ai vu qu il avait des possibilité de renvoi de la requete .do vers un fichier.java en passant par le strut-config.xml
  • j ai préparé le code du document .java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;


   /** Creates a new instance of GestionPanier */
   public class GestionPanier extends HttpServlet {
   
   public void doGet(HttpServletRequest req,HttpServletResponse res)throws ServletException, IOException {
       
   String prop = req.getParameter("prop");

   }
   
}

ququel il faut que je rajoute le code correspondant la requete pour la base de données (mais ca je le connais donc ca ira normalement meme si je l ai pas testé, par contre le problème est comment recupérer la variable "id"!)

A priori dans Struts 2 (je sais pas pour le 1) : public String id; (ou private +get/setter)

c est dans le fichier .do? (dans mon cas panier.do)

le fichier panier.do n’a que cette implémentation?

Je comprend rien :slight_smile:

Normalement tu n’as pas de fichier “.do”. Juste un mapping de “gnagnagna/gnagna.do” vers une classe java (action). Mais ça c’est struts2…

si on considère le lien que j ai fait:
<html?#58;link href=“panier.do?prop=‘1’” />

il y a bien un fichier panier.do…donc quelque part il doit exister.
Par contre je ne sais pas si il existe en tant que fichier ou juste en tant que ligne dans le struts-config.xml (ou ailleurs)

dans ton cas comment ca marche?

ca serait un truc de ce genre?:
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

Sans-Nom a raison : Avec Struts, ton unique Servlet est celle du contrôleur Struts

Ce que tu as a faire est de définir son comportement (Le mapping dont parle SN, généralement struts-config.xml, pour lequel tu vas faire correspondre url et classe de traitement -action-)

Il faut évidemment définir avant (web.xml) ce que prend en compte ta servlet struts (généralement .do)

Un conseil : Prend l’application Struts-blank et regarde comment c’est fait :wink:

c est quoi cette application struts-blank?

Un exemple de struts…

on peut la trouver ou? j arrive pas a la telecharger sur google

Je viens de tester -Pas tenté depuis longtemps-

http://struts.apache.org/download.cgi

struts-2.0.6-apps.zip (Si tu utilises Struts 2)
struts-1.3.8-apps.zip (Si tu utilises Struts 1)

J’ai téléchargé les 2, l’application Struts blank est présente des 2 côtés :wink:

merci effectivement j ai pu totu trouvé et récupéré.
Après analyse si j ai bien compris voici ce qu il faut en plus dans mon fichier struts-config.xml:


<!-- =========================================== Global Forward Definitions -->

    <global-forwards>
        <forward
            name="panier"
            path="/panier.do"/>
    </global-forwards>


<!-- =========================================== Action Mapping Definitions -->

    <action-mappings>
        <action
            path="/panier"
            forward="Gestionpanier.java"/>
   </action-mappings>

C est ca? Donc en gros si je demande panier.do, je suis redirigé vers gestionpanier.java


       <action
           path="/panier"
           type="monPackage.n2.n3.nX.GestionPanier.java">
               <forward name="redirection1" path="/jsp1.jsp" />
               <forward name="redirection2" path="/jsp2.jsp" />
      </action>

Il y a un truc que je comprends pas la…

on fait une action ok
on dit que le fichier il s appelle panier.do d’ou le path panier ok
type= GestionPanier.java -> en gros on utilise ce fichier pour dans mon cas la requete
-> et après avoir utilisé GestionPanier.java,on est renvoyé sur la page panier.jsp avec l’affichage du résultat de la requete

Es ce que j ai compris correctement?

Ce n’est pas un fichier, il s’agit d’un niveau d’indirection, ie tu peux mettre ce que tu veux derrière panier.do. Si demain tu remplaces GestionPanier.java par GestionPanierFinal.java, tu n’as à changer que le fichier struts-config.xml… Du point de vue client, pas de changement :wink:

Pour le forward, c’est toi qui décide où aboutit ton action : Tu peux exploiter le formward ou ne rien forwarder du tout… Dans ton action, tu peux récupérer le flux de sortie et regénérer toi-même ta sortie à la volée (Ex : produire à la volée un fichier excel, pdf, xml, …)

mais GestionPanier.java est malgré tout un fichier avec du code java dedans non?
et dedans on lui dit que ce que le code doit faire après panier.do?

Logiquement c est bien ca, on peut peut donc afficher le contenu du résultat fait par GestionPanier.java et l’envoyer via redirection dans un fichier .jsp que je veux?

Dans ce cas la, la redirection d’un résultat de requete se fait automatiquement?

en fait dans le GestionPanier.java il y aura 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 javax.servlet.*;
import javax.servlet.http.*;


    /** Creates a new instance of GestionPanier */
    public class GestionPanier extends HttpServlet {
    
    public void doGet(HttpServletRequest req,HttpServletResponse res)throws ServletException, IOException {
        
    String identifiant = req.getParameter("ID");
    String marque = null,modele = null,couleur = null;
    int prix;

    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+"";
    ResultSet resultat = statement.executeQuery(sql);
    while(resultat.next())
        {
        int id = resultat.getInt(1);
        String nom = resultat.getString(2);
        prix = resultat.getInt(3);
        java.sql.Date date = resultat.getDate(4);
        int row = resultat.getRow();
        System.out.println("Données contenues dans la ligne "+row);
        System.out.println("id : "+id+" marque : "+marque+" prix : "+prix+" modele : "+modele+" couleur : "+couleur);
        }
    }
    
}

J’ai d’ailleurs des gros a partir de " Class.forName(“org.apache.derby.jdbc.ClientDriver”);" ou il me dit qu il y a plein d exception qu il manque…mais si je les mets cest encore pire.

Je parlais du .do

toto.do peut aussi renvoyer sur la même classe…

Tu ne veux vraiment pas faire une Action? Tu n’as pas regardé l’exemple???
Edité le 02/06/2007 à 12:52

j essaye de comprendre comment struts fonctionne sur qqch de basique (on peut pas dire que les liens soient évolués quand meme :wink: )

mais c est sur que j ai un peu de mal a comprendre qu es ce que le code fait réelement, ou il est exécuté.

Dans tous les cas j ai bien compris qu il fallait un action dans struts-config.xml.

mais le role de chacun des fichiers indiqués dans l’action m’échappe encore un peu