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 Web Java Discussion :

Conseil gestion des données dans un controller


Sujet :

Spring Web Java

  1. #1
    Membre confirmé Avatar de Katachana
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2007
    Messages : 755
    Points : 503
    Points
    503
    Par défaut Conseil gestion des données dans un controller
    Bonjour,

    Je suis a la recherche de bonne pratique / convention en terme de gestion des données dans un controller.

    A l'initialisation de mes controllers je charge des données provenant de la base : Une partie ne sera jamais modifiée (ex : alimentation de liste déroulante) et une autre pourra être dynamique en fonction des choix utilisateurs.

    Pour l'instant je n'ai utilisé qu'un objet ViewBean contenant toute les informations en le déclarant comme @SessionAttribute.

    Mais du coup cet objet me sert à la fois a binder les informations de mon formulaire et a stocker des informations statiques qui seront afficher dans la page ou utilisées dans le controller.

    N'y aurait-il pas un pattern / une conception plus intelligente a utiliser pour avoir un découpage plus claire ?

    Merci d'avance !

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    940
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 940
    Points : 1 817
    Points
    1 817
    Par défaut
    Personnellement, je préfère avoir un objet qui représente les champs saisis par l'utilisateur, que je lie à la requête plutôt qu'à la session.

    Les listes déroulantes sont des objets séparés, typiquement créés par des méthodes avec l'annotation @ModelAttribute. A moins que les options ne dépendent de l'utilisateur connecté, je pense qu'elles ne devraient pas être dans la session. Sur une méthode, @ModelAttribute indique qu'il faut appeler la méthode pour ajouter un objet au modèle. L'intérêt est que ces méthodes sont appelées automatiquement, sans qu'il soit nécessaire de le faire dans les méthodes gérant les actions de l'utilisateur. Ainsi on sépare clairement les traitements à effectuer en réaction à une action de l'utilisateur de l'initialisation des champs.

    Imaginons par exemple le contrôleur d'un formulaire permettant de choisir une langue avec une liste déroulante. La liste des langues vient d'une base de données. GET affiche le formulaire, POST l'enregistre.

    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
     
    @Controller
    @RequestMapping("/language.html")
    public class LanguageController {
     
        private static class LanguageForm {
     
            private long languageId;
     
            // Constructeur getter setter etc.
        }
     
        @Autowired
        private LanguageService languageService;
     
        @RequestMapping(method = RequestMethod.GET)
        public ModelAndView() display() {
            LanguageForm languageForm = new LanguageForm();
     
            // Initialisation du formulaire vide etc.
     
            return new ModelAndView("languageView", "form", languageForm);
        }
     
        @RequestMapping(method = RequestMethod.POST)
        public ModelAndView() save(@ModelAttribute @Valid LanguageForm languageForm, BindingResult bindingResult) {
            if(!bindingResult.hasErrors()) {
                Language language = languageService.find(languageForm.getLanguageId());
     
                // Traitements du choix du langage.
            }
            return new ModelAndView("languageView", "form", languageForm);
        }
     
        @ModelAttribute("languagesList")
        public List<Language> populateLanguagesList() {
             return languageService.findAll();
        }
    }
    Ce code n'est qu'un exemple et pourrait être amélioré mais il montre bien l'intérêt de la méthode. L'objet Form contient exactement les mêmes champs que le formulaire. L'initialisation de la liste des langues est dans une méthode à part, elle ne vient pas encombrer le code des méthodes display ou save. Pas de risque non plus de la mettre dans display et de l'oublier dans save. Le formulaire n'est pas enregistré en session, pas de fuite de mémoire. Si la liste des langages ne change pas, on pourrait charger languagesList une seule fois à l'initialisation du controller plutôt qu'à chaque nouvelle session.

  3. #3
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2014
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mai 2014
    Messages : 153
    Points : 227
    Points
    227
    Par défaut
    Je procède en model.addAttribut().
    De ce fait tu peux choisir ce que tu y stockes (statique comme tu dis ou dyna /formulaire).

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/06/2010, 12h11
  2. Réponses: 7
    Dernier message: 22/03/2010, 21h15
  3. Réponses: 0
    Dernier message: 28/01/2010, 10h53
  4. Stocker des données dans un controle
    Par Roromix dans le forum Windows Forms
    Réponses: 3
    Dernier message: 24/04/2009, 22h50
  5. Réponses: 11
    Dernier message: 22/05/2008, 15h50

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