0

Spring3.1.0.RELEASEを使用しています。何らかの理由で、コントローラーでフォームをPOSTし、エラーが発生したときに元の画面に戻ると、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");
    }

何が間違っているので、どうすれば修正できますか?

4

1 に答える 1

1

POSTからアップロード/インデックスビューに戻ると、モデルにデータを入力するコードはGETで実行されるため、モデルにデータが再入力されません。

考えられるオプションの1つは、Controllerクラスで@ModelAttributeアノテーションを使用することです。

たとえば、StandardsUploadItemの場合、次のようなメソッドがあります。

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

次に、GETメソッドから以下の行を削除できます。

model.addAttribute(new StandardsUploadItem());

@ModelAttributeで注釈が付けられ、オブジェクトを返すメソッドは、アクティブ化されているController RequestMappingメソッドに関係なく、自動的にModelMapに配置されるためです。

POSTメソッドのメソッドシグネチャには、次のようなものが含まれます。

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

モデル内の他の属性(gradeList、subjectList)についても同様のことを行う必要がありますが、POSTでは必要ないように思われるため、POSTメソッドのシグネチャにModelパラメーターを追加するなどの方法があります。エラーの場合にModelAndViewを返す前に、そのモデルを再入力します。

于 2012-09-25T23:08:04.617 に答える