Ich leite von einem Controller zu einem anderen Controller um. Ich muss aber auch Modellattribute an den zweiten Controller übergeben.
Ich möchte das Modell nicht in Sitzung setzen.
Bitte helfen.
Ich denke, der eleganteste Weg, dies zu tun, ist die Implementierung eines benutzerdefinierten Flash Scope in Spring MVC.
die Hauptidee für das Flash-Scope besteht darin, Daten von einem Controller bis zur nächsten Weiterleitung im zweiten Controller zu speichern
Bitte beziehen Sie sich auf meine Antwort auf die Frage zum benutzerdefinierten Umfang:
Das einzige, was in diesem Code fehlt, ist die folgende XML-Konfiguration:
<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>
Ich benutze Feder 3.2.3 und hier habe ich ein ähnliches Problem gelöst.
1) RedirectAttributes redirectAttributes wurde der Methodenparameterliste in Controller 1 hinzugefügt.
public String controlMapping1(
@ModelAttribute("mapping1Form") final Object mapping1FormObject,
final BindingResult mapping1BindingResult,
final Model model,
final RedirectAttributes redirectAttributes)
2) In der Methode wurde Code zum Hinzufügen von Flash-Attributen zu redirectAttributes redirectAttributes.addFlashAttribute("mapping1Form", mapping1FormObject);
hinzugefügt.
3) Dann verwenden Sie im zweiten Controller den mit @ModelAttribute kommentierten Methodenparameter, um auf die Umleitungsattribute zuzugreifen
@ModelAttribute("mapping1Form") final Object mapping1FormObject
Hier ist der Beispielcode von Controller 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";
}
Ab Contoller 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";
}
Die Verwendung von nur redirectAttributes.addFlashAttribute(...) -> "redirect:..."
hat auch funktioniert, das Modellattribut musste nicht "neu eingefügt" werden.
Vielen Dank, aborskiy!
Sie können das Problem mithilfe von org.springframework.web.servlet.mvc.support.RedirectAttributes beheben.
Hier ist mein Controller-Beispiel.
@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";
}
lesen Sie mehr in meinem Blog unter http://mayurshah.in/596/how-do-i-redirect-to-page-keeping-model-value
Ich habe @ControllerAdvice
verwendet, bitte prüfen, ob in Spring 3.X verfügbar ist; Ich verwende es im Frühjahr 4.0.
@ControllerAdvice
public class CommonController extends ControllerBase{
@Autowired
MyService myServiceInstance;
@ModelAttribute("userList")
public List<User> getUsersList()
{
//some code
return ...
}
}
Wenn Sie alle Attribute übergeben möchten, um sie weiterzuleiten ...
public String yourMethod( ...., HttpServletRequest request, RedirectAttributes redirectAttributes) {
if(shouldIRedirect()) {
redirectAttributes.addAllAttributes(request.getParameterMap());
return "redirect:/newPage.html";
}
}
Ich hatte das gleiche Problem.
Mit RedirectAttributes nach der Aktualisierung der Seite sind meine Modellattribute vom ersten Controller verloren gegangen. Ich dachte, das ist ein Fehler, aber dann habe ich eine Lösung gefunden ... Im ersten Controller füge ich Attribute in ModelMap hinzu und mache dies anstelle von "Weiterleiten":
return " vorwärts :/nameOfView";
Dadurch werden Sie zu Ihrem anderen Controller umgeleitet und die Modellattribute bleiben dabei erhalten.
Ich hoffe, das ist was Sie suchen. Entschuldigung für mein Englisch
Fügen Sie der Umleitungs-URL alle Modellattribute als Abfragezeichenfolge hinzu.
Mit @ModelAttribute können wir das Modell von einem Controller an einen anderen Controller übergeben.
[Eingang zum ersten Controller] [1]
[]: https://i.stack.imgur.com/rZQe5.jpg Von der jsp-Seite bindet der erste Controller die Formulardaten mit dem @ModelAttribute an das User 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;
}
}
Vielleicht könntest du es so machen:
Verwenden Sie das Modell nicht im ersten Controller. Speichern Sie Daten in einem anderen gemeinsam genutzten Objekt, das dann vom zweiten Controller abgerufen werden kann.
Schau dir das und das an. Es geht um das ähnliche Problem.
P.S.
Sie könnten wahrscheinlich session scoped bean für diese gemeinsam genutzten Daten verwenden ...