Использование Spring'sReReestMapping с подстановочными знаками - PullRequest
9 голосов
/ 10 мая 2011

Это похоже на этот вопрос , но я все еще не совсем понимаю свою ситуацию.Я хочу сопоставить этот шаблон в стиле муравья с методом контроллера:

/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, бот НЕ /results/123/abc/.Правильно?

Ответы [ 2 ]

6 голосов
/ 10 мая 2011

Возможно, в вашем отображении сервлета вы захотите направить весь трафик на '/ *'. Таким образом, вы можете различить в вашем контроллере, какой метод использовать с различными @ 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, я не думаю, что вы можете использовать сопоставители шаблонов 'ant-style' (в частности, **) в вашем дескрипторе домена web.xml.

5 голосов
/ 10 мая 2011

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

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

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

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

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

...