2016-09-08 7 views
-1

Есть 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 контроллеры имеют тот же "/" новое действие.

Теперь со страницы JSP Я хочу, чтобы предназначаться ссылкой на «/» новое действие второго контроллера: <a href="<c:url value='/new' />"><img src="resources/images/plus.png" /></a>

Этого письмо является неоднозначным, потому что весна не знает, в какой контроллер смотреть! Итак, как указать имя контроллера в целевой ссылке?

+1

Вы не можете иметь 2 контроллеры на одном и том же адресе. Картирование URL должно быть другим. –

+0

Объявите один контроллер и используйте, если else условие, что будет лучше подход. –

ответ

2

Невозможно иметь два или более метода контроллера с тем же @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' />"> для второго

-2

Вам необходимо сузить запрос, используя опцию «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(), и когда вы получаете доступ/извлекаете? Id = 300, принимается статус HTTP 404. В этом случае параметр «id» - это еще один параметр, который вы используете, чтобы сузить запрос до вашего предпочтительного метода в контроллере.

+0

Что делать, если есть тысячи возможных значений параметра?! – pheromix

+0

Что вы имеете в виду? Вы можете указать столько параметров, сколько хотите – george

+0

это нецелесообразно! поэтому я должен реализовать тысячи методов!? – pheromix