【问题标题】:How to specify the controller name if two controllers have same RequestMapping path value?如果两个控制器具有相同的 RequestMapping 路径值,如何指定控制器名称?
【发布时间】:2016-09-08 08:49:26
【问题描述】:

有 2 个控制器具有相同的 @RequestMapping 值:

package com.ambre.hib.controller;
@Controller
public class AppointmentsController {
    @RequestMapping(value = "/new", method = RequestMethod.GET)
    public AppointmentForm getNewForm() {
        return new AppointmentForm();
    }
}

package com.ambre.hib.controller;
@Controller
public class ClientsController {
    @RequestMapping(value = "/new", method = RequestMethod.GET)
    public ClientForm getNewForm() {
        return new ClientForm();
    }
}

所以 2 个控制器具有相同的“/new”操作。

现在,我想从一个 jsp 页面定位到第二个控制器的“/new”操作的链接:<a href="<c:url value='/new' />"><img src="resources/images/plus.png" /></a>

这篇文章含糊不清,因为 Spring 不知道要查看哪个控制器!那么如何在链接目标中指定控制器名称呢?

【问题讨论】:

  • 你不能在同一个 url 上有 2 个控制器。 url 映射必须不同。
  • 声明一个控制器并使用 if else 条件,这将是更好的方法。

标签: spring jsp jstl jsp-tags spring-4


【解决方案1】:

不可能有两个或多个具有相同@RequestMapping 的控制器方法。调度员不知道调用哪个方法。

您可以为每个控制器设置一个基本请求映射:

package com.ambre.hib.controller;
@Controller
@RequestMapping("/appointments")
public class AppointmentsController {
    @RequestMapping(value = "/new", method = RequestMethod.GET)
    public AppointmentForm getNewForm() {
        return new AppointmentForm();
    }
}

package com.ambre.hib.controller;
@Controller
@RequestMapping("/clients")
public class ClientsController {
    @RequestMapping(value = "/new", method = RequestMethod.GET)
    public ClientForm getNewForm() {
        return new ClientForm();
    }
}

如果是这样,调用 each 的方式将是 <a href="<c:url value='/appointments/new' />"> 对于第一个控制器和 <a href="<c:url value='/clients/new' />"> 第二次

【讨论】:

    【解决方案2】:

    您需要使用“参数”选项缩小请求范围。例如

    @Controller
    public class HelloWorldController {
        @RequestMapping(value="/fetch", params = {"id=100"})
        public String getInfo1(@RequestParam("id") String id) {
            System.out.println("Inside getInfo1");
            return "success";
        }
        @RequestMapping(value="/fetch", params = {"id=200"})
        public String getInfo2(@RequestParam("id") String id) {
            System.out.println("Inside getInfo2");
            return "success";
        }
    }   
    

    当您访问 URL /fetch?id=100 时,会调用方法 getInfo1()。当您访问 URL /fetch?id=200 时,方法 getInfo2() 被调用,当您访问 /fetch?id=300 时,收到 HTTP 状态 404。在这种情况下,“id”参数只是另一个参数,用于将请求缩小到控制器中的首选方法。

    【讨论】:

    • 如果参数有数千个可能的值怎么办?!
    • 这不实用!所以我必须实现数千种方法!?
    • 如果我只使用 /fetch 访问 url 而不传递任何参数怎么办?
    • @VimalBera 显然行不通!这就是为什么您需要使用参数来缩小请求集的范围
    • 理想情况下,参数应该用于传递任何数据,而不是区分控制器模式。这就是我的建议。
    猜你喜欢
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 2015-03-12
    • 2017-03-08
    • 2013-06-14
    相关资源
    最近更新 更多