@WebServlet Annotation和servlet-mapping的区别

Ste*_*e C 2 web-services web.xml servlets url-pattern

在我的servlet类中,我用以下内容注释了类:

@WebServlet("/OnlinePostListener/testFromAnnotation")
public class OnlinePostListener extends HttpServlet {
   ...
}
Run Code Online (Sandbox Code Playgroud)

我的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>
Run Code Online (Sandbox Code Playgroud)

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

http://localhost:8080/forwardingProxy/OnlinePostListener/testFromAnnotation
Run Code Online (Sandbox Code Playgroud)

但不是:

http://localhost:8080/forwardingProxy/OnlinePostListener/testFromWebXML
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*mas 5

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


KNU*_*KNU 5

这是因为你在后面的例子中使用了错误的url来获取servlet.

使用正确的网址:

http://localhost:8080/forwardingProxy/testFromWebXML
Run Code Online (Sandbox Code Playgroud)

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

在第一种情况下,您指定的servlet的映射URL "/OnlinePostListener/testFromAnnotation"因此http://localhost:8080/forwardingProxy在稍后的情况下将此字符串作为附加URL用于将servlet映射到/testFromWebXML(AND NOT /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>
Run Code Online (Sandbox Code Playgroud)