web.xmlを使用しないJava Webアプリケーション

1. 概要

このチュートリアルでは、https://tomcat.apache.org/tomcat-7.0-doc/servletapi/index.html [Servlet 3.0+]を使用してJava Webアプリケーションを作成します。
_web.xml_ファイルをnixするのに役立つ3つのアノテーション、_ @ WebServlet _、_ @ WebFilter_、および_ @ WebListener_を見てみましょう。

2. Mavenの依存関係

これらの新しい注釈を使用するには、_https://search.maven.org/search?q = g:javax.servlet%20a:javax.servlet-api [javax.servlet-api] _依存関係を含める必要があります。
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
</dependency>

3. XMLベースの構成

サーブレット3.0以前は、_web.xml_ファイルでJava Webアプリケーションを構成していました。
<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にはServlet 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_アノテーションを使用してリスナーを定義できます。*
サーバーへのリクエストを実行するたびにカウントするリスナーを作成しましょう。 __ServletRequestEvent__sをリッスンして、_ServletRequestListener_を実装します。
@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_を使用している場合、プロパティlink:/eclipse-error-web-xml-missing[_failOnMissingWebXml_を_false_]に設定する必要があります。 。
これで、https://www.baeldung.com/tomcat-deploy-war [_.war_ファイルを_Tomcat_にデプロイ]し、サーブレットにアクセスできます。
_ / uppercase_エンドポイントを試してみましょう。
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

Servlet 3.0で導入されたすべての機能を使用しても、_web.xml_ファイルが必要なユースケースがいくつかあります。
  • フィルターの次数をアノテーションで定義することはできません –まだ必要です
    特定の順序で適用する必要がある複数のフィルターがある場合は、_ <filter-mapping> _セクション

  • session
    タイムアウト
    、まだ_ <session-config> _セクションを使用する必要があります

  • コンテナベースの_ <security-role> _要素がまだ必要です
    認可

  • ウェルカムファイルを指定するには、_ <welcome-file-list> _がまだ必要です。
    セクション

    または、Servlet 3.0では、_ServletContainerInitializer_ *を介した*プログラムによるサポートも導入されており、これらのギャップを埋めることもできます。

9. 結論

このチュートリアルでは、_web.xml_ファイルを使用せずに、同等のアノテーションを実行してJava Webアプリケーションを構成しました。
いつものように、このチュートリアルのソースコードはhttps://github.com/eugenp/tutorials/tree/master/spring-mvc-java[GitHub]にあります。 さらに、従来のweb.xmlファイルを使用するアプリケーションは、https://github.com/eugenp/tutorials/tree/master/spring-mvc-xml [GitHub]にもあります。
Springベースのアプローチについては、チュートリアルlink:/spring-xml-vs-java-config[web.xml vs. Springの初期化子。]