【问题标题】:How can spring MVC controller ation bind to multiple models on an ajax requestspring MVC控制器如何在ajax请求上绑定到多个模型
【发布时间】:2012-11-06 13:24:45
【问题描述】:

对我的控制器操作的发布请求来自 ajax,如下所示:

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

我有两个模型FooBar

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. 那么,spring 有没有一种方法可以自动将参数绑定到模型上相关的 getter/setter?

【问题讨论】:

标签: java spring spring-mvc


【解决方案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 版本那么优雅,但可以通过很多参数很好地扩展。

【讨论】:

  • 嗯,我正在尝试您建议的第一种方法,但收到 400 错误。 Bad request。我会再次确保一切
  • 对不起,我把 RequestParam 和 ModelAttribute 弄混了...请再试一次
  • @ModelAttribute 不会抛出 400 错误但是这些值没有绑定到模型。请注意,就我而言,我根本没有使用RequestMethod.GET。参数只是通过ajax发布。我也会再次回顾我的观点
  • 即使控制器内部的req.getQueryString() 也没有输出任何内容,这是一个问题。谢谢你的帮助。我再看看……
  • @Omnipresent 嗯,我的代码依赖于 RequestMethod.GET... 但我有第三个建议 :)
【解决方案2】:

如果您将许多变量传递给控制器​​,最好开始使用一个对象来保存这些参数。此对象有时称为数据传输对象 (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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 2017-03-22
    • 2016-05-06
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多