Думаю, я знаю, что происходит.
В вашем рабочем web.xml вы установили свой сервлет в качестве сервлета по умолчанию (/ сам по себе является сервлетом по умолчанию, вызываемым, если нет других совпадений), он ответит на любой запрос, который не соответствует другому сопоставлению.
В Failed 1 ваше / * отображение действительно является допустимым отображением пути. С помощью сопоставления / * в web.xml он отвечает на все запросы, кроме других сопоставлений путей. Согласно спецификации отображения расширения являются неявными отображениями, которые перезаписываются явными отображениями. Вот почему сопоставление расширений не удалось. Все было явно сопоставлено с приложением.
В Failed 2 приложение отвечает за все, кроме контента, который соответствует статическому сопоставлению контента. Чтобы показать, что происходит в быстром тесте, я настроил. Вот пример. /some-static-content-folder/
содержит test.png
Попытка доступа к test.png Я попытался:
/some-static-content-folder/test.png
и файл не найден. Однако пытаясь
/some-static-content-folder/some-static-content-folder/test.png
это подходит. Поэтому кажется, что сервлет Tomcat по умолчанию (по крайней мере, 6.0.16) отбрасывает отображение сервлета и пытается найти файл, используя оставшийся путь. Согласно этому сообщению Servlet для обслуживания статического контента Jetty показывает поведение, которое вы и я ожидали.
По какой-то причине вы не можете сделать что-то вроде сопоставления корневого каталога для ваших остальных вызовов? Что-то вроде приложения, сопоставленного с / rest_root / *, чем вы несете ответственность за все, что происходит в папке rest_root, но в любом другом месте должен обрабатываться Tomcat, если вы не сделаете другое явное сопоставление. Я предлагаю настроить ваш оставшийся сервлет на отображение пути, потому что оно объявляет намерение лучше. Использование / или / * не представляется целесообразным, так как вы должны отобразить исключения. Используя SO в качестве примера, мои остальные сопоставления будут выглядеть примерно так:
/ users / * для пользовательского сервлета
/ posts / * для сервлета сообщений
Порядок отображения
- Явный (отображение пути)
- Неявный (сопоставления расширений)
- По умолчанию (/)
Пожалуйста, исправьте все, что я ошибся.