Redirect 如何将模型属性从一个SpringMVC控制器传递到另一个控制器?

Redirect 如何将模型属性从一个SpringMVC控制器传递到另一个控制器?,redirect,spring-mvc,controllers,modelattribute,Redirect,Spring Mvc,Controllers,Modelattribute,我正在从一个控制器重定向到另一个控制器。但我还需要将模型属性传递给第二个控制器 我不想把模型放到会话中 请提供帮助。将所有模型属性作为查询字符串添加到重定向URL。也许您可以这样做: 不要在第一个控制器中使用模型。将数据存储在另一个共享对象中,然后由第二个控制器检索 查看并张贴。这是关于类似的问题 附言 您可能会将bean用于共享数据 我认为最优雅的方法是在Spring MVC中实现自定义Flash范围 闪存示波器的主要思想是将来自一个控制器的数据存储到第二个控制器中的下一个重定向 请参阅我对自

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

我不想把模型放到会话中


请提供帮助。

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

也许您可以这样做:

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

查看并张贴。这是关于类似的问题

附言


您可能会将bean用于共享数据

我认为最优雅的方法是在Spring MVC中实现自定义Flash范围

闪存示波器的主要思想是将来自一个控制器的数据存储到第二个控制器中的下一个重定向

请参阅我对自定义范围问题的回答:

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

我使用spring 3.2.3,下面是我解决类似问题的方法。
1) 将重定向属性重定向属性添加到控制器1中的方法参数列表

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) 然后,在第二个控件中,使用带有@modeldattribute注释的方法参数访问重定向属性

@ModelAttribute("mapping1Form") final Object mapping1FormObject
以下是控制器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";
}   
从控制器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:…”
也可以,不必“重新插入”模型属性


谢谢,阿伯斯基

我使用了
@ControllerAdvice
,请检查Spring 3.X是否可用;我在Spring4.0中使用它

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

    @ModelAttribute("userList")
    public List<User> getUsersList()
    {
       //some code
       return ...
    }
}
@ControllerAdvice
公共类CommonController扩展了ControllerBase{
@自动连线
MyService-MyService-instance;
@ModelAttribute(“用户列表”)
公共列表getUsersList()
{
//一些代码
返回。。。
}
}
我也有同样的问题

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

返回“向前:/nameOfView”

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


我希望这就是你要找的。对不起,我的英语不好

您可以使用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";
    }
@RequestMapping(method=RequestMethod.POST)
公共字符串可识别性列表(
@ModelAttribute(“表单”)@有效的EligibiltyForm表单,
模型,
重定向属性(重定向属性){
if(合格服务.有效性(表格)){
redirectAttributes.addFlashAttribute(“表单”,表单);
返回“重定向:”;
}
返回“资格”;
}
在我的博客上阅读更多

如果您只想将所有属性传递给重定向

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

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

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

[]: 从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的,我们可以在不附加到url的情况下限制这些参数吗?重新插入是误导。请看@petr kopac的回复。只是一个提示。。。因为它让我疯狂。。。为了工作,在springmvc文件中必须有一个。。。那么只需要第1步和第2步。重新插入是误导。重要的是
重定向属性。addFlashAttribute
。第二个处理程序不必期望额外的<代码> @ MealDeals参数。在第二个控制器中,Spring创建新的用户对象,并用新的用户对象设置第一个控制器用户对象的值。自2013年以来,这似乎是正确的解决方案。当我这样做时,模型属性将丢失