Используйте часть URL-адреса в качестве аргумента для контроллера в Spring MVC
-
20-09-2019 - |
Вопрос
Например, с URL-адресом
foo.com/bar/99
99 будет доступен непосредственно методу в контроллере в качестве аргумента.Контроллер сопоставлен с /bar
Для всех, кто знаком с ASP.NET MVC или Django, это было бы похоже на маршруты.MapRoute в первом и использование (?P \ d +) в urlpatterns во втором.
Было бы возможно обработать данные в объекте Http Request напрямую, чтобы получить это, но я хотел бы знать, имеет ли Spring MVC встроенную поддержку для этого (в частности, версии 2.5).
Решение
Нет, Spring не поддерживает это из коробки.Однако вы можете сопоставить путь к методу Имя используя @Сопоставление запросов и соответствующим образом настроенный InternalPathMethodNameResolver
:
@Controller
@RequestMapping("/bar/*")
public class MyController {
...
public String do99(HttpServletRequest request) {
...
}
}
Вам нужно будет указать prefix
для InternalPathMethodNameResolver
как "сделать", чтобы вышеприведенное сработало, поскольку имена методов не могут начинаться с цифры.Если бы вы использовали "foo.com/bar/baz" в качестве URL-адреса и вызвали свой метод baz
, никакой дополнительной настройки не потребовалось бы.
Если вы не хотите использовать сопоставление имен методов, получить '99' в качестве параметра так же просто, как получить его из request.getPathInfo()
в вашем методе.
Другие советы
Для всех, кто использует Spring 3, я узнал, что это можно сделать, используя новую аннотацию @PathVairable
Вот пример из http://blog.springsource.com/2009/03/08/rest-in-spring-3-mvc/
@RequestMapping("/hotels/{hotelId}")
public String getHotel(@PathVariable String hotelId, Model model) {
List<Hotel> hotels = hotelService.getHotels();
model.addAttribute("hotels", hotels);
return "hotels";
}