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

时间:2011-09-15 10:53:05

标签: redirect spring-mvc controllers modelattribute

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

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

请帮忙。

10 个答案:

答案 0 :(得分:107)

我使用spring 3.2.3,这就是我解决类似问题的方法 1)将RedirectAttributes redirectAttributes添加到控制器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)然后,在第二个控制器中使用@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";
}   

来自控制器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";  
}

答案 1 :(得分:13)

仅使用redirectAttributes.addFlashAttribute(...) -> "redirect:..."也可以,不必“重新插入”模型属性。

谢谢,aborskiy!

答案 2 :(得分:12)

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

闪存范围的主要思想是将数据从一个控制器存储到第二个控制器中的下一个重定向

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

Spring MVC custom scope 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>

答案 3 :(得分:3)

您可以使用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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

也许你可以这样做:

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

查看thisthis帖子。这是关于类似的问题。

P.S。

你可能会使用session scoped bean来获取该共享数据......

答案 6 :(得分:0)

我使用了@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 ...
    }
}

答案 7 :(得分:0)

我有同样的问题。

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

返回“前进:/ nameOfView”;

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

我希望这就是你要找的东西。对不起我的英文

答案 8 :(得分:0)

如果您只想传递所有属性以重定向...

// Filtering by a company from the beginning
$order_company = 'Corporate Client Name';

global $wpdb;

$table_postmeta = $wpdb->prefix . "postmeta";

// 1. First SQL query the order IDs related to 'Corporate Client Name'
$results = $wpdb->get_col( "
    SELECT post_id
    FROM $table_postmeta
    WHERE $table_postmeta.meta_key LIKE '_billing_company'
    AND $table_postmeta.meta_value = '$order_company'
" );

// Convert the array of IDs in a coma separated string
$orders_str = implode(',', $results);

// 2. Second SQL query get the emails from order IDs related to 'Corporate Client Name'
$emails = $wpdb->get_col( "
    SELECT meta_value
    FROM $table_postmeta
    WHERE $table_postmeta.meta_key LIKE '_billing_email'
    AND $table_postmeta.post_id IN ($orders_str)
" );


// Testing output
print_r( $emails );

答案 9 :(得分:0)

通过使用@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;
        }
    }