对我的控制器操作的post请求来自这样的ajax:
$.post("myurl.htm", { view: $("#selView").val(),
val1: "value1", val2: "value2"
});
我有两个模型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);
}
问题
尽管如此,我认为应该有更好的方法来做到这一点......?如果我在我的帖子请求中发布了10个参数,我的控制器操作中会有10个参数吗?这不会很好地扩展。
那么,有没有一种方法可以将参数自动绑定到模型上相关的getter / setter?
答案 0 :(得分: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
版本那么优雅,但可以通过大量参数进行预测。
答案 1 :(得分: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);
}