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

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

<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


person nullptr    schedule 28.10.2014    source источник
comment
Ответ на вопрос "почему" содержится здесь   -  person fracz    schedule 28.10.2014
comment
вам нужно подробнее рассказать о другом сервлете, который у вас есть. Ожидание неясное.   -  person Juned Ahsan    schedule 28.10.2014
comment
Отметьте stackoverflow.com/questions/1030302/   -  person Daniel    schedule 28.10.2014
comment
@ Дэниел, спасибо, это отвечает на мой вопрос.   -  person nullptr    schedule 28.10.2014
comment
Связано: разница между / и / * в сопоставлении сервлетов.   -  person BalusC    schedule 11.05.2016


Ответы (2)


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

<url-pattern></url-pattern>

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

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

person Jakub Kubrynski    schedule 28.10.2014
comment
спасибо, это отвечает на мой вопрос. Спасибо за помощь. - person nullptr; 28.10.2014

Отображение 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.

person Ataur Rahman Munna    schedule 11.05.2016