如何将模型属性从一个Spring MVC控制器传递到另一个控制器



我正在从一个控制器重定向到另一个控制器。但我还需要将模型属性传递给第二个控制器。

我不想把模型放在会话中。

请帮。

我使用spring 3.2.3,下面是我解决类似问题的方法。
1)在控制器1的方法参数列表中增加RedirectAttributes RedirectAttributes。

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

2)在方法内部添加了代码,将flash属性添加到redirectAttributes redirectAttributes.addFlashAttribute("mapping1Form", mapping1FormObject);

3)然后,在第二个控制器中使用带有@ModelAttribute注释的方法参数来访问重定向属性

@ModelAttribute("mapping1Form") final Object mapping1FormObject
下面是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";
}   

From controller 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";  
}

只使用redirectAttributes.addFlashAttribute(...) -> "redirect:..."也可以,不需要"重新插入"模型属性。

谢谢,aborskiy !

我认为最优雅的方法是在Spring MVC中实现自定义Flash作用域。

flash作用域的主要思想是从一个控制器存储数据,直到下一次重定向到第二个控制器

请参考我对自定义作用域问题的回答:

Spring MVC自定义作用域bean

这段代码中唯一缺少的是以下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>

您可以使用org.springframework.web.servlet.mvc.support.RedirectAttributes.

这是我的控制器样本。

@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";
    }

在我的博客上阅读更多http://mayurshah.in/596/how-do-i-redirect-to-page-keeping-model-value

我也有同样的问题。

在刷新页面后使用RedirectAttributes,我的第一个控制器的模型属性已经丢失。我以为这是一个bug,但后来我找到了解决方案。在第一个控制器中,我在ModelMap中添加属性,并这样做,而不是"redirect":

向前

返回" :/nameOfView";

这将重定向到另一个控制器,并保留第一个控制器的模型属性。

我希望这是你在找什么。对不起,我的英语

如果你想传递所有属性到重定向…

public String yourMethod( ...., HttpServletRequest request, RedirectAttributes redirectAttributes) {
    if(shouldIRedirect()) {
        redirectAttributes.addAllAttributes(request.getParameterMap());
        return "redirect:/newPage.html";
    }
}

也许你可以这样做:

不要在第一个控制器中使用模型。将数据存储在其他共享对象中,然后由第二个控制器检索。

看看这个和这个帖子。这是关于类似的问题。

公立小学

你可能会使用会话作用域bean共享数据…

我使用的是@ControllerAdvice,请查看Spring 3.X是否可用;我在Spring 4.0中使用它

@ControllerAdvice 
public class CommonController extends ControllerBase{
@Autowired
MyService myServiceInstance;
    @ModelAttribute("userList")
    public List<User> getUsersList()
    {
       //some code
       return ...
    }
}

通过使用@ModelAttribute我们可以将模型从一个控制器传递到另一个控制器

[第一个控制器输入][1]

[]: https://i.stack.imgur.com/rZQe5.jpg从jsp页面第一控制器绑定表单数据与@ModelAttribute到用户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;
    }
}

将所有模型属性添加到重定向URL中作为查询字符串。

最新更新