@WebServlet Annotation和servlet-mapping的区别

时间:2012-07-12 17:52:30

标签: web-services servlets web.xml url-pattern

在我的servlet类中,我使用:

注释了该类
@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>

我的servlet仅在访问URL时响应:

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

但不是:

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

@ WebServlet的注释和servlet-mapping有什么区别? 为什么servlet映射不能用于此URL模式?

2 个答案:

答案 0 :(得分:5)

这是因为你在后一种情况下使用了错误的url来获取servlet。

使用正确的网址:

http://localhost:8080/forwardingProxy/testFromWebXML

错误:您在以后的情况下使用了额外的/ OnlinePostListener。

在第一种情况下,指定servlet的映射URL为"/OnlinePostListener/testFromAnnotation",因此您已使用此字符串作为http://localhost:8080/forwardingProxy BUT的附加URL,稍后您将servlet映射到{{1} (而不是/testFromWebXML)。

但是,如果您坚持使用网址/OnlinePostListener/testFromWebXML来利用web.xml,则应进行以下更改:

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

答案 1 :(得分:3)

因为Servlet规范要求web.xml中定义的映射覆盖而不是添加到注释中定义的映射。原因是如果没有这个,就无法禁用注释中定义的映射。