2012-12-19 21 views
3

LoginFormController - >在提交/发布表单后调用Post。最后,它调用另一个名为LandingFormController - > loadForm的Controller。弹簧控制器(A).method调用控制器(B)。方法但找到空的模型

那么,在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"; 
    } 

} 

回答

1

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

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

LoginFormController

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

Documentation

作为一种替代的解决方案,你可以简单地不执行来自控制器的重定向。

添加检索解决方案。

修改loadForm

public String loadForm(@ModelAttribute("user") User user) { 
     logger.info("LandingFormController loadForm: " + user.getEmailId());   
     return "landing"; 
    } 
+0

酷奏效。 –

+0

@java_dude非常好,很高兴我可以帮忙,并可以使用我最近的一些阅读材料来造福他人。好的问题顺便说一句,当你发布所有的代码时,它有很大的帮助。 –

+0

我必须执行重定向才能更改链接,否则链接始终会显示/login.htm。 如果有另一种方式来更新链接,我宁愿不做重定向。 –