POST中にSpringがフォームバッキングオブジェクトを処理する方法に苦労しています。htmlフォームに対応する入力タグを持つScreenObjectプロパティは、期待どおりに投稿を存続させます。ただし、プロパティに入力タグがない場合は、次の2つのシナリオが発生します。
- プロパティがリクエストパラメータとして渡された場合、そのプロパティはポストを存続します。
- プロパティがリクエストパラメータとして渡されない場合、ポストは存続しません。
これが私のコードです。
画面オブジェクト
private Integer hostSiteSectionId; // no input tag but survives if passed as a request param
private String name; // input tag so survives
private String orderFactor; // input tag so survives
private Integer hostSiteId; // no input tag but survives if passed as a request param
private String hostSiteName; // no input tag and not passed as request param so does not survive
得る
@RequestMapping(method=RequestMethod.GET)
public ModelAndView edit(@RequestParam(value="hostSiteId", required=false) Integer hostSiteId, @RequestParam(value="hostSiteSectionId", required=false) Integer hostSiteSectionId, Locale locale) {
HostSiteSectionHeaderEditScreenObject screenObject=new HostSiteSectionHeaderEditScreenObject();
initializeScreenObject(hostSiteId, hostSiteSectionId, screenObject, locale, true);
ModelAndView modelAndView=new ModelAndView();
modelAndView.addObject("screenObject", screenObject);
modelAndView.setViewName(WebView.HOST_SITE_SECTION_HEADER_EDIT_PAGE.getViewName());
return modelAndView;
}
キャンセルして投稿
@RequestMapping(method=RequestMethod.POST, params="cancel")
public String cancel(@ModelAttribute("screenObject") HostSiteSectionHeaderEditScreenObject screenObject) {
// logic that returns redirect
}
私のinitializeScreenObject()メソッドは、screenObjectのプロパティのみを設定します。モデルでは動作しません。どのように干渉するかわからないので、基本的なコードは投稿していません。
この投稿内で、他の投稿でも同じように機能しますが、screenObjectには次のものがあります。
- 入力タグを介してフォームでユーザーから提供されたすべての入力が存在します。問題ない。
- hostSiteId(入力タグなし)は、getter urlにパラメーターとして含まれている場合にのみscreenObjectに存在します(たとえば、edit?hostSiteId = 2)
- hostSiteSectionId(入力タグなし)は、getter urlにパラメーターとして含まれている場合にのみscreenObjectに存在します(たとえば、edit?hostSiteSectionId = 2)
- 対応する入力タグがなく、リクエストパラメータとして渡されない他のすべてのプロパティはnullです。
さらに#4を説明するため。initializeScreenObject()メソッドで設定されるscreenObject.hostSiteNameプロパティがあります。ビューは。で適切にレンダリングされます<td>${screenObject.getHostSiteName()}</td>
。次に、[送信コントロールのキャンセル]をクリックします。コントローラが送信を引き継ぐ場合、このプロパティはnullです。
これが予想されるかどうか説明してください。よろしければ、その方法を説明してください。投稿を生き残るために必要なプロパティに非表示のフォームフィールドを追加できると思いましたが、それはちょっとしたハックです。もっと良い答えがあるといいのですが。そして、元のリクエストパラメータはどのようにしてポストオペレーション内でフォーカスされますか?