3

LoginFormController-->Post 在表单提交/发布后调用。最后,它调用另一个名为 LandingFormController-->loadForm 的控制器。

好吧,在 loadForm 中,模型中的值似乎是空的。有没有办法可以在会话或请求中保留一个 Bean 并在 loadForm 方法中获取它?奖励积分:如果您可以指出一些文件以供参考:)

谢谢

@Controller
@RequestMapping(value="/login")
public class LoginFormController {  

@RequestMapping(method=RequestMethod.POST)
public ModelAndView post(@ModelAttribute User user, BindingResult result, SessionStatus status) {
    logger.info("post");
    new ReceiptUserValidator().validate(user, result);
    if (result.hasErrors()) {
        return new ModelAndView("login");
    }
    else {
        logger.info("Email Id: " + user.getEmailId());
        //status.setComplete();         

        Map<String, Object> model = new HashMap<String, Object>();
        model.put("userId", user.getEmailId());
        model.put("now", new Date().toString());

        return new ModelAndView("redirect:/landing.htm", "model", model);
    }
}

下面的控制器 B 被调用

@Controller
@RequestMapping(value="/landing")
public class LandingFormController {    
    protected final Log logger = LogFactory.getLog(getClass());

    @RequestMapping(method=RequestMethod.GET)
    public String loadForm(Model model) {
        logger.info("LandingFormController loadForm: " + model.asMap().keySet());       
        return "landing";
    }

}
4

1 回答 1

1

代码正在执行重定向,这会导致放置在模型中的属性丢失。使用 flash 属性将属性传递给下一个控制器。

Flash 属性为一个请求提供了一种方法来存储打算在另一个请求中使用的属性。这在重定向时最常用——例如,Post/Redirect/Get 模式。Flash 属性在重定向之前(通常在会话中)临时保存,以便在重定向之后对请求可用并立即删除。

登录表单控制器

@Controller
@RequestMapping(value="/login")
public class LoginFormController {  

@RequestMapping(method=RequestMethod.POST)
public ModelAndView post(@ModelAttribute User user, BindingResult result,
      SessionStatus status, final RedirectAttributes redirectAttrs) {

    logger.info("post");
    new ReceiptUserValidator().validate(user, result);
    if (result.hasErrors()) {
        return new ModelAndView("login");
    }
    else {
        logger.info("Email Id: " + user.getEmailId());
        //status.setComplete();         

        redirectAttrs.addFlashAttribute("userId", user.getEmailId());
        redirectAttrs.addFlashAttribute("now", new Date().toString());

        return new ModelAndView("redirect:/landing.htm", "model", model);
    }
}

文档

作为替代解决方案,您可以简单地不从控制器执行重定向。

附加检索解决方案。

修改 loadForm

 public String loadForm(@ModelAttribute("user") User user) {
        logger.info("LandingFormController loadForm: " + user.getEmailId());        
        return "landing";
    } 
于 2012-12-19T01:38:09.343 回答