0

POST中にSpringがフォームバッキングオブジェクトを処理する方法に苦労しています。htmlフォームに対応する入力タグを持つScreenObjectプロパティは、期待どおりに投稿を存続させます。ただし、プロパティに入力タグがない場合は、次の2つのシナリオが発生します。

  1. プロパティがリクエストパラメータとして渡された場合、そのプロパティはポストを存続します。
  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には次のものがあります。

  1. 入力タグを介してフォームでユーザーから提供されたすべての入力が存在します。問題ない。
  2. hostSiteId(入力タグなし)は、getter urlにパラメーターとして含まれている場合にのみscreenObjectに存在します(たとえば、edit?hostSiteId = 2)
  3. hostSiteSectionId(入力タグなし)は、getter urlにパラメーターとして含まれている場合にのみscreenObjectに存在します(たとえば、edit?hostSiteSectionId = 2)
  4. 対応する入力タグがなく、リクエストパラメータとして渡されない他のすべてのプロパティはnullです。

さらに#4を説明するため。initializeScreenObject()メソッドで設定されるscreenObject.hostSiteNameプロパティがあります。ビューは。で適切にレンダリングされます<td>${screenObject.getHostSiteName()}</td>。次に、[送信コントロールのキャンセル]をクリックします。コントローラが送信を引き継ぐ場合、このプロパティはnullです。

これが予想されるかどうか説明してください。よろしければ、その方法を説明してください。投稿を生き残るために必要なプロパティに非表示のフォームフィールドを追加できると思いましたが、それはちょっとしたハックです。もっと良い答えがあるといいのですが。そして、元のリクエストパラメータはどのようにしてポストオペレーション内でフォーカスされますか?

4

1 に答える 1

1

予想される動作のように聞こえます。POSTハンドラーメソッドに引数として渡されるHostSiteSectionHeaderEditScreenObjectインスタンスは、GETハンドラーメソッドでモデルに配置したインスタンスと同じではありません。デフォルトでは、Springが作成する新しいインスタンスです。Springは、POSTのリクエストに存在するパラメータに基づいて、オブジェクトのフィールドに値をバインドします。したがって、パラメータがPOSTに存在しない場合(たとえば、HTMLフォームに入力を入力しなかったため)、そのフィールドはSpringによって設定されません。そのフィールドは、フィールドのデフォルトの初期値になります。 。

画面オブジェクトにinitializeScreenObject()を適用し、その後にリクエストパラメータ値を適用することが必要なようです。それについてはいくつかの方法があります。1つは、@ModelAttributeで注釈が付けられたコントローラーメソッドを作成することです。

@ModelAttribute("screenObject")
public HostSiteSectionHeaderEditScreenObject initScreenObject(@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);
}

http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-modelattrib-methods

そうすれば、GETハンドラーメソッドを単純化して、ビュー名を返すだけにすることができます。

于 2012-04-06T19:44:11.403 に答える