2011-05-10 6 views
9

Это похоже на this question, но я все еще смущен о своей ситуации. Я хочу, чтобы отобразить этот шаблон муравой стиле к способу контроллера:Использование Spring @RequestMapping с подстановочными знаками

/results/** 

То есть, я хочу любой URL, как www.hostname.com/MyServlet/results/123/abc/456/def/ идти к этому методу. У меня есть:

<servlet-mapping> 
    <servlet-name>MyServlet</servlet-name> 
    <url-pattern>/results/*</url-pattern> 
</servlet-mapping> 

и:

@RequestMapping(value="/**", method=RequestMethod.GET) 
public ModelAndView handleRequest() {...} 

Это работает, чтобы направлять запрос на мой метод, но приводит меня к нескольким вопросам:

  1. Что делать, если я добавляю другое отображение сервлета, например <url-pattern>/another-mapping/*</url-pattern> ??? Он также будет сопоставлен с этим методом! Как я могу отделить эти два?
  2. Почему шаблон url /results/* работает, тогда как /results/** нет? Согласно стилям пути муравья, ** означает включение вложенных / символов, тогда как * останавливается на следующем /. Таким образом, он должен только успешно сопоставить URL-адрес, например /results/123, бот NOT /results/123/abc/. Правильно?
+0

Только что начал щедрость на этом. Посмотрите на мои комментарии в первом ответе ... –

ответ

5

Что делать, если я добавляю другое отображение сервлетов, например/another-mapping/* ??? Он также будет сопоставлен с этим методом! Как я могу отделить эти два?

С вашей текущей конфигурацией вы не можете. Если вы хотите нанести на карту DispatcherServlet несколько шаблонов URL и провести их различие, вы можете объявить DefaultAnnotationHandlerMapping с помощью alwaysUseFullPath = "true" и использовать полный путь в @RequestMapping.

В качестве альтернативы, вы можете отобразить DispatcherServlet как <url-pattern>/*</url-pattern> и использовать полный путь в @RequestMapping без перенастройки DefaultAnnotationHandlerMapping. Хотя в этом случае вам понадобится configre exclusions for static content.

Почему url-шаблон/результаты/* работают, тогда как/results/** нет? Согласно стилям пути ant, ** означает включение вложенных/символов, тогда как * останавливается на следующем /. Таким образом, он должен только успешно отображать URL-адрес, например/results/123, bot NOT/results/123/abc /. Правильно?

URL модели в web.xml не узоры муравей стиле, так что только .../* и *.xxx допускается использование шаблонов в них.

+0

Итак, я добавил к моему компоненту DefaultAnnotationHandlerMapping. Каким должно быть значение @RequestMapping? Извините, я новичок в этом ... –

+0

@Tony: Это должно быть '/ results/**'. – axtavt

+0

Хорошо, я пробовал это, и я получаю: «Не найдено подходящего метода обработчика для запроса сервлета: path '/ abc/123'" –

6

Возможно, в вашем сервлет-сопоставлении вы хотите направить весь трафик на '/ *'. Таким образом, вы можете различить в своем контроллере, какой метод использовать с разными параметрами @ RequestMapping.

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

и

@RequestMapping(value="/results/**", method=RequestMethod.GET) 
public ModelAndView handleResults() {...} 

@RequestMapping(value="/another-mapping/**", method=RequestMethod.GET) 
public ModelAndView handleAnotherMapping() {...} 

Будем надеяться, что выше, поможет с номером 1. Что касается числа 2, то я не думаю, что вы можете использовать «муравей стиле» модель matchers (в частности **) в вашем дескрипторе домена web.xml.

+0

Хм, хорошо, мне показалось, что я читал, что он использует Ant-стиль, но я предполагаю, что ошибаюсь. Так/* соответствует вложенному/abc/123/....... –

Смежные вопросы