| ジャカルタサーブレット | |
|---|---|
| 原作者 | パヴニ・ディワンジ |
| 開発者 | エクリプス財団 |
| リリース | 1996年12月 (1996-12) |
| 安定放出 | 6.1 / 2024年3月28日 ( 2024-03-28 ) |
| 執筆 | Java |
| プラットフォーム | ジャカルタEE |
| サイズ | 2.56 MB |
| タイプ | Web API用ソフトウェアコンポーネント |
| ライセンス | Eclipseパブリックライセンス |
| Webサイト | jakarta |
| リポジトリ |
|

Jakarta Servlet(旧称Java Servlet)は、サーバーの機能を拡張するJavaソフトウェア コンポーネントです。サーブレットは様々な種類の要求に対応できますが、最も一般的な用途はWeb サーバー上でWeb アプリケーションをホストするためのWeb コンテナを実装することであり、そのためサーバーサイド サーブレットWeb APIに分類されます。このような Web サーブレットは、PHPやASP.NETなどの他の動的 Web コンテンツ技術に対応するJava版と言えます。
Jakarta Servletは、 Jakarta EEのJava クラス[ 1 ]であり、リクエストに応答する Java クラスを実装するための標準であるJakarta Servlet API [ 2 ]に準拠しています。サーブレットは原則として任意のクライアント/サーバープロトコルで通信できますが、最もよく使用されるのはHTTPです。原則として、どのサーブレットでもクラスを拡張できますが、実際にはすべてのサーブレットがこのクラスを拡張しています。[ 3 ]そのため、「サーブレット」は「HTTP サーブレット」の略語としてよく使用されます。[ 4 ]このように、サーブレットはJava プラットフォームを使用してWeb サーバーに動的なコンテンツを追加するために使用できます。[ 5 ]生成されるコンテンツは一般的にHTMLですが、 XMLやより一般的にはJSONなどの他のデータである場合もあります。GenericServletHttpServlet
Jakarta Servlet APIは、ある程度、Webサービス向けの2つの標準的なJavaテクノロジーに取って代わられています。
Aは、リクエストを受け取り、そのリクエストに基づいてレスポンスを生成するオブジェクトServletです。基本パッケージでは、サーブレットのリクエストとレスポンスを表すJavaオブジェクト、およびサーブレットの設定パラメータと実行環境を反映するオブジェクトが定義されています。Servlet
Javaパッケージ階層に含まれるServlet APIは、 Webコンテナとサーブレットの想定される相互作用を定義します。[ 4 ]javax.servlet
このパッケージは、 HTTP固有のサブクラスjavax.servlet.httpを定義します。このパッケージには、Web サーバーとクライアント間の複数のリクエストとレスポンスを追跡するセッション管理オブジェクトが含まれています。GenericServlet
サーブレットは、 HTTP CookieまたはURL マッピングを使用することで、多くのサーバー トランザクションにわたってセッション変数に状態を維持できます。[ 6 ]サーブレットを作成し、サーブレットで URL マッピングを使用する方法はいくつかあります。サーブレット 3.0 仕様 (Tomcat 7.0) より前は、web.xml を構成してサーブレットを URL にマッピングすることが唯一の方法でした。サーブレット 3.0 仕様以降を使用するアプリケーションでは、アノテーションを使用して任意のサーブレットを 1 つ以上の URL パターンにマッピングできます。@WebServlet
サーブレットは、 WebアプリケーションとしてWARファイルにパッケージ化されることがあります。[ 7 ]
サーブレットをデプロイして実行するには、 Webコンテナが必要です。Webコンテナ(サーブレットコンテナとも呼ばれる)は、基本的にWebサーバーのコンポーネントであり、サーブレットとやり取りします。[ 1 ] Webコンテナは、サーブレットのライフサイクルを管理し、URLを特定のサーブレットにマッピングし、URL要求者が適切なアクセス権限を持っていることを保証する役割を担います。
サーブレットは、 Jakarta Server Pages コンパイラによってJakarta Server Pages (JSP)から自動的に生成できます。サーブレットと JSP の違いは、サーブレットは通常 Java コード内に HTML を埋め込むのに対し、JSP は HTML 内に Java コードを埋め込む点です。一般的に、JSP を使用する場合、JSP 内に Java コードを埋め込むことは好ましくないと考えられています。[ 8 ]代わりに、バックエンドのロジックを JSP から の Java コードに移動するのがより良いアプローチです。[ 8 ]これにより、 はの処理のみを担当し、JSP は HTML の表示のみを担当することが保証され、[ 8 ]関心の明確な分離と単一責任の原則への準拠が可能になります。ServletServlet
サーブレットを直接使用して HTML を生成することは(以下の例に示すように)稀になっていますが、Jakarta EE の上位レベルの MVC Web フレームワーク ( Faces ) は、低レベルのリクエスト/レスポンス処理にサーブレット技術を明示的に使用していますFacesServlet。
やや古い使い方としては、サーブレットをJSPと組み合わせて使用する「モデル2 」と呼ばれるパターンがあり、これはモデル・ビュー・コントローラーの一種です。
Java Servlet API は、1996 年 5 月に開催された第 1 回JavaOneカンファレンスで初めて一般に発表されました。 [ 9 ] [ 10 ]カンファレンスでの発表から約 2 か月後、最初の公開実装が JavaSoft の Web サイト上で利用可能になりました。これは、Java Web Server (JWS、当時はJeevesというコードネームで知られていた) [ 11 ]の最初のアルファ版であり、最終的に 1997 年 6 月 5 日に製品として出荷されました。[ 12 ]
java.netのブログで、Sun のベテランでありGlassFish のリーダーである Jim Driscoll は、サーブレット技術の歴史を詳しく解説しています。[ 13 ] James Gosling はJavaの初期の頃にサーブレットを最初に考えましたが、その概念が製品になったのは 1996 年 12 月に Sun が JWS を出荷した時でした。[ 14 ] [ 15 ] [ 16 ]これは、現在のJakarta EEが仕様になる前のことです。
Servlet1 仕様は、Pavni Diwanji [ 17 ] [ 18 ]がSun Microsystemsで働いていたときに作成され、バージョン 1.0 は 1997 年 6 月に完成しました。バージョン 2.2 以降、仕様はJava Community Processの下で開発されました。
サーブレットのライフサイクルにおいて中心となるメソッドは 3 つあります。それはinit()、service()、 、 ですdestroy()。これらはすべてのサーブレットで実装されており、サーバーによって特定のタイミングで呼び出されます。
init()の初期化段階では、Webコンテナはメソッド[ 27 ]を呼び出し、インターフェースを実装するオブジェクトを渡してサーブレットインスタンスを初期化します。この構成オブジェクトにより、サーブレットはWebアプリケーションから名前と値のjavax.servlet.ServletConfig初期化パラメータにアクセスできます。service()リクエストごとにサーブレットのメソッドを呼び出します。このservice()メソッドは、リクエストの種類を判断し、リクエストを処理する適切なメソッドにディスパッチします。サーブレットの開発者は、これらのメソッドの実装を提供する必要があります。サーブレットが実装していないメソッドへのリクエストがあった場合、親クラスのメソッドが呼び出され、通常はリクエスト元にエラーが返されます。destroy()サーブレットをサービスから削除するメソッドを呼び出します。このdestroy()メソッドは、と同様にinit()、サーブレットのライフサイクルで一度だけ呼び出されます。以下は、これらのメソッドの典型的なユーザーシナリオです。
init()サーブレットのメソッドを呼び出します。 service()サーブレットのメソッドを呼び出します。 service()メソッドは、HTTPリクエストごとに呼び出されます。destroy()サーブレットに割り当てられているファイルハンドルなどのリソースを解放するために、サーブレットのメソッドを呼び出します。重要なデータは永続ストレージに保存される場合があります。以下のサーブレットの例は、そのメソッドが呼び出された回数を表示しますservice()。
HttpServletは のサブクラスでありGenericServlet、インターフェースの実装であることに注意してくださいServlet。
service()クラスのメソッドは、HTTPリクエストに応じて、HttpServletメソッド、、、などにリクエストをディスパッチします。以下の例では、がオーバーライドされており、どのHTTPリクエストメソッドを処理するかを区別していません。doGet()doPost()doPut()doDelete()service()
パッケージorg.wikipedia.examples ;import java.io.IOException ;import jakarta.servlet.ServletConfig ; import jakarta.servlet.ServletException ; import jakarta.servlet.http.HttpServlet ; import jakarta.servlet.http.HttpServletRequest ; import jakarta.servlet.http.HttpServletResponse ;public class ServletLifeCycleExample extends HttpServlet { private Integer sharedCounter ;@Override public void init ( final ServletConfig config ) throws ServletException { super.init ( config ) ; getServletContext (). log ( "init() called" ) ; sharedCounter = 0 ; }@Override protected void service ( final HttpServletRequest request , final HttpServletResponse response ) throws ServletException , IOException { getServletContext (). log ( "service() called" ); int localCounter ; synchronized ( sharedCounter ) { sharedCounter ++ ; localCounter = sharedCounter ; } response . getWriter (). write ( "Incrementing the count to " + localCounter ); // ローカル変数にアクセスresponse . getWriter (). flush (); // レスポンスをフラッシュ}@Override public void destroy () { getServletContext (). log ( "destroy() が呼び出されました" ); } }サーブレット技術の仕様は、多くの製品に実装されています。実装例の一覧は、Webコンテナのページをご覧ください。
SIPサーブレット用のものなど、他のタイプのサーブレットコンテナもあります。たとえば、SailFinなどです。
本稿では、1997年12月にJava Web Server 1.1の一部として導入され、1998年4月にJava Servlet Development Kit 2.0のリリースによって明確化されたServlet APIのバージョン2.0について解説します。