簡體   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