web-dev-qa-db-ja.com

Tomcat 7での@WebServletアノテーション

私のアプリケーションでは、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 {

そして、それは機能しません。誰かが私が間違ったことを教えてもらえますか?

60
Dvora

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/*")

残りの属性はオプションであるため、サーブレットを同等に機能させるために必須ではありません。

こちらもご覧ください:

110
BalusC

同じ名前のアノテーションを持つ2つのクラスがあるかどうかを確認することもできます。

@WebServlet(name = "Foo", urlPatterns = {"/foo"})
public class Foo extends HttpServlet {
    //...
}

そして:

@WebServlet(name = "Foo", urlPatterns = {"/bar"})
public class Bar extends HttpServlet {
    //...
}

この場合、サーブレットの1つが機能しません。名前を使用しない場合は、@ BalusCが示唆するように、名前を省略します。サーブレットの1つが変更してコンパイルした直後にしか動作せず、変更なしでコンパイルした後では動作しないという奇妙な動作がありました。

6
Herbert

さらに、これらの注釈を使用してコードをコンパイルするには、pom.xmlに対応する依存関係をインポートする必要がありますが、提供されているように、「Servlet 3.0」準拠のサーバーにはすでにこれがあります。

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.0.1</version>
    <scope>provided</scope>
</dependency>
2