【JavaWeb】サーブレットに関する2つの設定 Web.xmlファイルの設定または@WebServletアノテーションとurlPattern設定ルールの利用

まず、Servlet2.x バージョンでは、構成はまだ web.xml の形式で構成されていることを理解する必要がありますが、Servlet3.x にアップグレードした後、注釈ベースの方法で構成できます。

1. Web.xml ファイルを使用して構成する

コード形式:

    <!--注册Servlet-->
    <servlet>
    	<!--自定义,一般为类名-->
        <servlet-name></servlet-name>
        <!--servlet的类全名:package.类名-->
        <servlet-class></servlet-class>
    </servlet>
	<!--Servlet的请求路径-->
    <!--给Servlet提供(映射)一个可供客户端访问的URI-->
    <servlet-mapping>
    	<!--必须和servlet中的name相同-->
        <servlet-name></servlet-name>
        <!-- servlet的映射路径(访问serclet的名称) -->
        <url-pattern></url-pattern>
    </servlet-mapping>

コード表示:

ここに画像の説明を挿入

アクセスプロセス:

①サーブレットがブラウザのアドレスバーから入力したパスを、servlet-mappingタグのurl-patternのタグ値と照合。
② url-pattern のマッピング値を使用して、servlet-mapping タグの servlet-name の値を見つけ、servlet タグの servlet-name の値と一致させます。
③実サーブレット内のサーブレット名をマッピング関係で求めた後、サーブレットタグ内のサーブレットクラスタグ内の対応するサーブレットクラスのsrcフォルダ配下のフルパスを求めます。
④それにより、対応するサーブレットクラスを呼び出して実行します。
ここに画像の説明を挿入

知らせ:

  • servlet-mapping タグの servlet-name の値は、servlet タグの servlet-name と同じでなければなりません。
  • servlet-class は完全修飾名です。
  • url-pattern は、Web ページによって送信される対応するアドレスです。

2. @WebServlet アノテーションを使用して構成します

アノテーションは比較的単純です。アノテーションを記述し、name と urlPatterns を入力するだけです。name はクラス名、urlPatterns は Web ページによって送信される対応するアドレスですが、通常は urlPatterns のみを記述します。

コード表示:

import javax.servlet.annotation.WebServlet;

@WebServlet("/demo01")
public class demo01 extends HttpServlet {
    
    }

@WebServlet アノテーション属性の一部を次に示します。

ここに画像の説明を挿入

知らせ:

  • Web.xml ファイルのルート要素 () に metadata-complete="true" を指定しないでください。デフォルトの metadata-complete="true" の場合は、属性を "false" に変更してください。
  • @WebServlet の value 属性と urlPatterns 属性の両方を使用して、サーブレットのアクセス パスを示すことができます。value と urlPatterns はどちらも配列の形式であるため、サーブレットを複数のアクセス パスにマップできますが、value と urlPatterns を同時に使用することはできません。value と urlPatterns が同時に使用されている場合、サーブレットはそれらにアクセスできません。

urlPattern 構成拡張

サーブレット クラスを作成したら、アクセスするには、そのアクセス パス (urlPattern) を構成する必要があります。

  • サーブレットは複数の URLPatterns で構成できます
    ここに画像の説明を挿入
package com.aDiao.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(urlPatterns = {
    
    "/demo04","/aDiao04"})
public class ServletDemo04 extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        System.out.println("demo04 get...");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        doGet(req, resp);
    }
}

添付コードの「/demo04」と「/aDiao04」の2つのアドレスにアクセスできます。

  • urlPattern 構成規則
  1. 完全に一致
    ここに画像の説明を挿入
package com.aDiao.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/user/demo05")
public class ServletDemo05 extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        System.out.println("demo05 get...");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        doGet(req, resp);
    }
}

ここに画像の説明を挿入

  1. ディレクトリの一致
    ここに画像の説明を挿入
package com.aDiao.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/user/*")
public class ServletDemo06 extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        System.out.println("demo06 get...");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        doGet(req, resp);
    }
}

ここに画像の説明を挿入
ここに画像の説明を挿入
考察:
(1)アクセスパス「/user」でServletDemo06のdoGetメソッドにアクセスできるか?
(2)アクセスパス「/user/a/b」でServletDemo06のdoGetメソッドにアクセスできるか?
(3)アクセスパス「/user/demo05」でServletDemo06のdoGetメソッドにアクセスできるか?
回答: はい、はい、いいえ (アクセスは demo05 の doGet メソッドです)、そして /user/* 内の /* はゼロ以上のレベルのアクセス ディレクトリを表し、完全一致の優先度はより高いという結論を導き出すことができます。ディレクトリマッチのそれ。

  1. 延長戦
    ここに画像の説明を挿入
package com.aDiao.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("*.demo07")
public class ServletDemo07 extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        System.out.println("demo07 get...");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        doGet(req, resp);
    }
}

ここに画像の説明を挿入
ここに画像の説明を挿入
注:
(1) パス構成が拡張子でない場合は、パスの前に / を追加する必要があります。そうしないと、エラーが報告されます; (2)
パス構成が *.do の場合、/ を追加することはできません*.do の前、それ以外の場合、エラーが報告されます。

  1. 任意の一致
    ここに画像の説明を挿入
package com.aDiao.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/")
//@WebServlet("/*")
public class ServletDemo08 extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        System.out.println("demo08 get...");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        doGet(req, resp);
    }
}

ここに画像の説明を挿入
ここに画像の説明を挿入
注: / と /* の違い:
(1) プロジェクトのサーブレットが「/」で構成されている場合、Tomcat の DefaultServlet が上書きされ、このサーブレットは、他の URL パターンが一致しない場合に使用されます;
( 2) 当プロジェクトで「/*」が設定されている場合は、任意のアクセスパスに一致することを意味します
(3) 静的リソースの処理には DefaultServlet が使用されます 「/」が設定されている場合、デフォルトは上書きされ、静的リクエストが処理されますトリガーされたリソースはデフォルトではなく、カスタム サーブレット クラスに移動するため、最終的に静的リソースにアクセスできなくなりました。

3. 両者の長所と短所を比較してみましょう

  • Web.xml ファイルを使用して構成する

利点: Web.xml ファイル内のすべての構成情報がアンインストールされ、各サーブレット クラス パスのマッピング パスを一元管理できるため、変更や検索に便利です。
短所:「怠惰ながん患者」にはあまり友好的ではなく、コードの量が多くて扱いにくく、可読性が高くありません。

  • @WebServlet アノテーションを使用した構成

利点: コードの量が少なく、サーブレット クラスで直接使用できます。各クラスは、独自のビジネス ロジックのみに焦点を当てており、互いに干渉しません。
短所: 1 つのクラスを 1 つずつ構成するため、多数のサーブレット アノテーションを使用すると、サーブレット クラス ファイルが多すぎると、検索と変更が不便になります。

間違っている場合は修正してください。
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/aDiaoYa_/article/details/126511023