Путь сервлета "/" возвращает содержимое сервлета для любого шаблона запроса

Когда я сопоставляю сервлет с путем как:

<servlet>
    <servlet-name>Home1Servlet</servlet-name>
    <servlet-class>com.project.servlets.Home1Servlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Home1Servlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

И тогда, когда я запрашиваю сервлет из браузера по любому пути, как:

http://localhost:8084/project/
http://localhost:8084/project/asd
http://localhost:8084/project/why
http://localhost:8084/project/hell

Все эти запросы возвращают один и тот же контент Home1Servlet. Зачем?

Как сопоставить сервлет только с путем "/"?

Я использую Apache Tomcat 6.0.26, Java EE 5. Путь к контексту: /project

2 ответа

Решение

Если вы хотите отобразить сервлет ТОЛЬКО на корневой URL, используйте пустое отображение:

<url-pattern></url-pattern>

Это описано в спецификации сервлета 12.2:

Пустая строка ("") - это специальный шаблон URL, который точно соответствует корневому контексту приложения, то есть запросам узла host: port //. В этом случае информация о пути - это /, а путь сервлета и путь контекста - пустая строка ("").

Ваше отображение URL сервлета пусто.

<url-mapping>/</url-mapping>

Так что этот URL

http://localhost:8084/project/<any_url_given>

не указывает на какой-либо конкретный класс сервлетов, скорее он сообщает вам любой шаблон URL, который он принимает, например http::/.

Если ваше отображение сервлета будет как

<servlet>
    <servlet-name>hell</servlet-name>
    <servlet-class>com.project.servlets.Hell</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>hell</servlet-name>
    <url-pattern>/hell</url-pattern>
</servlet-mapping>

и если вы введете URL

http://localhost:8084/project/hell

затем com.project.servlets.Hell сервлет должен быть вызван.

Другие вопросы по тегам