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.
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>
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";
}
en utilisant juste redirectAttributes.addFlashAttribute(...) -> "redirect:..."
a fonctionné aussi, n'a pas eu à "réinsérer" l'attribut model.
Merci, aborskiy!
, 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
ajouter tous les attributs de modèle à L'URL de redirection comme chaîne de requête.
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...
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
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";
}
}
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 ...
}
}
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;
}
}