如果两个控制器具有相同的 RequestMapping 路径值,如何指定控制器名称?

How to specify the controller name if two controllers have same RequestMapping path value?

有 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();
    }
}

因此这两个控制器具有相同的“/new”操作。

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

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

您需要使用 "params" 选项缩小请求范围。例如

@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" 参数只是另一个参数,您可以使用它来缩小对控制器中首选方法的请求范围。

不可能有两个或更多控制器方法具有相同的@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();
    }
}

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