我正在使用Spring 3.1.0.RELEASE。出于某种原因,在我的控制器中,当我发布表单并在发生错误时返回原始屏幕时,模型属性不会像我通过GET方法调用页面时那样填充。在我的控制器中我有
@Controller
public class StandardsUploadController {
…
@RequestMapping(value = "/upload")
public String getUploadForm(Model model) {
model.addAttribute(new StandardsUploadItem());
model.addAttribute("gradeList", gradeList);
model.addAttribute("subjectList", subjectList);
return "upload/index";
}
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public ModelAndView processFile(final StandardsUploadItem uploadItem,
final BindingResult result,
final HttpServletRequest request,
final HttpServletResponse response) throws InvalidFormatException, CreateException, NamingException {
stdsUploadValidator.validate(uploadItem, result);
if (!result.hasErrors()) {
try {
…
} catch (IOException e) {
LOG.error(e.getMessage(), e);
e.printStackTrace();
}
} // if
return new ModelAndView("upload/index");
}
我做错了什么,如何纠正?
答案 0 :(得分:1)
当您从POST返回上传/索引视图时,它不会重新填充模型,因为填充模型的代码是在GET上完成的。
一个可能的选择是在Controller类中使用@ModelAttribute注释
例如,对于StandardsUploadItem,您将拥有一个类似于此的方法:
@ModelAttribute("uploadItem")
public StandardsUploadItem getStandardsUploadItem(){
return new StandardsUploadItem();
}
然后,您可以从GET方法中删除以下行:
model.addAttribute(new StandardsUploadItem());
由于使用@ModelAttribute注释并返回对象的方法将自动放入ModelMap中,无论激活哪个Controller RequestMapping方法。
POST方法的方法签名将包含以下内容:
..., @ModelAttribute("uploadItem") StandardsUploadItem uploadItem, ...
您需要为模型中的其他属性(gradeList和subjectList)执行类似的操作,但由于您似乎不需要在POST上使用它们,因此可以执行类似向POST方法添加Model参数的操作签名,并在错误情况下返回ModelAndView之前重新填充该Model。