まず、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 構成規則
- 完全に一致
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);
}
}
- ディレクトリの一致
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/* 内の /* はゼロ以上のレベルのアクセス ディレクトリを表し、完全一致の優先度はより高いという結論を導き出すことができます。ディレクトリマッチのそれ。
- 延長戦
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 の前、それ以外の場合、エラーが報告されます。
- 任意の一致
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 つずつ構成するため、多数のサーブレット アノテーションを使用すると、サーブレット クラス ファイルが多すぎると、検索と変更が不便になります。
間違っている場合は修正してください。