2016-03-18 2 views
1

Допустим, у нас есть 3 URL-шаблоны для сервлета имени диспетчеру в web.xml:Spring MVC отображение множественного URL с тем же методом контроллера

<servlet-mapping> 
    <servlet-name>dispatcher</servlet-name> 
    <url-pattern>/aaa/*</url-pattern> 
</servlet-mapping> 
<servlet-mapping> 
    <servlet-name>dispatcher</servlet-name> 
    <url-pattern>/bbb/*</url-pattern> 
</servlet-mapping> 
<servlet-mapping> 
    <servlet-name>dispatcher</servlet-name> 
    <url-pattern>/ccc/*</url-pattern> 
</servlet-mapping> 

и метод контроллера:

@RequestMapping(value = "/xxx", method = RequestMethod.POST) 
public String foo() {} 

Поскольку значение пути в @RequestMapping не содержит пути сервлетов, когда пользователи запрашивают

/aaa/xxx 
/bbb/xxx 
/ccc/xxx 

все запросы будут сопоставляться с методом foo.

Я думаю, что это может вызвать потенциальную проблему, если веб-сайт очень сложный. Является ли это недостатком Spring Web MVC или я что-то неправильно понимаю?

+0

Вы отображены все три пути, к тому же сервлет, называемый "диспетчер". – Stefan

+0

Для тех, кто найдет здесь по googling, я думаю, что ответы на этот вопрос: http://stackoverflow.com/questions/11692837/url-mapping-issue-spring-web-mvc решили мою проблему. – PickBoy

ответ

5

Вы можете сопоставить все запросы с отображением одного запроса, передав несколько значений.

@RequestMapping(value = {"/aaa/xxx", "/bbb/xxx", "/ccc/xxx"}, method = RequestMethod.POST) 
public String foo() {} 

и просто изменить отображение в web.xml для обработки всех типов запроса на dispatcher сервлета.

<servlet-mapping> 
    <servlet-name>dispatcher</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

Вы можете определить различные контроллеры на основе требований приложения или веб-потока. При необходимости вы можете перемещать общую часть кода в служебные классы.

@RequestMapping("/aaa") 
public class AAAController { 
    @RequestMapping(value = "/xxx", method = RequestMethod.POST) 
    public String foo() { 
     // call to common utility function 
    } 
    // other methods 
} 

@RequestMapping("/bbb") 
public class BBBController { 
    @RequestMapping(value = "/xxx", method = RequestMethod.POST) 
    public String foo() { 
     // call to common utility function 
    } 
    // other methods 
} 

@RequestMapping("/ccc") 
public class CCCController { 
    @RequestMapping(value = "/xxx", method = RequestMethod.POST) 
    public String foo() { 
     // call to common utility function 
    } 
    // other methods 
} 

Подробнее весной Web MVC framework documentation

Вы можете настроить его программно, а

public class MyWebApplicationInitializer implements WebApplicationInitializer { 

    @Override 
    public void onStartup(ServletContext container) { 
     ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet()); 
     registration.setLoadOnStartup(1); 
     registration.addMapping("/*"); 
    } 
} 
+1

Спасибо вам за ответ! На самом деле я не хочу, чтобы несколько типов запросов были сопоставлены с одним и тем же методом контроллера. Я думаю, что решение, которое вы упомянули (изменить url-mapping на «/ *»), может решить проблему, но тогда мне интересно, какой смысл url-шаблона в конфигурации сервлета, так как большинство людей будет устанавливать его в «/ *»? – PickBoy

+0

Это обычный вариант использования весеннего веб-приложения, где сервлет «диспетчер» работает как передний сервлет, который несет ответственность за консультирование с отображением обработчика и перенаправление запроса на правильный контроллер. Вам просто нужно настроить отображение обработчиков для разных URL-адресов в отдельном конфигурационном файле весны вместо того, чтобы делать это в 'web.xml'. – Braj

+1

Прочитайте о различных реализациях [handler mapping] (https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/HandlerMapping.html) – Braj