IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Servlets/JSP Java Discussion :

Conseils pour optimiser un formulaire : usebean ou non ?


Sujet :

Servlets/JSP Java

  1. #1
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 199
    Points : 58
    Points
    58
    Par défaut Conseils pour optimiser un formulaire : usebean ou non ?
    Bonjour,

    J'ai fait un formulaire d'ajout de clients à une base de données. Il fonctionne très bien, mais je me demande s'il n'y a pas moyen d'optimiser encore le code. Il y a environ 15 champs à renseigner.

    Voici l'enchaînement nominal :

    1 formuClient.jsp.
    L'utilisateur renseigne le formulaire. La validation utilise la méthode POST.

    2 On est alors dirigé vers la servlet VerifClient.java, qui, avec le doPost, récupère tous les paramètres par un request.getParameter.
    Si l'utilisateur n'est pas dans la BD, on fait un forward vers ConfirmeClient.jsp.

    3 Dans ConfirmeClient.jsp on récupère à nouveau tous les paramètres, avec des getParameter. On affiche donc un récapitulatif des infos en demandant à l'utilisateur de confirmer ("Confirmez-vous la création de ce client ?"). Lors du clic sur "Oui", un POST est effectué, vers la servlet AjoutClient.java. Comme il faut lui envoyer les infos à insérer dans la BD, j'ai mis des <input type="hidden"> avec toutes les infos à envoyer. Sur ce point j'ai un doute : ai-je bien fait ?


    4 AjoutClient.java récupère, dans le doPost, tous les paramètres (avec des request.getParameter) puis les ajoute à la BD.

    Voilà, actuellement, tout ceci fonctionne. Mais je me demandais si rajouter des usebean amélioreraient mon code ? Les beans seraient détruits après l'ajout. Seulement, je ne sais pas du tout dans quelles pages les placer.

    Merci de vos conseils.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 152
    Points : 209
    Points
    209
    Par défaut
    Salut,

    Quelques bonnes pratiques:
    - Crée un "bean formulaire" avec toutes les entrées des champs de ton formulaire, avec un scope session, ca t'éviteras d'avoir à récupérer à chaque fois les champs pour les forwarder. Et ca t'enlève un champ hidden inutile, ainsi qu'un simulacre de formulaire, puisque je suppose que tu affiches le détail en dur (non éditable).
    - (Optionnel) Une pratique souvent utiliser, parce que moins lourde, c'est de faire une vérification en javascript (et ajax pour vérifier qu'un utilisateur n'est pas inscrit) des champs.
    - Le mieux c'est d'avoir une seule servlet controlleur qui te redirige vers une page jsp ou une autre servlet au besoin. (Principe de base du MVC)
    En pratique ca te donne quelque chose comme ca (ton welcomefile étant la servlet controlleur)
    Tu arrives sur le site
    ¤ Ton bean "utilisateur" est null (n'existe pas), la servlet te redirige vers la page du formulaire
    ¤ Tu valides ton formulaire, la servlet controlleur va appeller une méthode du style isValidate() qui se trouve dans le bean (ce n'est pas terrible mais pour commencer un control dans le bean c'est un bon début). Si elle te renvoie "true", tu vas à la page ConfirmeClient.jsp, sinon tu réaffiches la page du formulaire avec les erreurs. Il te faut donc créer une Map avec les erreurs dans ton bean.
    ¤ Tu confirmes, la servlet controleur appelle la servlet AjoutClient
    Si tu annules, la servlet controlleur te renvoie sur le formulaire.

    Voila et grâce au couple bean/el (ou expressions) tu remplis automatiquement tous tes champs. Le seule problème avec les expressions, qui ne se pose pas avec l'el, c'est la gestion des "null".
    A noter que tu ne dois pas mettre de usebean partout, uniquement sur ta page de formulaire, puisque une fois valider ton bean (remplit) sera dans la session.

    Enfin on commence à arriver à un stade où un framework ne serait pas de trop

  3. #3
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par @Ikey Voir le message
    Enfin on commence à arriver à un stade où un framework ne serait pas de trop
    Faut peut-être pas pousser, pour si peu ça ne se justifie pas vu le temps d'apprentissage

    Maintenant sur le fond, un bean en session couplé au usebean serait bien effectivement.
    N'oublie pas de supprimer le bean (de la session) une fois l'opération terminée, il ne faut pas non plus utiliser la session comme une poubelle qu'on ne viderait qu'une fois pas semaine

    A+

  4. #4
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 199
    Points : 58
    Points
    58
    Par défaut
    Merci pour vos réponses. Je vais donc essayer de mettre en oeuvre cette solution. Donc en gros, l'avantage du bean serait d'éviter à faire passer tous les paramètres d'une page à une autre. Faudra juste que je supprime le bean au bon endroit.

    Pour le framework, on me l'a souvent suggéré et je regrette de ne pas avoir commencé par ça. En fait, mon projet est déjà assez entamé, et le formulaire d'ajout n'est qu'une partie de celui-ci. J'appliquerai le principe de fonctionnement de formuClient aux autres modules du projet.

    Pour mon prochain projet, je passerai par un framework.
    Encore merci à vous deux et bonne journée.

  5. #5
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 199
    Points : 58
    Points
    58
    Par défaut
    Je uppe ce topic car j'ai un p'tit soucis : j'ai une Exception qui est générée, je n'arrive pas à identifier le problème.

    Voici le code source, raccourci au maximum :


    Dans ConfirmeClient.jsp, j'ai le bout de code suivant :

    Code JSP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <jsp:useBean id="ClientAjout" class="Client.Client" scope="session" />
     
                    <jsp:setProperty name="ClientAjout" property='Nom' value='valeurTest' />


    J'ai bien mon bean Client, défini dans le package Client. Nom est un attribut de Client.

    Lorsque je veux accéder à la propriété de ce bean dans une servlet, je fais le bout de code suivant :

    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
             out.println("D'abord, on voit si tout est là : <br />");
             out.println("RESULTAT ==> " + session.getAttribute("ClientAjout"));

    Le message d'erreur suivant apparait :
    Impossible de trouver de l'information sur la propriété 'Nom' dans le bean de type 'Client.Client'

    Merci de votre aide.

  6. #6
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    3 choses :

    - les noms de package sont en minuscules par convention, ça serait bien de le faire également...
    - la référence doit être un nom complet (package + nom)
    - peux-tu montrer le code du bean ?

    Il faut savoir que le bean doit avoir un constructeur vide et des getter/setter normalisés...

    A+

  7. #7
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 199
    Points : 58
    Points
    58
    Par défaut
    Oups, désolé OButterin, j'ai édité mon message pendant que tu me répondais. Le message d'erreur a disparu, en laissant la place à un autre message.
    J'ai supprimé le import, et j'ai fait appel à la classe en faisant : Client.Client. :p
    Je vais donc mettre les packages en minuscule maintenant.

    Voici néanmoins mon bean sans les getters, setters, et toString :

    Code Java : 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
     
    package Client;
     
     
    public class Client {
     
        private int Id_client;
        private String Civilite;
        private String Nom;
        private String Prenom;
        private String Profession;
        private String Date_naissance;
        private String Pays_naissance;
        private String Lieu_naissance;
        private int Adresse_num;
        private String Adresse_type;
        private String Adresse_nom;
        private int Code_postal;
        private String Commune;
        private String Pays;
        private String Date_inscription;
        private String Mail;
        private long Telephone;
        private double Solde;
     
        public Client(int Id_c, String Civ, String Nom, String Pre, String Pro, String Dat, String Pay_n, String Lie, int Adr, String Adr_t, String Adr_n, int Cod, String Com, String Pay, String Dat_i, String Mai, long Tel, double Sol) {
            this.Id_client = Id_c;
            this.Civilite = Civ;
            this.Nom = Nom;
            this.Prenom = Pre;
            this.Profession = Pro;
            this.Date_naissance = Dat;
            this.Pays_naissance = Pay_n;
            this.Lieu_naissance = Lie;
            this.Adresse_num = Adr;
            this.Adresse_type = Adr_t;
            this.Adresse_nom = Adr_n;
            this.Code_postal = Cod;
            this.Commune = Com;
            this.Pays = Pay;
            this.Date_inscription = Dat_i;
            this.Mail = Mai;
            this.Telephone = Tel;
            this.Solde = Sol;
        }
    }

  8. #8
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 199
    Points : 58
    Points
    58
    Par défaut
    Problème résolu grâce à toi, OButterlin : j'ai rajouté un constructeur vide, et supprimé le setProperty. Maintenant tout est nickel.
    Merci beaucoup. @+.

  9. #9
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Ton problème pourrait bien venir du fait que tu ne respectes pas (décidément ) les conventions !

    Alors, il faudrait que les noms de propriété commencent par une minuscule, donc, dans ton cas, ce serait quelque chose comme ceci :
    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
     
    package client;
     
    public class Client
    {
       private int id_Client;
       private String nom;
       private ...
     
       public Client()
       {
          super();
       }
     
       public Client(int id_Client, String nom, ... )
       {
          super();
          this.id_Client = id_Client;
          ...
       }
     
       public String getIdClient()
       {
          return this.id_Client;
       }
       public void setIdClient(int id_Client)
       {
          this.id_Client = id_Client;
       }
     
       public String getNom()
       {
          return this.nom;
       }
       public void setNom(String nom)
       {
          this.nom = nom;
       }
    ...
    Bonne adaptation

    A+

  10. #10
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 199
    Points : 58
    Points
    58
    Par défaut
    Arf, décidément.

    Je ne savais pas qu'il valait mieux que les attributs commencent par une minuscule. Je corrige ça. Merci pour le conseil.

    Sinon, le code marche avec les usebean, pour l'instant. Et ça a beaucoup allégé le code, en enlevant les innombrables request.getParameter().

  11. #11
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 199
    Points : 58
    Points
    58
    Par défaut
    J'aurais une dernière petite question, si possible.

    Actuellement, je remplis les champs du formulaire. Lors de la validation, je fais un POST vers une servlet.
    Cette servlet récupère les champs avec des request.getParameter, et ces paramètres sont ainsi placées dans le Bean.
    N'y a-t-il pas moyen que lors de la validation du formulaire, tout ce qui est saisi dans les champs viennent se mettre automatiquement dans le useBean ?
    Ca me permettrait de ne plus avoir aucun request.getParameter.

    Merci.

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 152
    Points : 209
    Points
    209
    Par défaut
    Citation Envoyé par Monkey_D.Luffy Voir le message
    J'aurais une dernière petite question, si possible.

    Actuellement, je remplis les champs du formulaire. Lors de la validation, je fais un POST vers une servlet.
    Cette servlet récupère les champs avec des request.getParameter, et ces paramètres sont ainsi placées dans le Bean.
    N'y a-t-il pas moyen que lors de la validation du formulaire, tout ce qui est saisi dans les champs viennent se mettre automatiquement dans le useBean ?
    Ca me permettrait de ne plus avoir aucun request.getParameter.

    Merci.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <jsp:setProperty name="ClientAjout" property="*" />
    C'est aussi compliqué que ca!

    Concernant le framework j'imaginais bien que ton projet était plus gros.
    Si tu veux utiliser uniquement des pages jsp et des servlets, il faut utiliser tout ce qu'on t'offre: JavaBean, el et tags. L'objectif étant que tes pages jsp soient "scritpless"

  13. #13
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 199
    Points : 58
    Points
    58
    Par défaut
    Merci pour ces indications.
    Pour le property='*', c'est bien ce que j'ai fait, mais ça ne fonctionne pas.
    Est-ce parce que le bean Client.java doit avoir exactement les mêmes attributs que les champs du formulaire ?

    Mes pages Jsp contiennent de moins en moins de code, et c'est vrai que c'est plus aéré, plus clair.

  14. #14
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 199
    Points : 58
    Points
    58
    Par défaut
    J'ai essayé sur un court exemple, et le property='*' ne semble pas initialiser le bean avec les champs du formulaire.

    Voici ma JSP :

    Code JSP : 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
    <%@page contentType="text/html" pageEncoding="ISO-8859-1"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
       "http://www.w3.org/TR/html4/loose.dtd">
       <jsp:useBean class="client.CC" id="test" scope="session" />
       <jsp:setProperty name="test" property='*' />
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <title>JSP Page</title>
        </head>
        <body>
            <h2>Hello World!</h2>
            <form name="formulaire" action="DoTest" method="POST">
                <input type="text" name="dd" value="ho" />
                <input type="submit" name="valide" value="VALIDER" />
            </form>
        </body>
    </html>


    Voici ma servlet :

    Code JAVA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter out = response.getWriter();
            try {
             response.setContentType("text/html");
             HttpSession session = request.getSession(true);
             out.println("Le dd : " + session.getAttribute("test"));
            } finally { 
                out.close();
            }
        }

    Voici mon Bean :

    Code JAVA : 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 CC {
        private String dd;
     
        public CC() {
            super();
     
        }
     
        public CC(String dd) {
            super();
            this.dd = dd;
        }
     
        public String getDd() {
            return dd;
        }
     
        public void setDd(String dd) {
            this.dd = dd;
        }
    }

    Même avec cela, je suis obligé de récupérer dans ma servlet les attributs du formulaire, et d'initialiser mon le Bean avec ces attributs.
    N'y a-t-il donc pas moyen que le Bean soit initialisé avec les champs du formulaire, directement ?

  15. #15
    Membre actif
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 152
    Points : 209
    Points
    209
    Par défaut
    Si mais le problème avec le setProperty, c'est que tu dois recharger la même page pour qu'il remplisse ton bean (j'avais oublié de le préciser ).

    Exemple
    index.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
    <%@page contentType="text/html" pageEncoding="UTF-8"%>
    <jsp:useBean class="User" id="user" scope="session" />
    <jsp:setProperty name="user" property="*" />
     
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <c:if test="${not empty param.submit}">
        <jsp:forward page="second.jsp" />
    </c:if>
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr">
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
            <meta http-equiv="content-language" content="fr" />
     
            <title lang="fr">Title Page</title>
        </head>
     
        <body>
            <h1>Hello World - JSP</h1>
            <form action="index.jsp" method="post">
                <p><input type="text" name="username" value="" />
                <input type="submit" name="submit" value="Submit" /></p>
            </form>
        </body>
    </html>
    second.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
    <%@page contentType="text/html" pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr">
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
            <meta http-equiv="content-language" content="fr" />
     
            <title lang="fr">Title Page</title>
        </head>
     
        <body>
            <h1>Hello World - JSP</h1>
            <p>${user.username}</p>
        </body>
    </html>
    JavaBean User
    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 User
    {
        private String username;
     
        public String getUsername()
        {
            return username;
        }
     
        public void setUsername(String username)
        {
            this.username = username;
        }
    }
    J'ai beau chercher, je n'arrive pas à quelque chose de plus jolie, techniquement parlant, sans avoir à se taper 15 getParameter()!

  16. #16
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 199
    Points : 58
    Points
    58
    Par défaut
    Ah merci. Je vais tester cette méthode demain matin.

    On m'a aussi parlé de la méthode populate, ça me fait une seconde alternative en espérant qu'elle marche aussi.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/05/2008, 08h13
  2. Quelques conseils pour optimiser ma base
    Par Kaimite dans le forum Débuter
    Réponses: 0
    Dernier message: 11/05/2008, 10h14
  3. Conseils pour optimiser une PS
    Par PickEpique dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 10/08/2007, 11h49
  4. Réponses: 2
    Dernier message: 17/08/2006, 11h49
  5. Réponses: 4
    Dernier message: 26/01/2006, 10h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo