@WebServlet Различия в аннотациях и отображении сервлетов

В моем классе сервлета я аннотировал класс следующим образом:

@WebServlet("/OnlinePostListener/testFromAnnotation")
public class OnlinePostListener extends HttpServlet {
   ...
}

Мой web.xml содержит следующее:

<servlet>
    <description>
    </description>
    <display-name>OnlinePostListener</display-name>
    <servlet-name>OnlinePostListener</servlet-name>
    <servlet-class>com.me.forwardingProxy.OnlinePostListener</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>OnlinePostListener</servlet-name>
    <url-pattern>/testFromWebXML</url-pattern>
</servlet-mapping>

Мой сервлет отвечает только при доступе к URL-адресу:

http://localhost:8080/forwardingProxy/OnlinePostListener/testFromAnnotation

но нет:

http://localhost:8080/forwardingProxy/OnlinePostListener/testFromWebXML

В чем разница между аннотацией @WebServlet и отображением сервлетов? Почему отображение сервлета не работает для этого шаблона URL?


person Steve C    schedule 12.07.2012    source источник


Ответы (2)


Поскольку спецификация сервлета требует, чтобы сопоставления, определенные в web.xml, переопределяли, а не добавляли к сопоставлениям, определенным в аннотациях. Причина в том, что без этого невозможно было бы отключить сопоставление, определенное в аннотации.

person Mark Thomas    schedule 12.07.2012
comment
Я понимаю, что всегда должно быть отображение сервлетов из-за спецификации. Однако URL-адрес, который я включил в отображение сервлета, просто не работает, а аннотация работает. - person Steve C; 12.07.2012
comment
Извините, неправильно прочитал вопрос. Второй URL-адрес, который вы цитируете, не соответствует тому, что находится в web.xml. Вам не хватает /OnlinePostListener в шаблоне URL. - person Mark Thomas; 12.07.2012
comment
Прочитав ответ, я тоже счел его неудовлетворительным. не прочитал комментарий, прежде чем опубликовать свой собственный ответ. - person KNU; 05.11.2014

Это потому, что вы используете неправильный URL-адрес для получения сервлета в последнем случае.

Используйте правильный URL:

http://localhost:8080/forwardingProxy/testFromWebXML

ОШИБКА: вы использовали дополнительный /OnlinePostListener в более позднем случае.

В первом случае сопоставленный URL-адрес для указанного сервлета равен "/OnlinePostListener/testFromAnnotation", поэтому вы использовали эту строку в качестве добавления URL-адреса к http://localhost:8080/forwardingProxy, НО в последнем случае вы сопоставили сервлет с /testFromWebXML (А НЕ /OnlinePostListener/testFromWebXML).

Однако, если вы настаиваете на использовании URL-адреса http://localhost:8080/forwardingProxy/OnlinePostListener/testFromWebXML для использования web.xml, вам следует внести следующие изменения:

<servlet-mapping>
    <servlet-name>OnlinePostListener</servlet-name>
    <url-pattern>/OnlinePostListener/testFromWebXML</url-pattern>
</servlet-mapping>
person KNU    schedule 05.11.2014