私のアプリケーションでは、web.xmlで次のように定義されたサーブレットがありました。
<servlet>
<display-name>Notification Servlet</display-name>
<servlet-name>NotificationServlet</servlet-name>
<servlet-class>com.XXX.servlet.NotificationServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>NotificationServlet</servlet-name>
<url-pattern>/notification/*</url-pattern>
</servlet-mapping>
Tomcat 7の使用に移行した後、@WebServlet
仕事をするアノテーション。
これが私がやった方法です。
@WebServlet( name="NotificationServlet", displayName="Notification Servlet", urlPatterns = {"/notification"}, loadOnStartup=1)
public class NotificationServlet extends HttpServlet {
そして、それは機能しません。誰かが私が間違ったことを教えてもらえますか?
Tomcat 7以降を使用していることが確実であれば、Tomcatでアノテーションをスキャンおよび処理するには、webappのweb.xml
がServlet 3.0仕様に準拠していると宣言する必要があります。それ以外の場合、Tomcatはweb.xml
のサーブレットバージョンに一致するフォールバックモードで実行されます。サーブレットAPIアノテーションのサポートは、サーブレット3.0(Tomcat 7)でのみ追加されました。
したがって、web.xml
のルート宣言は以下のようになっている必要があります(web.xml
からDOCTYPE
も削除する必要があります。削除しないと、サーブレット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
を使用すると、サーブレットは正確にそのパス上のリクエストのみをリッスンできます。 /notifications/list
などの余分なパスを持つリクエストには反応しません。 URLパターン/notifications/*
により、サーブレットは追加のパス情報を含むリクエストもリッスンできます。
したがって、最小の@WebServlet
注釈は次のようになります。
@WebServlet("/notifications/*")
残りの属性はオプションであるため、サーブレットを同等に機能させるために必須ではありません。
同じ名前のアノテーションを持つ2つのクラスがあるかどうかを確認することもできます。
@WebServlet(name = "Foo", urlPatterns = {"/foo"})
public class Foo extends HttpServlet {
//...
}
そして:
@WebServlet(name = "Foo", urlPatterns = {"/bar"})
public class Bar extends HttpServlet {
//...
}
この場合、サーブレットの1つが機能しません。名前を使用しない場合は、@ BalusCが示唆するように、名前を省略します。サーブレットの1つが変更してコンパイルした直後にしか動作せず、変更なしでコンパイルした後では動作しないという奇妙な動作がありました。
さらに、これらの注釈を使用してコードをコンパイルするには、pom.xmlに対応する依存関係をインポートする必要がありますが、提供されているように、「Servlet 3.0」準拠のサーバーにはすでにこれがあります。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>