Spring MVC Servlet Mapping, различия между "/ xxx" и "/ xxx / *" - PullRequest
1 голос
/ 02 октября 2019

Я запутался в том, как работает сопоставление URL-шаблонов Spring MVC.

Когда вернется 'getServletMappings' / ", Я могу получить правильный ответ с помощью" http://localhost:8080/hello".

, но неработает, если я изменяю его на "/ app" и меняю URL на "http://localhost:8080/app/hello",, он возвращает ошибку 404.

Я что-то неправильно понимаю, я также нахожу, что" / app / * "может работать (я могу это понять), но почему я не могу "/ app"?

Пожалуйста, проверьте мой код:

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected String[] getServletMappings() {
        // works with http://localhost:8080/hello
        return new String[] {
                "/"
        };
        // NOT working with http://localhost:8080/app/hello
        // return new String[] {
        //      "/app"
        //};
    }
}



@RestController
public class HTTPMethodsController {
   @RequestMapping("/hello")
   public String hello() {
       return "Hello SpringMVC.";
   }
}

1 Ответ

1 голос
/ 03 октября 2019

В соответствии с главой 12.2 спецификации сервлета отображение сервлетов должно использовать следующий синтаксис:

  • Строка, начинающаяся с символа '/' и заканчивающаясяс суффиксом '/ *' используется для отображения пути.
  • Строка, начинающаяся с '*.'префикс используется в качестве сопоставления расширения.
  • Пустая строка ("") - это специальный шаблон URL, который точно отображается в корень контекста приложения, т. е. запросы корня контекста приложения формы, т. е. запросыform http://host:port//. В этом случае информация о пути - '/', а путь сервлета и путь контекста - пустая строка (““).
  • Строка, содержащая только символ '/', указывает на "по умолчанию »сервлет приложения. В этом случае путь сервлета является URI запроса минус путь контекста, а информация о пути равна нулю.
  • Все остальные строки используются только для точных совпадений.

ПоэтомуПри сопоставлении DispatcherServlet с URL "/app" контейнер сервлета направляет запросы к нему только при точном совпадении, то есть только в том случае, если вы измените свой URL-адрес на «http://localhost:8080/app"., который не оставляет места длядобавление дополнительного пути к целевым конкретным контроллерам Spring (чтобы быть более точным: вы можете использовать метод контроллера hello(), если сопоставите его с @RequestMapping("/app"), потому что DispatcherServlet возвращается к поиску по всему URL, но практически это не то, чтовы хотите).

Таким образом, отображение "/ app / *" является правильным, или вы также можете сопоставить его как сервлет по умолчанию с "/", как вы заметили.

...