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 属性は、あるリクエストが別のリクエストで使用するための属性を格納する方法を提供します。これは、たとえば、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);
    }
}

ドキュメンテーション

別の解決策として、コントローラーからリダイレクトを実行することはできません。

ソリューションの取得を追加します。

ロードフォームを変更する

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