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

Spring Java Discussion :

[APP J2EE] pourquoi intégrer spring à mon application.


Sujet :

Spring Java

  1. #1
    Membre habitué Avatar de nikalkal
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 231
    Points : 166
    Points
    166
    Par défaut [APP J2EE] pourquoi intégrer spring à mon application.
    Bonjour à tous,

    Ce post n'est pas un problème mais une discussion que j'aimerais avoir avec vous sur l'utilité de Spring.

    j'ai développé une petite application en étant demandeur d'emploi (a titre personel pour me former sur les technologies choisies) qui permet à des utilisateurs de résever à certains horaires des voitures si elles sont disponibles. (le sujet de base)

    Voici les outils que j'ai utilisé pour mettre en place une architecture à 3 niveaux :
    - Struts pour respect du modèle MVC
    - Hibernate pour la gestion relationel/objet
    - MySql pour la base de donnée

    Maintenant voilà le diagramme de classe que j'ai respecté dans mon code :


    Ces classes, je les ais codé purement en JAVA.
    J'ai utilisé struts pour mes formulaires JSP et les actions associées.
    J'ai utilisé hibernate dans mes actions pour updater la base de donnée.

    Jusqu'içi tout va bien

    Maintenant, je viens de trouver un emploi en tant que développeur J2EE et j'aimerais me former sur le framework Spring que je vais devoir implémenter.

    Je me suis donc dis : tiens-pourquoi pas l'implémenter dans mon projet pour le prendre en main...

    Et j'en viens donc à ma question : à quoi me servirai l'implémentation de Spring dans mon appli? Qu'est-ce que cela m'aporterai de plus?

    Je n'arrive pas bien comprendre dans mon cas l'utilité de ce framework.
    Pourtant lorsque je lis des tutos, je vois partout Spring est incontournable pour une bonne architecture J2EE.

    Pourriez-vous me donner des informations et des conseils là dessus?

    Merci d'avance.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Points : 75
    Points
    75
    Par défaut
    je ne sais pas si ma reponse va t'ajouter grand chose mais quand meme je te la donne, en fait Spring est un conteneur leger ,
    il prend en charge la creation d'objet
    mise en relation d'objets à l'aide du fichier de configuration
    le fichier de configuration decrit les objets à construire ainsi que les relations de dependence entre ces objets.

    si mes reponses te semblent peut convainquante je te conseille de jetter un cuop d'oeil sur ce lien http://ego.developpez.com/spring/

    voila moi aussi je debute dessus

  3. #3
    ego
    ego est déconnecté
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 883
    Points : 3 510
    Points
    3 510
    Billets dans le blog
    2
    Par défaut
    Dans ton contexte, Struts - Hibernate, Spring va t'aider dans l'écriture de tes requêtes HQL (Hibernate templates) et dans la manipulation transparente des Sessions Hibernate (liées souvent à une request HTTP).
    Spring va t'aider à mettre en relation des objets métier et les DAO qu'ils utilisent pour déclencher certaines requêtes à la base.
    Spring va t'aider à configurer ton accès à la base MySQL.
    Spring va t'aider à définir les méthodes de tes classes actuelles que tu veux voir être transactionnelles sans aucune modification de ton code.
    Spring va t'aider faire du test sans foutre le bord...l dans ton code = utilisation de bouchons/mocked objects transparente.
    Tu pourras aussi rendre distribué n'importe quel objet Java sans modification de cet objet via l'encapsulation dans un EJB ou WebService ou ....

    Je te recommande le livre "Pro SPRING" pour en apprendre plus même si ce livre s'appuie sur une ancienne version de Spring.
    Tu verras que Spring te permet de faire beaucoup de choses et tout cela de manière consistente.

  4. #4
    Membre habitué Avatar de nikalkal
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 231
    Points : 166
    Points
    166
    Par défaut
    Ok merci pour ta réponse, comme ca: ca me parait plus utile en effet.
    Reste à le mettre en oeuvre...

    @+

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 21
    Points : 15
    Points
    15
    Par défaut
    il me semblait que faire des ejbs ou du struts n'était pas nécessaire pour le cas d'adoptation de Spring car celui-ci peut me semble t'il gérer et l'accès à la couche de persistence et le coté présentation.
    Mais peut être me trompes - je .

    A propos de formation, quelqu'un aurait il un avis concernant l'ouvrage 'Spring in Action' aux éditions Manning ?

    --
    Marc

  6. #6
    ego
    ego est déconnecté
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 883
    Points : 3 510
    Points
    3 510
    Billets dans le blog
    2
    Par défaut
    Spring n'est pas un framework de mapping O/R.
    Il facilite l'usage de JDBC et de frameworks de mapping O/R comme Hibernate, iBatis, JDO.
    Pour la partie Web, oui Spring MVC peut remplacer Struts et il est même mieux fait que Struts selon moi. Cependant, Spring sait s'intégrer à Struts.
    Enfin, Spring sait faire plein de choses et on n'est pas obligé de tout prendre.
    Pour les EJBs, Spring ne remplace pas les EJB quand on en a besoin.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 26
    Points : 29
    Points
    29
    Par défaut
    Bonjour,
    l'ouvrage 'Spring in Action' aux éditions Manning me parait plutot pas mal. J'ai commence a le lire il y a qq jours et pour l'instant il me convient bien : petits exemples et remise dans le contexte de la philo du framework

    bon courage
    ciao

  8. #8
    Membre habitué Avatar de nikalkal
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 231
    Points : 166
    Points
    166
    Par défaut
    Ok j'ai appris pas mal de choses sur spring mais pour en revenir à mo application j'ai toujours du mal à comprendre comment implémenter les fonctionalités de spring.

    Prenons un exemple concret d'une requête de création de voiture (le code sera un peu long mais je tiens à tout mettre pour vos éventuelles remarque sur la façon de coder :

    J'affiche à l'utilisateur un formulaire avec struts dans une 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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
            <html:form action="/creerVoiture">
                <table>
                    <tr>
                        <td width="30"></td>
                        <td>Nom</td>
                        <td width="30"></td>
                        <td><html:text property="nom" size="44"/>*</td>
                    </tr>
                    <tr>
                        <td width="30"></td>
                        <td>Modele</td>
                        <td width="30"></td>
                        <td><html:text property="modele" size="44"/>*</td>
                    </tr>
                    <tr>
                        <td width="30"></td>
                        <td>Annee</td>
                        <td width="30"></td>
                        <td><html:text property="annee" size="4"/>*</td>
                    </tr>
                    <tr>
                        <td width="30"></td>
                        <td>Kilometrage</td>
                        <td width="30"></td>
                        <td><html:text property="kilometrage" size="7"/>*</td>
                    </tr>
                    <tr>
                </table>
                <table>
                    <tr>
                        <td width="165"></td>
                        <td><html:submit value="Envoyer"/></td>
                        <td><html:button property="btnEffacer" value="Effacer" onclick="effacer()"/></td>
                    </tr>
                </table>
                <table>
                    <br /><br /><font class="etoile">* Les champs munis d'une &eacute;toile sont obligatoires.</font>
                </table>
            </html:form>
    Déclaration des éléments nécéssaire dans 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
     
        <form-beans>
            <form-bean name="frmVoiture" type="fr.gestentrep.voitures.actions.FormulaireVoitureBean"/>
        </form-beans>
        <action-mappings>
            <action path="/creerVoiture"
                name="frmVoiture"
                scope="session"
                validate="true"
                input="/erreursCreationVoiture.do"
                type="fr.gestentrep.voitures.actions.FormulaireVoitureAction"
            >
                <forward name="reponseCreationVoiture" path="/reponseCreationVoiture.do"/>
                <forward name="index" path="/index.do"/>
            </action>
            <action path="/reponseCreationVoiture"
                parameter="/vues/voitures/formulaires/reponses/reponse.voiture.jsp"
                type="org.apache.struts.actions.ForwardAction"
            />
        </action-mappings>
    Ensuite création du bean formulaire :
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    import javax.servlet.http.HttpServletRequest;
     
    import org.apache.struts.action.ActionErrors;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionMapping;
    import org.apache.struts.action.ActionMessage;
     
    public class FormulaireVoitureBean extends ActionForm {
        private String nom = null;
        private String modele = null;
        private String annee = null;
        private String kilometrage = null;
     
        public String getNom() {
            return nom;
        }
        public String getModele() {
            return modele;
        }
        public String getAnnee() {
            return annee;
        }
        public String getKilometrage() {
            return kilometrage;
        }
     
        public void setNom(String nom) {
            this.nom = nom;
        }
        public void setModele(String modele) {
            this.modele = modele;
        }
        public void setAnnee(String annee) {
            this.annee = annee;
        }
        public void setKilometrage(String kilometrage) {
            this.kilometrage = kilometrage;
        }
     
        public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
            ActionErrors erreurs = new ActionErrors();
            if (nom == null || nom.trim().equals("")) {
                erreurs.add("nomvide", new ActionMessage("voiture.formulaire.nom.vide"));
            }
            if (modele == null || modele.trim().equals("")) {
                erreurs.add("modelevide", new ActionMessage("voiture.formulaire.modele.vide"));
            }
            if (annee == null || annee.trim().equals("")) {
                erreurs.add("anneevide", new ActionMessage("voiture.formulaire.annee.vide"));
            } else {
                if (!annee.matches("^\\s*\\d+\\s*$")) {
                    erreurs.add("anneeincorrect", new ActionMessage("voiture.formulaire.annee.incorrect", annee));
                }
            }
            if (kilometrage == null || kilometrage.trim().equals("")) {
                erreurs.add("kilometragevide", new ActionMessage("voiture.formulaire.kilometrage.vide"));
            } else {
                if (!kilometrage.matches("^\\s*\\d+\\s*$")) {
                    erreurs.add("kilometrageincorrect", new ActionMessage("voiture.formulaire.kilometrage.incorrect", annee));
                }
            }
            return erreurs;
        }
    }
    Puis création de l'action du formulaire :
    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
     
    import java.io.IOException;
     
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
     
    import org.hibernate.Session;
    import org.hibernate.Transaction;
     
    import org.apache.struts.action.Action;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.ActionMapping;
     
    import fr.gestentrep.util.HibernateUtil;
    import fr.gestentrep.voitures.Voiture;
    import fr.gestentrep.voitures.actions.FormulaireVoitureBean;;
     
    public class FormulaireVoitureAction extends Action {
     
        public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException {
            HttpSession sessionGlobale = request.getSession(true);
            if(sessionGlobale.getAttribute("droits")==null) {
                return mapping.findForward("index");
            } else {
                FormulaireVoitureBean formulaire=(FormulaireVoitureBean)form;
                request.setAttribute("nom",formulaire.getNom());
                request.setAttribute("modele",formulaire.getModele());
                request.setAttribute("annee",formulaire.getAnnee());
                request.setAttribute("kilometrage",formulaire.getKilometrage());
     
                Session session = HibernateUtil.currentSession();
                Transaction tx = session.beginTransaction();
                Voiture theVoiture = new Voiture();
                theVoiture.setNom(formulaire.getNom());
                theVoiture.setModele(formulaire.getModele());
                theVoiture.setAnnee(Integer.parseInt(formulaire.getAnnee()));
                theVoiture.setKilometrage(Long.parseLong(formulaire.getKilometrage()));
                session.save(theVoiture);
                tx.commit();
            }
            return mapping.findForward("reponseCreationVoiture");
        }
    }
    Içi on voit l'utilisation d'hibernate pour le mapping O/R.

    Maintenant, ce que je ne vois pas c'est : qu'est-ce que spring peut apporter comme amélioration à ce niveau du code et que faut-il faire pour implémenter ses nouvelles fonctionalités?

    Merci à ceux qui prendront le temps de tout lire et qui m'aideront à comprendre, par le biais de cet exemple, l'utilité du framework et son implémentation.

    @+

  9. #9
    Membre habitué Avatar de nikalkal
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 231
    Points : 166
    Points
    166
    Par défaut
    je relance une dernière fois ce post car c'est assez important pour moi.
    Aprés j'arrete promis.

  10. #10
    ego
    ego est déconnecté
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    1 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 883
    Points : 3 510
    Points
    3 510
    Billets dans le blog
    2
    Par défaut
    Il ne faut pas écrire le code de la transaction dans ton Action !
    Il te faut créer un objet "métier" de type "service", cet objet métier possède des méthodes qui :
    • Utilise HibernateTemplate pour écrire le code HQL
    • Seront déclarées transactionnelles via le fichier de config Spring; ce qui t'évite d'écrire le "begin" et le "commit"

    En faisant ainsi, ton code métier n'est pas pollué par le démarquage transactionnel et tu peux aussi combiner plusieurs méthodes métier dans plusieurs transactions.

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 239
    Points : 239
    Points
    239
    Par défaut
    Oui, pour continuer sur le message d'ego il faut séparer tes couches

    Presentation - Traitement - Persistance

    Dans ta couche présentation, tu ne fais que controller les actions utilisateur, valider les formulaires et transmettre les infos dans ta couche métier. Tu peux adopter un framework MVC comme Struts, JSF, ou bien Spring MVC

    Dans ta couche Traitement ce sont toutes les fonctionnalités métiers que tu dois implémenter.

    Dans ta couche Persistance, on interagit avec la bdd. Framework Hibernate, Ibatis, Spring JDBC, etc ....

    Pour il est important de bien séparer les choses. Si ton application grossit sans compter les demandes de changement diverses sur des fonctionnalités et d'éventuelles migrations technologiques, tu verras que ce sera plus simple que de tout "fourrer" dans une seule classe.

    Je te conseille de lire les excellents tutoriels de Serge Tahe (Ils traitent de Spring notamment) présents sur le site même.

  12. #12
    Membre habitué Avatar de nikalkal
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 231
    Points : 166
    Points
    166
    Par défaut
    Ok merci.

    En fait, quand j'ai commencé mon projet, je suis parti avec struts pour respecter le modèle MVC et comme c'était mon premier projet de ce type apparement j'ai bien séparé la vue mais pas le modèle du controleur.

    D'ailleurs mon coté vue le trouvez-vous correct dans mon exemple?

    Ensuite si j'ai bien compris mon action est la partie contrôleur et doit faire appel à des objets métiers qui fourniront les services transactionnels que je déclarerai en tant que tel dans spring ok.


    Donc je vous pose encore un autre question : si j'utilise struts et spring, spring sera implémenté seulement pour déclarer les parties transactionnelles de mon projet?

    Je te conseille de lire les excellents tutoriels de Serge Tahe (Ils traitent de Spring notamment) présents sur le site même.
    --> j'en ai lu pas mal depuis et c'est vrai que ces tutos sont exceptionnels pour la présentation du sujet dont ils traitent, mais j'ai parfois du mal à voir comment intégrer ça à des projets. Le tri n'est pas facil à faire.

    En + c'était ma première appli J2EE et rien qu'implémenter eclipse, tomcat, struts, hibernate et mysql ca m'a déja demandé pas mal de temps.

    Je vais déja implémenter cette nouvelle architecture.

    Merci pour vos conseils.

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 29
    Points : 35
    Points
    35
    Par défaut
    Bonjour,

    Première remarque. je pense que tu te trompe sur l'utilisation du mot "implémenter" ( http://fr.wikipedia.org/wiki/Impl%C3%A9mentation ).
    Dans ce cas tu implémente pas Spring, mais tu l'utilise tout simplement.


    Ma deuxième remarque c'est qu'apparement on va t'imposer d'utiliser Spring, donc tu n'as pas d'autre choix que de l'apprendre. Ce que je regrette c'est que souvent beaucoup de gens utilise Spring, parce que c'est la mode, et ne se pose même pas la question de savoir si c'est utile pour leur projet. C'est comme pour les EJB.

    Souvent pour des projets, une bonne Factory simple et un Hibernate suffit largement plus un filtre pour fermer et ouvrir les sessions (comme dans ton projet d'entrainement).

    En fait, à mon avis, il faut prendre en compte la taille du projet, sa pérénité prévu (souvent les projets sont prévu à la base pour pouvoir évoluer mais n'évolue en fait jamais), si tu es seul dessus ou en équipe, etc...

    Et moi en ce qui me concerne les fichiers de conf XML partout commence à me gonfler.

    Tester Spring c'est bien, l'utiliser aussi, mais le plus dur c'est de savoir quand réellement on doit l'utiliser.

    Tout ce marketing et effet de mode des décideurs informatiques est vraiment fatiguant.

    Jérôme

Discussions similaires

  1. Intégrer Admob à mon application Android
    Par cp-08jhu dans le forum Android
    Réponses: 26
    Dernier message: 25/02/2012, 21h20
  2. [Data] Erreur SPRING dans mon application J2EE
    Par inouss dans le forum Spring
    Réponses: 3
    Dernier message: 16/06/2010, 19h57
  3. Réponses: 3
    Dernier message: 04/07/2007, 17h06
  4. Réponses: 9
    Dernier message: 14/09/2006, 18h03
  5. Réponses: 1
    Dernier message: 30/08/2006, 20h00

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