Java Servlet

Jakarta Servlet（ジャカルタ サーブレット）とは、Eclipse Foundationが開発している、サーバ上でウェブページなどを動的に生成したりデータ処理を行うために、Javaで作成されたプログラム及びその仕様で、Jakarta EE Platformの一部。Java 8まではJava Servlet（ジャバ サーブレット）という名称で、Java Platform, Enterprise Editionの一部だった。単にServlet（サーブレット）と呼ばれることが多い。この機能を用いてショッピングサイトやオンラインバンキングなどをはじめとする多種多様な動的なWebサイトが構築されている。

 概要 

Servletはサーバサイド技術として登場した。

同様の技術（すなわち対抗技術）としてはPerlなどを用いたCGI、PHPプログラムのプロセスをApache HTTP Server上で動かすことができるmod_phpなどのモジュール、マイクロソフトが提供するASPなどがある。CGIがクライアントのリクエストのたびに新しいプロセスを起動するのに対して、サーブレットはメモリに常駐して、リクエストのたびにプロセスより軽量なスレッドを起動するので、効率がよい。また、サーブレットはJavaで書かれているのでさまざまなプラットフォームで使うことができる。

Servlet 2.3からは、フィルター機能が追加され、Servletの実行前後に処理を差し込むことが可能となった。

サーブレットの技術の延長としてJSPがあるが、JSPはサーブレットを自動生成して動作している。厳密に言えばサーブレットとJSPは違う技術だが、これらは組み合わせて使うのが一般的なため、JSPもサーブレットの一部として扱われることが多い。

サーブレットの実行環境（実行するためのソフトウェア）はWebコンテナ、またはサーブレットコンテナと呼ばれる。これらの言葉はあまり区別されずに使われることも多いが、純粋にサーブレットの処理を行うものをサーブレットコンテナと呼び、サーブレットコンテナを含みJSPやHTTPサーバとしての機能も含むものをWebコンテナと呼ぶ傾向がある。

Webコンテナとしては、Apache Tomcat, Jetty, BEA WebLogic Server, IBM WebSphere Application Server, Resin, JBossなどがある。

 サーバサイドJava 
当初、JavaはAppletなどのクライアント側でJavaプログラムを稼動させるクライアントサイドの技術として注目を集めていた。しかし、サーブレットの登場以降、サーバ側でJavaプログラムを稼動させる形態が急速に普及した。こうしたサーバ側でJavaプログラムを稼動させる形態をサーバサイドJavaと呼ぶ。

 役割 
JSPの登場により、Servletはデータの入出力処理 (Controller) を担当することが推奨される。これはModel View Controller (MVC) による役割付けである。

 歴史 
+ Java Servletの歴史 バージョン  リリース  プラットフォーム 内容 1.0 1997/01 -- -- 2.0  JDK 1.1 Java Servlet Development Kit 2.0の一部としてリリース 2.1 1998/11 -- 公式な初版、RequestDispatcher, ServletContextを追加 2.2 1999/08 J2EE 1.2J2SE 1.2 J2EEの一部となる 2.3 2001/08 J2EE 1.3J2SE 1.2 Filter機能追加 2.4 2003/11 J2EE 1.4J2SE 1.3 web.xml にXML Schema を利用 2.5 2005/09 Java EE 5Java SE 5 Java SE 5が必須となる, annotationをサポート 3.0 2009/12 Java EE 6Java SE 6 開発容易性の実現, 動的設定, login/logoutメソッドサポート, 非同期Servlet, アノテーションSecurity, Fileアップロード 3.1 2013/05 Java EE 7Java SE 7 クラウド対応, ノンブロッキング処理用I/O APIの追加, WebSocket等へのプロトコルアップグレードの対応, セキュリティ機能の強化 4.0 2017/09 Java EE 8Java SE 8 HTTP/2サポート

+ Jakarta Servletの歴史 バージョン  リリース  プラットフォーム 内容 4.0 2019/08/13 Jakarta EE 8Java SE 8以降「Java」の商標から名前が変更。Java ServletからJakarta Servletに名前が変わった。 5.0 2020/09/07 Jakarta EE 9Java SE 8以降 APIがパッケージjavax.servletからjakarta.servletに移動 6.0 2022/05/12 Jakarta EE 10Java SE 11以降 非推奨の機能の削除と、リクエストされた拡張機能を実装 6.1 2024/03/28 Jakarta EE 11Java SE 17以降

 例 
以下は、service()メソッドが何回呼ばれたかを出力する単純なサーブレットである。

サーブレットはServletインタフェースを実装する必要がある。サーブレットの実装は通常、プロトコルに依存しない抽象クラスであるGenericServletか、HTTP用のサブクラスであるHttpServletクラスを継承することで行う。この例ではHttpServletクラスを継承している。

service()メソッドはサーブレットのリクエストごとの処理を記述するメソッドである。HttpServletクラスを継承する場合、ここからさらにdoGet(), doPost(), doPut(), doDelete()といったHTTPメソッドごとのメソッドに分岐させることができる。ただし、以下の例ではその機能を使わず、直接service()メソッドをオーバーライドしている。

import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;

public class ServletLifeCycleExample extends HttpServlet {
    private int count;

    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        getServletContext().log("init() called");
        count = 0;
    }

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        getServletContext().log("service() called");
        count++;
        response.getWriter().write("Incrementing the count: count = " + count);
    }

    @Override
    public void destroy() {
        getServletContext().log("destroy() called");
    }
}

 web.xml定義 
+ web.xml定義 バージョン  定義内容 2.3 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
 <web-app>
 </web-app> 2.4 <?xml version="1.0" encoding="UTF-8"?>
 <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
 </web-app> 2.5 <?xml version="1.0" encoding="UTF-8"?>
 <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">
 </web-app> 3.0 <?xml version="1.0" encoding="UTF-8"?>
 <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
 </web-app> 3.1 <?xml version="1.0" encoding="UTF-8"?>
 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
 </web-app>

 脚注 

 関連項目 

 Jakarta EE
 アプリケーションサーバ
 ウェブアプリケーション
 Jakarta Pages
 JavaBeans
 アプレット

 外部リンク 
 Jakarta Servlet
 Java Servlet

 仕様 
 Java Servlet 2.3 JSR-053 
 Java Servlet 2.4 JSR-154 Final Release 
 Java Servlet 2.5 JSR-154 Maintenance Release 
 Java Servlet 3.0 JSR-315 
 Java Servlet 3.1 JSR-340 
 Java Servlet 4.0 JSR-363 
 Jakarta Servlet 4.0 
 Jakarta Servlet 5.0 
 Jakarta Servlet 6.0 
 Jakarta Servlet 6.1 

Category:ウェブ開発
Servlet
Servlet
Servlet
Servlet