2012-09-25 47 views
0

我使用Spring 3.1.0.RELEASE。出于某种原因,在我的控制器中,当我POST表单并在发生错误时返回原始屏幕时,模型属性没有像我通过GET方法调用页面时那样获得填充。在我的控制器中我有为什么我的Spring模型不能使用正确的属性填充?

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

我在做什么错,我该如何纠正它?

回答

1

当您返回从POST上传/索引视图,它没有重新填充模式,因为你的代码来填充模型上得到完成。

一个潜在的选择是使用@ModelAttribute标注在控制器类

你会的,例如,像这样的StandardsUploadItem的方法:

@ModelAttribute("uploadItem") 
public StandardsUploadItem getStandardsUploadItem(){ 
    return new StandardsUploadItem(); 
} 

然后,您可以删除从您的GET方法下面的行:

model.addAttribute(new StandardsUploadItem()); 

由于使用@ModelAttribute注释并返回对象的方法将自动无论控制器的RequestMapping方法是否被激活,都可以放在ModelMap中。

的POST方法你的方法签名会包含这样的事情:

..., @ModelAttribute("uploadItem") StandardsUploadItem uploadItem, ... 

你需要做其他属性类似的东西在你的模型(gradeList和subjectList),但是因为你不似乎在POST上需要它们,您可以执行一些操作,例如将Model参数添加到POST方法签名中,然后在错误情况下返回ModelAndView之前重新填充该Model。

相关问题