Путь сервлета "/" возвращает содержимое сервлета для любого шаблона запроса
Когда я сопоставляю сервлет с путем как:
<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
сервлет должен быть вызван.