1. 概要

このチュートリアルでは、サーブレット3.0+を使用してJavaWebアプリケーションを作成しています。

@WebServlet @WebFilter @WebListener の3つのアノテーションを見ていきます。これは、web.xmlを削除するのに役立ちます。 ファイル。

2. Mavenの依存関係

これらの新しいアノテーションを使用するには、javax.servlet-api依存関係を含める必要があります。

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
</dependency>

3. XMLベースの構成

サーブレット3.0より前では、JavaWebアプリケーションをweb.xmlファイルで構成していました。

<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_2_5.xsd"
  version="2.5">
    <listener>
        <listener-class>com.baeldung.servlets3.web.listeners.RequestListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>uppercaseServlet</servlet-name>
        <servlet-class>com.baeldung.servlets3.web.servlets.UppercaseServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>uppercaseServlet</servlet-name>
        <url-pattern>/uppercase</url-pattern>
    </servlet-mapping>
    <filter>
        <filter-name>emptyParamFilter</filter-name>
        <filter-class>com.baeldung.servlets3.web.filters.EmptyParamFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>emptyParamFilter</filter-name>
        <url-pattern>/uppercase</url-pattern>
    </filter-mapping>
</web-app>

各構成セクションを、サーブレット3.0で導入されたそれぞれのアノテーションに置き換えてみましょう。

4. サーブレット

JEE 6にはサーブレット3.0が付属しており、サーブレット定義に注釈を使用できるため、Webアプリケーションでのweb.xmlファイルの使用を最小限に抑えることができます。

たとえば、サーブレットを定義し、@WebServletアノテーションを使用して公開できます。

URLパターン/uppercaseに対して1つのサーブレットを定義しましょう。 inputリクエストパラメータの値を大文字に変換します。

@WebServlet(urlPatterns = "/uppercase", name = "uppercaseServlet")
public class UppercaseServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws IOException {
        String inputString = request.getParameter("input").toUpperCase();

        PrintWriter out = response.getWriter();
        out.println(inputString);
    }
}

参照できるサーブレット(uppercaseServlet)の名前を定義したことに注意してください。これは次のセクションで使用します。

@WebServlet アノテーションを使用して、web.xmlファイルのservletセクションとservlet-mappingセクションを置き換えます。

5. フィルタ

Filter は、要求または応答をインターセプトし、前処理または後処理タスクを実行するために使用されるオブジェクトです。

@WebFilterアノテーションを使用してフィルターを定義できます。

inputリクエストパラメーターが存在するかどうかを確認するフィルターを作成しましょう。

@WebFilter(urlPatterns = "/uppercase")
public class EmptyParamFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
      FilterChain filterChain) throws IOException, ServletException {
        String inputString = servletRequest.getParameter("input");

        if (inputString != null && inputString.matches("[A-Za-z0-9]+")) {
            filterChain.doFilter(servletRequest, servletResponse);
        } else {
            servletResponse.getWriter().println("Missing input parameter");
        }
    }

    // implementations for other methods
}

@WebFilter アノテーションを使用して、web.xmlファイルのfilterセクションとfilter-mappingセクションを置き換えます。

6. リスナー

多くの場合、特定のイベントに基づいてアクションをトリガーする必要があります。 これはリスナーが救助に来るところです。 これらのオブジェクトはイベントをリッスンし、指定した動作を実行します。

以前と同様に、@WebListenerアノテーションを使用してリスナーを定義できます。

サーバーへのリクエストを実行するたびにカウントするリスナーを作成しましょう。 ServletRequestListener を実装し、ServletRequestEventをリッスンします。

@WebListener
public class RequestListener implements ServletRequestListener {
    @Override
    public void requestDestroyed(ServletRequestEvent event) {
        HttpServletRequest request = (HttpServletRequest)event.getServletRequest();
        if (!request.getServletPath().equals("/counter")) {
            ServletContext context = event.getServletContext();
            context.setAttribute("counter", (int) context.getAttribute("counter") + 1);
        }
    }

    // implementations for other methods
}

URLパターン/counterへのリクエストを除外していることに注意してください。

@WebListener アノテーションを使用して、web.xmlファイルのlistenerセクションを置き換えます。

7. ビルドして実行

以下の人のために、テストのために、counterサーブレットコンテキスト属性を返すだけの/counterエンドポイント用に追加した2番目のサーブレットがあることに注意してください。

それでは、アプリケーションサーバーとしてTomcatを使用しましょう。

3.1.0より前のバージョンのmaven-war-pluginを使用している場合は、プロパティfailOnMissingWebXmlをfalseに設定する必要があります。

これで、.warファイルをTomcat デプロイして、サーブレットにアクセスできるようになりました。

/大文字エンドポイントを試してみましょう。

curl http://localhost:8080/spring-mvc-java/uppercase?input=texttouppercase

TEXTTOUPPERCASE

また、エラー処理がどのように見えるかも確認する必要があります。

curl http://localhost:8080/spring-mvc-java/uppercase

Missing input parameter

そして最後に、リスナーの簡単なテスト:

curl http://localhost:8080/spring-mvc-java/counter

Request counter: 2

8. XMLはまだ必要です

サーブレット3.0で導入されたすべての機能を使用しても、web.xmlファイルが必要なユースケースがいくつかあります。

  • アノテーションでフィルターの順序を定義することはできません –まだ必要です特定の順序で適用する必要がある複数のフィルターがある場合はセクション
  • を定義するにはセッションタイムアウト 、まだ使用する必要がありますセクション
  • まだ必要ですコンテナベースの承認用の要素
  • ウェルカムファイルを指定するには、まだセクション

または、サーブレット3.0は、ServletContainerInitializer を介したプログラムによるサポートも導入しました。これにより、これらのギャップの一部を埋めることもできます。

9. 結論

このチュートリアルでは、同等のアノテーションを使用して、web.xmlファイルを使用せずにJavaWebアプリケーションを構成しました。

いつものように、このチュートリアルのソースコードはGitHubにあります。 さらに、従来のweb.xmlファイルを使用するアプリケーションは、GitHubにもあります。

春ベースのアプローチについては、チュートリアルに進んでください web.xmlと。 スプリング付きイニシャライザー。