在Spring控制器中,我可以根据请求参数的数量调用一个方法吗?

时间:2011-04-21 19:44:59

标签: spring servlets spring-mvc

我一直在用Spring改造现有的webapp。显然,从Spring开始比在以后添加它更容易。

我们有可以接受多个请求参数的servlet。根据参数的数量,将采取不同的行动。例如,

/doSomething?prod=15

显示产品15和

的信息
/doSomething?prod=15&owner=99

将产品15的所有者设置为99和

/doSomething?prod=15&delete=y

删除产品15。

我有一个控制器工作,但我不知道如何根据参数的数量调用不同的方法。例如,这是有效的(琐碎的方法只是为了确保我的基础工作):

@RequestMapping(method=RequestMethod.GET)
public ModelAndView doIt(@RequestParam("prod") int prod, Model model)
{
  ModelAndView mav = new ModelAndView();
  mav.setViewName("jsonView");
  return mav;
}

但不是这样:

@RequestMapping(method=RequestMethod.GET)
public ModelAndView doIt(@RequestParam("prod") int prod, Model model)
{
  ModelAndView mav = new ModelAndView();
  mav.setViewName("jsonView");
  return mav;
}

@RequestMapping(method=RequestMethod.GET)
public ModelAndView doIt(@RequestParam("prod") int prod,
                         @RequestParam("owner") int owner,
                         Model model)
{
  ModelAndView mav = new ModelAndView();
  mav.setViewName("jsonView");
  return mav;
}

抛出IllegalStateException,“为HTTP路径'/ mytest'映射的不明确的处理程序方法”并继续说明:

  

如果您打算处理相同的路径   在多种方法中,然后考虑它们   进入专用的处理程序类   将该路径映射到该类型   水平!

我不明白那条消息告诉我要做什么。

如果我设置接受更多或不同参数的方法,那么我得到“客户端发送的请求在语法上是不正确的()”。

2 个答案:

答案 0 :(得分:21)

RequestMapping注释告诉Spring哪些URL请求映射到控制器。您可以将值放在方法级别或类级别。

在您的示例中,两个请求映射之间没有任何区别。但是你可以这样做:

@RequestMapping(value="/bar/example.htm", method={RequestMethod.GET}, params={"prod", "owner"})
public String doIt( @RequestParam("prod") int prod,
                    @RequestParam("owner") int owner) {
    LOGGER.trace("in doIt(int,int)");
    return "foo/bar";
}
@RequestMapping(value="/bar/example.htm", method={RequestMethod.GET}, params={"prod"})
public String doIt( @RequestParam("prod") int prod) {
    LOGGER.trace("in doIt(int)");
    return "foo/bar";
}

如果需要,您甚至可以在它们之间共享模型:

@Model
public static Map<String,Object> model() {
  LOGGER.trace("in model()");
  Map<String,Object> model = new HashMap<>();
  model.put("hello", "hello world");
  return model;
}

答案 1 :(得分:4)

您的请求映射需要映射实际的URL而不是HTTP方法。你也可以在每个方法的基础上输入所需的参数...

@RequestMapping(value="/doSomething", method=RequestMethod.GET, params=["prod", "owner"])
public ModelAndView doIt(@RequestParam("prod") int prod,
                         @RequestParam("owner") int owner,
                         Model model)
{
  ModelAndView mav = new ModelAndView();
  mav.setViewName("jsonView");
  return mav;
}