Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Struts 1 Java Discussion :

[struts] problème d'implémentation d'une classe form


Sujet :

Struts 1 Java

  1. #1
    Nouveau membre du Club
    [struts] problème d'implémentation d'une classe form
    Bonjour,

    Voici mon petit problème journalier de débutant.

    Dans l'exemple, on se logue aprés avoir donné un login et un pass bidon, et on arrive sur la page des articles

    Le problème est qu'il manque une classe form.

    J'ai essayé de la faire tout seul et devinez quoi...Et bien débutant comme je suis j'y arrive pas.

    Le problème est que dans sa classe form il utilise un objet qu'il a créé, et je ne sais pas trop comment implémenter les méthodes set et get qui vont avec.

    J'ai donc l'erreur suivant: Cannot find bean ChooseForm in any scope

    Voici les sources:

    les java bean qui servent de source de données


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    public class Article {          // Un bon vieux Java Bean bien classique
     
        private int m_IdArticle;
        private String m_Marque;
        private String m_Designation;
        private double m_Price;
     
        public int getIdArticle() { return this.m_IdArticle; }
        public void setIdArticle(int idArticle) throws Exception {
    	if (idArticle<0) throw new Exception("IdArticle must be positive");
    	this.m_IdArticle = idArticle;
        }
     
        public String getMarque() { return this.m_Marque; }
        public void setMarque(String marque) {
    	this.m_Marque = marque.toUpperCase();
        }
     
        public String getDesignation() { return this.m_Designation; }
        public void setDesignation(String designation) {
            this.m_Designation = designation.toLowerCase(); 
        }
     
        public double getPrice() { return this.m_Price; }
        public void setPrice(double price) throws Exception {
    	if (price<0) throw new Exception("Price must be positive");
    	this.m_Price = price;
        }
     
        public Article() throws Exception {
    	this(0, "Inconnue", "???", 1);
        }
     
        public Article(int id, String marque, String designation, double price)
    	    throws Exception {
    	this.setIdArticle(id);
    	this.setMarque(marque);
    	this.setDesignation(designation);
    	this.setPrice(price);
        }
     
        public String toString() {
           return this.m_IdArticle + ": article "
                + this.m_Designation + " de marque "
                + this.m_Marque + " et de prix "
                + this.m_Price + " Euros";
        }
    }


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    // Cette implémentation de catalogue d'articles est très simpliste,
    // je vous l'accorde. Mais le but consiste à vous montrer certains concepts
    // fondamentaux de Struts. Je ne préfère donc pas alourdir le reste du code !!!
     
    public class Catalog {
        public static Article [] m_Articles = new Article[4];
     
        static {
    	try {
    	    m_Articles[0] = new Article(0, "Byque", "Stylo bleu", 1);
    	    m_Articles[1] = new Article(1, "FoncéFontaine", "Ramette papier", 5);
    	    m_Articles[2] = new Article(2, "Harry beau", "bonbon", 0.2);
    	    m_Articles[3] = new Article(3, "Bidule", "Equerre", 3);
    	} catch(Exception e) {
                System.err.println("Ouille !");
            }
        }
     
    }

    ///////////////////// la class chooseAction /////////////////////

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    import javax.servlet.http.*;
    import org.apache.struts.action.*;
     
    public class ChooseAction extends Action {
     
        public ActionForward execute(
            ActionMapping mapping, ActionForm _form,
            HttpServletRequest request, HttpServletResponse response
        ) throws Exception {
            ChooseForm form = (ChooseForm) _form;
            form.setArticle( Catalog.m_Articles[form.getIdArticle()] );
            System.out.println( form.getArticle() );
            return mapping.findForward("Choose");
        }
     
    }

    ///////////////////// la class chooseform ///////////////////

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public class ChooseForm extends ActionForm
    {
    private Article m_article;
    private int idarticle =1;
     
    public Article getArticle() throws IOException
    {
    return this.m_article;
    }
     
    public void setArticle(Article article) throws IOException
    {
    this.m_article = article;
    }
     
    public int getIdArticle() throws IOException
    {
    return this.idarticle;
    }
     
    public void setIdArticle(int IdArticle) throws IOException
    {
    this.idarticle=IdArticle;
    }
    }

    //////////////////////// la class loginaction //////////////////

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class LoginAction extends Action {
     
        public ActionForward perform(
    	ActionMapping mapping, ActionForm _form,
    	HttpServletRequest request, HttpServletResponse response
        ) throws Exception {
            // On traite la requête cliente
    	LoginForm form = (LoginForm) _form;
    	System.out.println("Struts in action "
    	     + form.getUsername() + " - " + form.getPassword());
            // On redirige vers la vue adaptée
    	return mapping.findForward("Choose");
        }
    }

    ///////////////// la class loginform /////////////////////

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public class LoginForm extends ActionForm {
    	private String m_username = "root";
    	private String m_password = "azerty";
     
    	public String getUsername() {
    		System.out.println("On passe par UserBean.getUsername !");
    		return this.m_username;
    	}
    	public void setUsername(String username) {
    		System.out.println("On passe par UserBean.setUsername !");
    		this.m_username = username;
    	}
    	public String getPassword() {
    		System.out.println("On passe par UserBean.getPassword !");
    		return this.m_password;
    	}
    	public void setPassword(String password) {
    		System.out.println("On passe par UserBean.setPassword !");
    		this.m_password = password;
    	}
    }


    ///////////////// choose.jsp ////////////////////////////

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    <%@ page language="java" import="java.util.*"  %>
    <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
    <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
    <html>
        <head>
    	<title>Veuillez Choisir vos articles</title>
        </head>
        <body>
     
            <h1 align="center">Veuillez Choisir vos articles</H1>
     
    	<div align="center">
    	    Id de l'article :
    		<bean:write name="ChooseForm" property="idArticle" /> <BR/>
    	    Marque :
    		<bean:write name="ChooseForm" property="article.marque" /> <BR/>
    	    Designation :
    		<bean:write name="ChooseForm" property="article.designation"/> <BR/>
    	    Prix unitaire :
    		<bean:write name="ChooseForm" property="article.price" /> <BR />
     
    	    <%
    	        int idArticle = Integer.parseInt(request.getParameter("idArticle"));
    	    %> <BR />
    	    <a href="choose.do?idArticle=<%= idArticle - 1 %>">Précédant</a> - 
    	    <a href="choose.do?idArticle=<%= idArticle + 1 %>">Suivant</a>
    	</div>
        </body>
    </html>

    /////////////////////// struts-config.xml //////////////////////////

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts-config PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
        "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
    <struts-config>
    	<form-beans>
    		<form-bean name="LoginForm" type="LoginForm" />
    		<form-bean name="ChooseForm" type="ChooseForm" />
    	</form-beans>
     
    	<global-forwards>
    		<forward name="Connected" path="/Connected.jsp" />
    		<forward name="Choose" path="/ChooseArticle.jsp" />
    	</global-forwards>
     
    	<action-mappings>
    		<action	path="/login"
    			name="LoginForm"
    			type="LoginAction"
    			scope="request" />
     
    		<action path="/choose"
    			name="ChooseForm"
    			type="ChooseAction"
    			scope="request" />
    	</action-mappings>
    </struts-config>

  2. #2
    Membre à l'essai
    je pense qu'il faut que ta jsp contienne un formulaire si tu veux recuperer les donnees a partir d'un ActionForm de Struts.

    Dans le code de ta jsp tu lui dis d'aller chercher les donnes dans un bean ChooseForm mais tu lui indiques nulle part ou est ce bean...

  3. #3
    Nouveau membre du Club
    pourquoi définir un formulaire? Je ne veux rien saisir...quand je suis logué, j'ai le premier article présent dans mon tableau qui doit être présenté. Ensuite avec précédent et suivant je choisis l'article suivant ou précédent...je ne vois pas trés bien pourquoi créer un formulaire...

  4. #4
    Membre à l'essai
    en fait, l'erreur que tu as :
    Cannot find bean ChooseForm in any scope
    te dis qu'il ne trouve pas de bean correspondant a ce que tu veux afficher :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
     <bean:write name="ChooseForm" property="idArticle" />

    quand je te dis d'utiliser un formulaire, en effet ce n'est pas obligatoire du tout, par contre, il te faut remplir un objet de type ChooseForm avec les donnees que tu veux afficher, et ensuite passer ce bean a ta jsp, soit en session soit en request.

  5. #5
    Nouveau membre du Club
    Ce message n'a pas pu être affiché car il comporte des erreurs.

  6. #6
    Membre à l'essai
    en fait je ne vois pas bien l'enchainement de ton application.

    Dans ce que j'avais vu, l'action LoginAction renvoie sur ta jsp Choose.jsp
    A ce moment la tu n'as pas encore fait
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    form.setArticle( Catalog.m_Articles[form.getIdArticle()]

    ensuite, en effet il n'y a p e pas besoin de lui en dire plus, il doit pouvoir recuperer les donnees...

    Si tu appelles bien ton action avant la jsp, alors je ne sais pas....
    desole

  7. #7
    Nouveau membre du Club
    Alors je vais peut être dire quelque chose d'immonde pour les puristes de struts mais c'est pas grave je me lance

    en fait loginAction me renvoie ma jsp Choose.jsp mais sans passer par ChooseAction et par conséquent Choosefrom n'existe pas...est ce que c'est ça ou j'ai tout faux?

  8. #8
    Membre à l'essai
    voila, en effet, c'est un peu l'idee

    en gros, il faudrait qu'une fois identifie,ton action loginAction t'envoies sur ta ChooseAction afin d'initialiser ton bean pour pouvoir recuperer les donnees apres dans ta jsp.

  9. #9
    Nouveau membre du Club
    et bien sûr tu ne saurais pas comment réaliser ce miracle?

  10. #10
    Nouveau membre du Club
    bon alors j'ai réglé le problème provisoirement en mettant une page intermédiaire de confirmation de connexion...
    a+

  11. #11
    Membre expérimenté
    tu n'aurais pas besoin de faire tout ca si les noms de tes variables etaient standardisées ( norme JavaBeans), cad pas de truc du genre m_article mais article.

    D'ailleurs a quoi sert ce m_??? pour dire que c un membre? c tres bad practice ce genre de choses. des vieux trucs hérités de vieux codeurs C++....

    @+

  12. #12
    Membre à l'essai
    tu dois pouvoir faire ca simplement dans ton struts-config :

    qq chose de ce style la :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <action path="/login" name="LoginForm" type="LoginAction" scope="request">
          <forward name="choose" path="/choose.do"/> 
    </action>

  13. #13
    Nouveau membre du Club
    C'est bon ça marche merci

    a+

###raw>template_hook.ano_emploi###