繁体   English   中英

Tomcat:Servlet映射与WebServlet批注

[英]Tomcat: Servlet Mapping vs. WebServlet Annotation

servlet映射有两种方法。 第一个是在web.xml中:

<servlet>
   <servlet-name>foo</servlet-name>
   <servlet-class>com.whatever.foo</servlet-class>
</servlet>
<servlet-mapping>
   <servlet-name>foo</servlet-name>
   <url-pattern>/foo</url-pattern>
</servlet-mapping>

第二种方法使用WebServlet批注:

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

哪一个更好 第一种和第二种方式的优势在哪里?

如果您确定使用的是Tomcat 7或更高版本 ,则必须将webapp的web.xml声明为符合Servlet 3.0规范,以便让Tomcat扫描并处理注释。 否则,Tomcat仍将以与web.xml的Servlet版本匹配的后备模式运行。 Servlet API注释的支持仅在Servlet 3.0(Tomcat 7)中添加。

因此, web.xml的根声明必须如下所示(确保从web.xml删除任何DOCTYPE ,否则它仍将被解释为Servlet 2.3!)。

<web-app 
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">

此外,URL模式存在细微差别。 URL模式/notifications将使servlet仅在该路径上侦听请求。 它没有使用/notifications/list等额外路径启动请求。 URL模式/notifications/*将让servlet监听具有额外路径信息的请求。

因此,最小的@WebServlet注释应如下所示

@WebServlet("/notifications/*")

其余属性是可选的,因此不一定要使servlet平等运行。

对于servlet 3.x,使用基于java的配置而不是web.xml有什么好处? 它避免重复自己,并通过这样做犯错误。 例如,servlet类是com.foo.bar.SomeServlet 使用web.xml ,您不得不在web.xml重新输入此类:

<servlet-class>com.foo.bar.Someservlet</servlet-class>

但是等等,你做了一个拼写错误,你只会在运行时发现它。

或者您重命名了一个servlet类,但是您忘记在web.xml中重命名它,并且您只在部署时发现错误。

最后,它们让我们的生活更轻松。 您正在创建一个servlet,显然您希望将其映射到某个URL。 所以你只需添加一个注释。 无需转到另一个文件来添加映射,然后返回到该类,因为您忘记了它的确切名称,然后再次返回该文件。 有关servlet的所有内容都在servlet类中。 对于过滤器,监听器等也是如此

注释没有所有这些问题。

我希望这可以帮助你!

XML配置:

好处 :

所有映射都位于同一位置,您可以在一个文件中概览所有映射。

缺点:

除了类文件之外,还需要一个单独的文件。

注释配置:

好处 :

映射直接在相关类中描述。

缺点:

您必须打开一个特定的类才能查看其映射。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM