Почему Tomcat по-разному разрешает контекстный путь для определенных отображений URL? - PullRequest
0 голосов
/ 02 мая 2011

Итак, я пытаюсь написать сервлет, который может обрабатывать отображение URL, например:

domain/context/servlet/resource_id

Раньше, когда я указывал шаблон URL, я просто делал:

/ myServlet

Но для того, что я пытаюсь сделать, я делаю ...

/ myServlet/ *

ПРОБЛЕМА, В КОТОРУЮ Я ВХОДУ :

Я использовал относительный путь (поэтому, только местоположение файла относительно моего WebContentПапка) для моих статических файлов (css / js / etc) теперь, когда я использую отображение /myServlet/*, запросы ко всем статическим файлам теперь обрабатываются myServlet.Итак, в основном статические ресурсы теперь разрешаются в:

domain / context / myServlet /lative_path_I_provide

в отличие от

domain/ context /lative_path_I_provide

Я уверен, что могу исправить это сам, просто создав абсолютный путь для ресурса, а не полагаясь на относительный путь;но мне просто интересно, почему разрешенный путь для статического ресурса изменяется, когда я использую /myServlet/* шаблон URL, а не /myServlet?

РЕДАКТИРОВАТЬ:

Моя папкаструктура выглядит как

WebContent
   |
   |
   |-- debug
         |
         |-- css
              |
              |-- file.css

, и я добавляю их в тег ссылки, например:

<link href="debug/css/file.css" rel="stylesheet" type="text/css">

Ответы [ 2 ]

2 голосов
/ 02 мая 2011

Хорошо, это объясняет.Вы используете относительный URL без информации о пути, что означает, что браузер разрешает его в том же каталоге, что и ресурс, который включает эти URL.Когда ваш сервлет был сопоставлен с /myServlet, он не появился в пути как «каталог», то есть это был последний ресурс, на который ссылаются.

Таким образом, ваш URL-адрес для сервлета имел форму domain/context/myServlet, и поэтому эти относительные URL-адреса также могли бы преобразоваться в domain/context/.

Но теперь, с отображением формы /myServlet/*, сервлет отображается в виде каталога в URL-адресе, что означает, что при переходе к domain/context/myServlet/resource_id относительные URL-адреса преобразуются в тот же каталог, что и resource_id, что domain/context/servlet/.

См. это для более

Исправление может быть одним из следующих:

  1. Использовать относительные URL-адреса относительно корня приложения, т. е. начинающиеся с/.Тем не менее, для этого потребуется указать контекстный путь для вашего приложения в коде, что означает, что вы никогда не сможете просто развернуть его под другим именем без необходимости все менять.Короче говоря, не делайте этого.

  2. Используйте относительные URL-адреса с информацией о пути в виде ../, что приведет к разрешению URL-адресов в каталог на один уровень выше.Это также хрупко и сломается, если кто-то решит сопоставить ресурсы с URL-адресами в форме domain/context/myServlet/secondLevel/resource_id.

  3. Создать относительные URL-адреса, относящиеся к контекстному пути приложения.Вы можете сделать это, установив значения href как request.getContextPath + "/css/files/file.css".Это добавит контекстный путь к началу каждой ссылки href, таким образом, для запроса на domain/context/myServlet/resource_id это станет /context/css/files/file.css и разрешится, как вы ожидаете.

0 голосов
/ 02 мая 2011

Изменился ли ваш фактический URL до и после изменения шаблона URL?то есть вы сейчас вызываете http://domain/context/myServlet/something вместо http://domain/context/myServlet

Если ответ да, то это объясняет, почему статические файлы теперь разрешаются в http://domain/context/myServlet/static_file(По той же причине, по которой все разрешалось относительно контекста в предыдущем URL)

...