ジャカルタサーブレット
原作者 | パヴニ・ディワンジ |
---|---|
開発者 | エクリプス財団 |
初回リリース | 1996年12月 |
安定リリース | 6.0 / 2022年5月31日 |
リポジトリ |
|
書かれた | ジャワ |
プラットフォーム | ジャカルタEE |
サイズ | 2.56MB |
タイプ | Web API用ソフトウェア コンポーネント |
ライセンス | Eclipse パブリックライセンス |
Webサイト | jakarta.ee/仕様/サーブレット/ |
![](https://upload.wikimedia.org/wikipedia/commons/thumb/4/40/JSPLife.png/440px-JSPLife.png)
Jakarta Servlet (旧称Java Servlet)は、サーバーの機能を拡張するJava ソフトウェア コンポーネントです。サーブレットは多くの種類のリクエストに応答できますが、最も一般的にはWeb サーバー上でWeb アプリケーションをホストするためのWeb コンテナーを実装するため、サーバー側サーブレットWeb APIとして適しています。このような Web サーブレットは、 PHPやASP.NETなどの他の動的 Web コンテンツテクノロジのJava版です。
導入
Jakarta Servletは、 Jakarta EEのJavaクラス[1]であり、Jakarta Servlet API [2]に準拠しています。Jakarta Servlet APIは、リクエストに応答するJavaクラスを実装するための標準です。サーブレットは、原理的には任意のクライアントサーバープロトコルを介して通信できますが、最もよく使用されるのはHTTPです。原理的には、どのサーブレットでもクラスを拡張できますが、現実的には、すべてのサーブレットがクラスを拡張します。[3]そのため、「サーブレット」は「HTTPサーブレット」の省略形としてよく使用されます。[4]そのため、サーブレットは、Javaプラットフォームを使用してWebサーバーに動的コンテンツを追加するために使用できます。[5]生成されるコンテンツは通常HTMLですが、 XMLや、より一般的にはJSONなどの他のデータである場合もあります。
GenericServlet
HttpServlet
Jakarta Servlet API は、ある程度、Web サービス用の 2 つの標準 Java テクノロジに置き換えられています[引用が必要]。
- AJAX、JSON、RESTサービスに便利なJakarta RESTful Webサービス(JAX-RS 2.0 )
- SOAP Web サービスに役立つJakarta XML Web サービス(JAX-WS) 。
は、リクエストを受信し、そのリクエストに基づいて応答を生成するオブジェクトServlet
です。基本パッケージは、サーブレットのリクエストと応答を表す Java オブジェクトと、サーブレットの構成パラメータと実行環境を反映するオブジェクトを定義します。
Servlet
Javaパッケージ階層に含まれるサーブレットAPIは、Webコンテナとサーブレットの予想される相互作用を定義します。[4]javax.servlet
パッケージは、のHTTPjavax.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 の違いは、サーブレットでは通常 HTML が Java コード内に埋め込まれるのに対し、JSP では Java コードが HTML 内に埋め込まれることです。一般に、JSP を使用する場合、JSP に Java コードを埋め込むことは悪い習慣とされています。[8]代わりに、バックエンド ロジックを JSP から の Java コードに移動することをお勧めします。[8]これにより、 は処理のみを担当し、JSP は HTML の表示のみを担当することになり、[8]明確な関心の分離と単一責任の原則への準拠が可能になります。
Servlet
Servlet
サーブレットを直接使用して HTML を生成することは (以下の例に示すように) まれになっていますが、Jakarta EE の高レベル MVC Web フレームワーク ( Faces ) では、 を介した低レベルの要求/応答処理にサーブレット テクノロジを明示的に使用していますFacesServlet
。
やや古い使用法としては、「モデル 2 」と呼ばれるパターンでサーブレットを JSP と組み合わせて使用するものがあります。これは、モデル - ビュー - コントローラの一種です。
歴史
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]によって作成され、1997年6月にバージョン1.0が完成しました。バージョン2.2からは、 Java Community Processの下で仕様が開発されました。
サーブレット API バージョン | リリース | 仕様 | プラットフォーム | 重要な変更点 |
---|---|---|---|---|
ジャカルタサーブレット 6.0 | 2022年5月31日 | 6.0 | ジャカルタ EE 10 | 廃止された機能を削除し、要求された機能強化を実装する |
ジャカルタサーブレット 5.0 | 2020年10月9日 | 5.0 | ジャカルタ EE 9 | APIはパッケージから移動されましjavax.servlet たjakarta.servlet
|
ジャカルタサーブレット 4.0.3 | 2019年9月10日 | 4.0 | ジャカルタ EE 8 | 「Java」商標から改名 |
Java サーブレット 4.0 | 2017年9月 | JSR369 | Java EE 8 | HTTP/2 |
Java サーブレット 3.1 | 2013年5月 | JSR340 | Java EE 7 | ノンブロッキングI/O、HTTPプロトコルアップグレードメカニズム(WebSocket)[19] |
Java サーブレット 3.0 | 2009年12月 | JSR315 | Java EE 6、Java SE 6 | プラグイン性、開発の容易さ、非同期サーブレット、セキュリティ、ファイルのアップロード |
Java サーブレット 2.5 | 2005年9月 | JSR154 | Java EE 5、Java SE 5 | Java SE 5が必要、アノテーションをサポート |
Java サーブレット 2.4 | 2003年11月 | JSR154 | J2EE 1.4、J2SE 1.3 | web.xmlはXMLスキーマを使用する |
Java サーブレット 2.3 | 2001年8月 | JSR53 | J2EE 1.3、J2SE 1.2 | 追加Filter
|
Java サーブレット 2.2 | 1999年8月 | JSR902、JSR903 | J2EE 1.2、J2SE 1.2 | J2EE の一部となり、.war ファイルに独立した Web アプリケーションが導入されました。 |
Java サーブレット 2.1 | 1998年11月 | 2.1a | 未指定 | 最初の公式仕様、追加RequestDispatcher 、ServletContext
|
Java サーブレット 2.0 | 1997年12月 | — | 1.1 より | 1998年4月のJavaサーブレット開発キット2.0の一部[20] |
Java サーブレット 1.0 | 1996年12月 | — | 1997年6月のJavaサーブレット開発キット(JSDK)1.0の一部[14] |
サーブレットのライフサイクル
サーブレットのライフ サイクルの中心となるメソッドは 3 つです。これらはinit()
、、service()
および ですdestroy()
。これらはすべてのサーブレットによって実装され、サーバーによって特定のタイミングで呼び出されます。
- サーブレットライフサイクルの初期化段階では、Webコンテナはinit()メソッドを呼び出してサーブレットインスタンスを初期化し、[21] javax.servlet.ServletConfigインターフェースを実装するオブジェクトを渡します。この構成オブジェクトにより、サーブレットはWebアプリケーションから名前と値の初期化パラメータにアクセスできるようになります。
- 初期化後、サーブレット インスタンスはクライアント要求を処理できます。各要求は、独自のスレッドで処理されます。Web コンテナーは、
service()
すべての要求に対してサーブレットのメソッドを呼び出します。service()
メソッドは、要求の種類を判別し、要求を処理するために適切なメソッドにディスパッチします。サーブレットの開発者は、これらのメソッドの実装を提供する必要があります。サーブレットによって実装されていないメソッドに対する要求が行われた場合、親クラスのメソッドが呼び出され、通常は要求元にエラーが返されます。 - 最後に、Web コンテナは、
destroy()
サーブレットをサービスから外す メソッドを呼び出します。 メソッドはdestroy()
、 と同様にinit()
、サーブレットのライフサイクルで 1 回だけ呼び出されます。
以下は、これらの方法の典型的なユーザー シナリオです。
- ユーザーがURLへのアクセスを要求したとします。
- ブラウザはこの URL に対して HTTP リクエストを生成します。
- このリクエストは適切なサーバーに送信されます。
- HTTP リクエストは Web サーバーによって受信され、サーブレット コンテナーに転送されます。
- コンテナはこのリクエストを特定のサーブレットにマップします。
- サーブレットは動的に取得され、コンテナのアドレス空間にロードされます。
- コンテナは
init()
サーブレットのメソッドを呼び出します。- このメソッドは、サーブレットが最初にメモリにロードされたときにのみ呼び出されます。
- サーブレットに初期化パラメータを渡して、サーブレット自身を構成できるようにすることも可能です。
- コンテナは
service()
サーブレットのメソッドを呼び出します。- このメソッドは、HTTP リクエストを処理するために呼び出されます。
- サーブレットは、HTTP リクエストで提供されたデータを読み取る場合があります。
- サーブレットはクライアントに対する HTTP 応答を作成することもできます。
- サーブレットはコンテナのアドレス空間に残り、クライアントから受信した他の HTTP 要求を処理するために使用できます。
- この
service()
メソッドは、HTTP リクエストごとに呼び出されます。
- この
- コンテナは、ある時点で、サーブレットをメモリからアンロードすることを決定する場合があります。
- この決定を行うアルゴリズムは、コンテナごとに固有です。
- コンテナはサーブレットの
destroy()
メソッドを呼び出して、サーブレットに割り当てられているファイル ハンドルなどのリソースを解放します。重要なデータは永続ストアに保存される場合があります。 - サーブレットとそのオブジェクトに割り当てられたメモリは、ガベージ コレクションの対象になります。
例
次のサンプル サーブレットは、そのメソッドが呼び出された回数を出力しますservice()
。
は、インターフェースの実装であるHttpServlet
のサブクラスであることに注意してください。
GenericServlet
Servlet
クラスservice()
のメソッドは、HTTPリクエストに応じて、メソッド、、、などにリクエストをディスパッチします。以下の例では、 がオーバーライドされており、どの HTTP リクエスト メソッドを処理するかを区別していません。
HttpServlet
doGet()
doPost()
doPut()
doDelete()
service()
java.io.IOExceptionをインポートします。
jakarta.servlet.ServletConfigをインポートします。jakarta.servlet.ServletExceptionをインポートします。jakarta.servlet.http.HttpServletをインポートします。 jakarta.servlet.http.HttpServletRequestをインポートします。 jakarta.servlet.http.HttpServletResponseをインポートします。
パブリッククラスServletLifeCycleExampleはHttpServletを拡張します{プライベートInteger sharedCounter ;
@Override
public void init ( final ServletConfig config ) throws ServletException { super . init ( config ); getServletContext (). log ( "init() が呼び出されました" ); sharedCounter = 0 ; }
@Override
protected void service ( final HttpServletRequest request , final HttpServletResponse response ) throws ServletException , IOException { getServletContext (). log ( "service() が呼び出されました" ); int localCounter ; synchronized ( sharedCounter ) { sharedCounter ++ ; localCounter = sharedCounter ; } response . getWriter (). write ( "カウントを " + localCounterに増加しています); // ローカル変数にアクセスresponse . getWriter (). flush (); // レスポンスをフラッシュ}
@Override
public void destroy () { getServletContext (). log ( "destroy() が呼び出されました" ); } }
コンテナサーバー
サーブレット テクノロジの仕様は、多くの製品に実装されています。実装の一覧については、Web コンテナページを参照してください。
SailFinなど、SIP サーブレット用のものなど、他の種類のサーブレット コンテナーもあります。
参照
- Apache JServ プロトコル(AJP)
引用
- ^ ab Murach & Urban 2014、pp. 170–171、§2 基本的なサーブレットと JSP のスキル - 視点 - 要約。
- ^ 「サーブレット (Java(TM) EE 7 仕様 API)」。oracle.com。2018年 7 月 25 日閲覧。
- ^ Murach & Urban 2014、pp. 128–129、§2 基本的なサーブレットと JSP のスキル - サーブレットを作成してマップする方法。
- ^ ab "Servlet Essentials - Chapter 1". novocode.com . 2017-12-18時点のオリジナルよりアーカイブ。
- ^ Murach & Urban 2014、pp. 40–42、§1 正しい始め方 - バックエンド処理用のサーブレット。
- ^ Murach & Urban 2014、p. 87、§2 基本的なサーブレットと JSP のスキル。
- ^ Murach & Urban 2014、p. 74、§1 正しい始め方 - Web アプリケーションを操作するためのその他のスキル。
- ^ abc Murach & Urban 2014、pp. 46–47、§1 正しく始めましょう - 2 ページ目の JSP。
- ^ Freedman, Matt (1996 年 6 月 26 日). 「JavaOne カンファレンス レポート」. JavaWorld . 2018 年 7 月 26 日時点のオリジナルよりアーカイブ。2018年 7 月 25 日閲覧。
- ^ Diwanji, Pavani; Connelly, Dave; Wagle, Prasad (1996 年 5 月 29 日). 「Java Server and Servlets」(PDF) . Servers and Server Extensions . JavaOne 1996. 2000 年 8 月 16 日時点のオリジナルよりアーカイブ(PDF) . 2020 年 2 月 1 日閲覧。
- ^ Chang, Phil Inje (1997 年 7 月 1 日)。「インタビュー: Java Web Server チームが詳細を語る」JavaWorld。2018年 7 月 26 日時点のオリジナルよりアーカイブ。2018年 7 月 25 日閲覧。
- ^ Chang, Phil Inje (1997 年 6 月 1 日). 「Java Web Server が出荷されました!」. JavaWorld . 2018 年 7 月 26 日時点のオリジナルよりアーカイブ。2018年 7 月 25 日閲覧。
- ^ 「Servlet History | community.oracle.com」。Weblogs.java.net。2005-12-10。2020-08-15時点のオリジナルよりアーカイブ。2013-06-14に取得。
- ^ ab Hunter, Jason (2000 年 3 月)。「サーブレット タイムライン」。Javaサーブレット プログラミングを超えて。O'Reilly カンファレンス on Java。O'Reilly Media。[永久リンク切れ]
- ^ 「Java Web Server」。Javasoft。Sun Microsystems。1998年1月11日時点のオリジナルよりアーカイブ。2020年2月1日閲覧。
- ^ 「Java Web Server(tm)」。Sun Microsystems。2002年2月6日時点のオリジナルよりアーカイブ。2020年2月1日閲覧。
- ^ 「Pavni Diwanji」. Family Online Safety Institute . 2018年7月26日時点のオリジナルよりアーカイブ。2016年11月12日閲覧。
- ^ 米国特許 5928323、Gosling、James A. 、Diwanji、Pavni、Connelly、David W.、「サーバ側ソフトウェア オブジェクトで情報を動的に生成する装置および方法」、1999 年 7 月 27 日公開、1999 年 7 月 27 日発行、 Sun Microsystemsに譲渡
- ^ 「Servlet 3.1 の新機能 - Java EE 7 の今後の展開 (Arun Gupta、マイルズ トゥ ゴー...)」。oracle.com。2016年11 月 22 日閲覧。
- ^ Crawford, William; Hunter, Jason (1998 年 11 月)。「序文」。Java Servlet プログラミング(第 1 版)。O'Reilly Media。p . ix– x。ISBN 978-1-56592-391-1ここでは、
1997 年 12 月に Java Web Server 1.1 の一部として導入され、1998 年 4 月に Java Servlet Development Kit 2.0 のリリースによって明確化された Servlet API バージョン 2.0 について説明します。
- ^ Murach & Urban 2014、pp. 160–163、§15 サーブレットの開発方法 - サーブレットを操作するためのその他のスキル。
参考文献
- Murach, Joel; Urban, Michael (2014). Murach の Java Servlets and JSP . ISBN 978-1-890774-78-3。
外部リンク
- 公式サイト
- Servlets.com 2018-07-25 にWayback Machineにアーカイブされました