Comment passer les attributs du modèle d'un contrôleur MVC de printemps à un autre contrôleur?

je redirige d'un contrôleur vers un autre contrôleur. Mais j'ai aussi besoin de passer les attributs model au second controller.

Je ne veux pas mettre le modèle en session.

Aidez-moi.

34
demandé sur ashishjmeshram 2011-09-15 14:53:04

10 réponses

je pense que la façon la plus élégante de le faire est d'implémenter Flash Scope personnalisé en MVC printemps.

l'idée principale pour le champ d'application flash est de stocker des données d'un contrôleur jusqu'à la redirection suivante dans le second contrôleur

veuillez vous reporter à ma réponse à la question sur le champ d'application personnalisé:

Spring MVC portée personnalisée bean

La seule chose qui manque dans ce code est le suivant configuration xml:

<bean id="flashScopeInterceptor" class="com.vanilla.springMVC.scope.FlashScopeInterceptor" />
<bean id="handlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
  <property name="interceptors">
    <list><ref bean="flashScopeInterceptor"/></list>
  </property>
</bean>
12
répondu danny.lesnik 2017-05-23 12:34:38

j'utilise printemps 3.2.3 et voici comment j'ai résolu le même problème.

1) Ajout de RedirectAttributes redirectAttributes à la liste des paramètres de la méthode dans controller 1.

public String controlMapping1(
        @ModelAttribute("mapping1Form") final Object mapping1FormObject,
        final BindingResult mapping1BindingResult,
        final Model model, 
        final RedirectAttributes redirectAttributes)

2) à l'intérieur de la méthode ajouté du code pour ajouter l'attribut flash à redirecttributes redirectAttributes.addFlashAttribute("mapping1Form", mapping1FormObject);

3) Ensuite, dans le second contoller utiliser le paramètre de méthode annoté avec @ModelAttribute pour accéder aux attributs de redirection

@ModelAttribute("mapping1Form") final Object mapping1FormObject

voici le code d'échantillon du Contrôleur 1:

@RequestMapping(value = { "/mapping1" }, method = RequestMethod.POST)
public String controlMapping1(
        @ModelAttribute("mapping1Form") final Object mapping1FormObject,
        final BindingResult mapping1BindingResult,
        final Model model, 
        final RedirectAttributes redirectAttributes) {

    redirectAttributes.addFlashAttribute("mapping1Form", mapping1FormObject);

    return "redirect:mapping2";
}   

De Contolleur 2:

@RequestMapping(value = "/mapping2", method = RequestMethod.GET)
public String controlMapping2(
        @ModelAttribute("mapping1Form") final Object mapping1FormObject,
        final BindingResult mapping1BindingResult,
        final Model model) {

    model.addAttribute("transformationForm", mapping1FormObject);

    return "new/view";  
}
97
répondu aborskiy 2015-03-20 06:32:26

en utilisant juste redirectAttributes.addFlashAttribute(...) -> "redirect:..." a fonctionné aussi, n'a pas eu à "réinsérer" l'attribut model.

Merci, aborskiy!

11
répondu pkopac 2014-01-12 15:13:03

, Vous pouvez le résoudre en utilisant org.springframework.Web.servlet.mvc.soutien.RedirectAttributes.

Voici mon échantillon de contrôleur.

@RequestMapping(method = RequestMethod.POST)
    public String eligibilityPost(
            @ModelAttribute("form") @Valid EligibiltyForm form,
            Model model,
            RedirectAttributes redirectAttributes) {
        if(eligibilityService.validateEligibility(form)){
            redirectAttributes.addFlashAttribute("form", form);
            return "redirect:<redirect to your page>";
        }
       return "eligibility";
    }

pour en savoir plus sur mon blog à http://mayurshah.in/596/how-do-i-redirect-to-page-keeping-model-value

3
répondu Mayur Shah 2017-11-14 08:46:22

ajouter tous les attributs de modèle à L'URL de redirection comme chaîne de requête.

0
répondu Pokuri 2011-09-15 11:12:45

Peut-être que vous pourriez le faire comme ceci:

N'utilisez pas le modèle dans le premier contrôleur. Stocker des données dans un autre objet partagé qui pourrait ensuite être récupéré par le second contrôleur.

Regardez ce et ce après. C'est à propos de la même question.

P. S.

, Vous pouvez probabbly utiliser session étendue bean pour les données partagées...

0
répondu Matjaz Muhic 2017-05-23 12:18:13

j'ai eu le même problème.

avec RedirectAttributes après rafraîchissement de la page, les attributs de mon modèle de first controller ont été perdus. Je pensais que c'est un bug, mais j'ai trouvé la solution. Dans le premier controller J'ajoute des attributs dans ModelMap et je le fais à la place de "redirect":

retour", de l'avant :/nameOfView";

cela redirigera vers votre autre controller et conservera aussi les attributs du model à partir de la première.

j'espère que c'est ce que vous cherchez. Désolé pour mon anglais

0
répondu DinkoCejvanovic 2016-04-02 16:01:00

si vous voulez juste passer tous les attributs à rediriger...

public String yourMethod( ...., HttpServletRequest request, RedirectAttributes redirectAttributes) {
    if(shouldIRedirect()) {
        redirectAttributes.addAllAttributes(request.getParameterMap());
        return "redirect:/newPage.html";
    }
}
0
répondu Michal Ambrož 2017-08-04 22:44:09

j'ai utilisé @ControllerAdvice , s'il vous plaît vérifier est disponible au printemps 3.X; je l'utilise au Printemps 4.0.

@ControllerAdvice 
public class CommonController extends ControllerBase{
@Autowired
MyService myServiceInstance;

    @ModelAttribute("userList")
    public List<User> getUsersList()
    {
       //some code
       return ...
    }
}
0
répondu JPRLCol 2018-01-29 16:32:31

en utilisant @ModelAttribute nous pouvons passer le modèle d'un contrôleur à un autre contrôleur

[entrée au premier contrôleur] [1]

[]: https://i.stack.imgur.com/rZQe5.jpg de la page jsp le premier contrôleur lie les données de forme avec le @ModelAttribute à L'utilisateur Bean

@Controller
public class FirstController {

    @RequestMapping("/fowardModel")
    public ModelAndView forwardModel(@ModelAttribute("user") User u) {
        ModelAndView m=new ModelAndView("forward:/catchUser");
        m.addObject("usr", u);
        return m;

    }
}



@Controller
public class SecondController {
    @RequestMapping("/catchUser")
    public ModelAndView catchModel(@ModelAttribute("user")  User u) {

        System.out.println(u); //retrive the data passed by the first contoller

        ModelAndView mv=new ModelAndView("userDetails");
        return mv;
        }
    }
0
répondu john kothapeta 2018-06-12 10:56:01