96 votes

Spring RedirectAttributes : addAttribute() vs addFlashAttribute()

D'après ce que j'ai compris jusqu'à présent, la méthode de mappage des requêtes de notre contrôleur permet de spécifier RedirectAttributes et le remplir d'attributs pour la redirection de la demande.

Ejemplo :

@RequestMapping(value="/hello", method=GET)
public String hello(RedirectAttributes redirAttr)
{
   // should I use redirAttr.addAttribute() or redirAttr.addFlashAttribute() here ?

   // ...

   return "redirect:/somewhere";
}

Les attributs de la redirection seront alors disponibles sur la page cible vers laquelle la redirection est effectuée.

Cependant RedirectAttributes possède deux méthodes :

J'ai lu la documentation de Spring pendant un certain temps, mais je suis un peu perdu. Quel est le principe fondamental de différence Comment se situe la différence entre ces deux types de produits et comment choisir celui que l'on veut utiliser ?

129voto

Biju Kunjummen Points 20258

Voici le différence :

  • addFlashAttribute() stocke en fait les attributs dans un carte éclair (qui est maintenu en interne dans les utilisateurs session et supprimé une fois que la demande redirigée suivante est satisfaite)

  • addAttribute() construit essentiellement paramètres de la demande hors de de vos attributs et redirige vers la page souhaitée avec les paramètres de paramètres.

Ainsi, le avantage de addFlashAttribute() sera que vous pouvez stocker à peu près n'importe quel objet dans votre attribut flash (car il n'est pas sérialisé dans les paramètres de la requête, mais maintenu en tant qu'objet), alors qu'avec addAttribute() puisque l'objet que vous ajoutez est transformé en un paramètre de requête normal, vous êtes assez limité aux types d'objets tels que String ou des primitives.

24voto

JavaLearner Points 201

Supposons que vous ayez 2 contrôleurs. Si vous redirigez d'un contrôleur vers un autre contrôleur, les valeurs de l'objet modèle ne seront pas disponibles dans la base de données. [ ] l'autre contrôleur. Donc si vous voulez partager les valeurs de l'objet modèle il faut dire dans le premier contrôleur

addFlashAttribute("modelkey", "modelvalue");

Le modèle du second contrôleur contient maintenant la paire clé-valeur ci-dessus

Deuxième question ? Quelle est la différence entre addAttribute y addFlashAttribute en RedirectAttributes classe

addAttribute transmettra les valeurs en tant que paramètres de requête au lieu du modèle, de sorte que lorsque vous en ajoutez à l'aide de addAttribute vous pouvez accéder à ces valeurs à partir de request.getParameter

Voici le code que j'ai utilisé pour comprendre ce qui se passe :

@RequestMapping(value = "/rm1", method = RequestMethod.POST)
public String rm1(Model model,RedirectAttributes rm) {
    System.out.println("Entered rm1 method ");

    rm.addFlashAttribute("modelkey", "modelvalue");
    rm.addAttribute("nonflash", "nonflashvalue");
    model.addAttribute("modelkey", "modelvalue");

    return "redirect:/rm2.htm";
}

@RequestMapping(value = "/rm2", method = RequestMethod.GET)
public String rm2(Model model,HttpServletRequest request) {
    System.out.println("Entered rm2 method ");

    Map md = model.asMap();
    for (Object modelKey : md.keySet()) {
        Object modelValue = md.get(modelKey);
        System.out.println(modelKey + " -- " + modelValue);
    }

    System.out.println("=== Request data ===");

    java.util.Enumeration<String> reqEnum = request.getParameterNames();
    while (reqEnum.hasMoreElements()) {
        String s = reqEnum.nextElement();
        System.out.println(s);
        System.out.println("==" + request.getParameter(s));
    }

    return "controller2output";
}

7voto

scb Points 34

Description Javadoc : "Un FlashMap permet à une demande de stocker des attributs destinés à être utilisés dans une autre demande. Cela est le plus souvent nécessaire lors de la redirection d'une URL vers une autre -- par exemple, le modèle Post/Redirect/Get. Un FlashMap est sauvegardé avant la redirection (typiquement dans la session) et est rendu disponible après la redirection et supprimé immédiatement."

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X