表面的には、この質問は SOF で以前に尋ねられた可能性のある質問によく似ていますが、私はずっと前にそれらの回答を試しましたが、うまくいきませんでした。
(たとえば、この質問の春 3 は jsp でモデルをレンダリングしていません)
そのため、CancellableFormController を拡張する Spring 2.0 コントローラーがあり、コマンド オブジェクトを JSP ページ レンダーのフォームにバインドするための次のものが含まれていました。
public class MyFormController extends CancellableFormController {
....
protected Object formBackingObject(HttpServletRequest request) throws ServletException {
MyCommand myCommand = new MyCommand();
... // add some list info to command object etc in preparation for page render
return myCommand;
}
....
}
JSP ページは次のようになります。
<form:form method="post" commandName="myCommand">
<c:forEach items="${myCommand.myList}" var="myItem" varStatus="index">
</form:form>
明確にするために、フォーム タグ定義の間に、項目のリストが JSP ページに表示されました。これは、フォーム送信が発生する前 (つまり、ページのレンダリング時) です。そして、私たちが住んでいたなんて美しくシンプルな世界でしょうか。すべてが初めて機能し、地球上に平和がありました...すみません、十分な皮肉です! ;)
よし、この古いコードをSpring 3と注釈にアップグレードしようと喜んで試みた。私の現在の問題は、ページの読み込み時に Command オブジェクトをレンダリングすることだけです。フォーム フィールドにデータを入力してフォームなどを送信すると、データが正しくバインドされます。私がやろうとしているのは、Command オブジェクトを事前に入力し、そのコンテンツをフォームに入力して送信する前に JSP ページにレンダリングすることです。
私は最初にこれを試しました:
@Controller
@RequestMapping(value = "/myContextPath")
public class MyFormController {
...
@RequestMapping(method = RequestMethod.GET)
public ModelAndView initForm(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView("myTilesViewName");
MyCommand myCommand = new MyCommand();
...
mv.addObject("myCommand", myCommand);
return mv;
}
...
}
次に、次の各方法を試しました (Controller クラスの構成は上記と同じです)。
@RequestMapping(method = RequestMethod.GET)
@ModelAttribute("myCommand")
public String initForm(HttpServletRequest request, HttpServletResponse response) throws Exception {
MyCommand myCommand = new MyCommand();
....
return "myTilesViewName";
}
@RequestMapping(method = RequestMethod.GET)
public String initForm(ModelMap model, HttpServletRequest request, HttpServletResponse response) throws Exception {
MyCommand myCommand = new MyCommand();
...
model.addAttribute("myCommand", cmd);
return "myTilesViewName";
}
混乱を加えたくありません。JSP ページのビュー名を返すだけの場合、この問題に対する答えはおそらく同じであると「想像」します...ただし、ページの選択を処理するために Apache Tiles を使用しています。私の定義は次のようになります。
<definition name="myTilesViewName" extends=".myTemplate">
<put-attribute name="title" value="MyTitle" type="string" />
<put-attribute name="body" value="/WEB-INF/jsp/myPage.jsp" />
</definition>
以前は Spring 2 の CancellableFormController コードですべてが完全に機能していたことを思い出してください。Tiles 構成または JSP ページをまったく変更していないので、それらがこの問題の原因であるとは考えていません。
援助を提供できる人に感謝します。それは確かに高く評価されています!
アップデート:
この問題は最終的に、クライアント側 (JSP ページ) 関連の問題に関連しています。「コントローラー以外は何も変わっていない」という私の仮定は間違っていました。この投稿を読んで解決策を検討するのに時間がかかった方々には、心からお詫び申し上げます。同じ症状で読んでいる人は、ビュー ページ (JSP) を再確認し、それらがレンダリングに対して構文的に正しいことを確認してください。私の場合、JSP (約 2000 行のコード) をサブフォルダーに移動し、ネストされた jsp インポート宣言への相対リンクを解除しました。