2

コントローラー アクションへのポスト リクエストは、次のような ajax から来ています。

$.post("myurl.htm", { view: $("#selView").val(), 
    val1: "value1", val2: "value2"
});

私には2つのモデルがFooあり、Bar

public class Foo {
   public String val1;
   //getter/setters
}

public class Bar {
   public String val2;
   //getters/setters
}

今、私のコントローラーのアクションは次のようになります。

@RequestMapping(value="/myurl.htm", method=RequestMethod.POST)
public ModelAndView doSomething (
    @RequestParam(value="view", required=true) String view, 
    @RequestParam(value="val1", required=false) String val1, 
    @RequestParam(value="val2", required=false) String val2) {
  Foo foo = new Foo();
  Bar bar = new Bar();
  if (view.equalsIgnoreCase("something"))  
     foo.setVal1(val1);
  else if (view.equalsIgnoreCase("somethingelse"))  
     foo.setVal2(val2);

  fooService.doSomeStuffWithDb(foo);
  barService.doSomeStuffWithDb(bar);

}

質問

  1. それでも、上記のすべてが機能しますが、これを行うためのより良い方法があるはずだと思います...? 投稿リクエストで 10 個のパラメーターを投稿した場合、コントローラー アクションで 10 個のパラメーターを使用できますか?? これではうまくスケーリングできません。

  2. では、春がパラメータをモデル上の関連するゲッター/セッターに自動的にバインドできる方法はありますか?

4

2 に答える 2

1

多くの変数をコントローラーに渡す場合は、オブジェクトを使用してこれらのパラメーターを保持することをお勧めします。このオブジェクトは、データ転送オブジェクト (DTO) と呼ばれることもあります。

次に例を示します。

@RequestMapping(method = RequestMethod.POST, produces = "text/html")
public String create(@Valid Market market, BindingResult bindingResult, Model uiModel, HttpServletRequest httpServletRequest) {
    if (bindingResult.hasErrors()) {
        return "markets/create";
    }

    // store market

    return "redirect:/markets/" + encodeUrlPathSegment(market.getId().toString(), httpServletRequest);
}
于 2012-11-18T16:24:39.213 に答える
1

spring はリクエストパラメータを Map として注入できます:

@RequestMapping(value="/foo", method=RequestMethod.POST)
public ModelAndView doSomething (@RequestParam Model<String, String> params) {
    params.get("val1");
    params.get("val2");
    // ...
}

JavaScript を変更せずに使用してください。これはバージョンほどエレガントではありませんが@ModelAttribute、多くのパラメーターでかなりうまくスケーリングされます。

于 2012-11-18T12:28:35.153 に答える