「サーブレット(正式名称はジャカルタ・サーブレット: Jakarta Servlet)」はサーブレットコンテナと呼ばれるサーバ上でJavaのプログラムを実行し、Webページの動的生成やデータ処理などのバックエンド処理をするための仕組みです。
Java のソースコードをコンパイルして出来たクラスファイル(拡張子は.class)をサーブレットコンテナにデプロイ(deploy : スクリプトや実行ファイルをサーバ上に配置して使用可能にすること)し、ブラウザやアプリでデプロイ先にアクセスすることで Java のプログラムが実行されます。
代表的なサーブレットコンテナはApache Tomcatで、Apache HTTP サーバで有名な Apache ソフトウェア財団が開発しています。
例えば以下のソース1が典型的なサーブレットです。
このソースをコンパイルしてクラスファイルを作り、クラスファイルと設定ファイルから「WAR (Web Archive Resources)ファイル」を作成し、WAR ファイルをデプロイし、ブラウザでサーバにアクセスするとプログラムが実行され、実行結果がブラウザの画面に表示されます。
※ ちなみに WAR ファイルの中身はただの zip 形式ファイルです
さてソース内にある doGet メソッドはサーバがリクエストを受けた際に「HTTP GETメソッド」を処理するためのメソッドです。
下の例では省略していますが HTTP POSTメソッドを処理する doPost メソッドもあります。
HTTP GETメソッドは HTTP 通信を行う際に、送信したいパラメータとその値を ? 記号と & 記号を使って
https://hoge.com/index.html?hoge=piyo&fuga=hogera
みたいにURL の後にくっつけてサーバにドキュメントをリクエストする方式です。
この例では hoge.com 上で動いてるサーバに対して index.html というドキュメントをリクエストする際に、 hoge というパラメータの値として piyo、fuga というパラメータに対しては hogera という値をサーバに送っています。
※ 長いデータや他人に見られたくないデータは HTTP POST メソッドを使ってサーバに送ります。HTTP POST メソッドについて詳しくは自分で調べて下さい。
この様にしてブラウザから送られてきたパラメータの値はサーブレットではソース 1 の様に HttpServletRequest.getParameter メソッドを使って取得出来ます。
ソース1の残りの部分はPrintWriterを使って HTML ドキュメントを出力しているだけです。
出力された HTML ドキュメントはネットワークを経由してそのままリクエストを行なったブラウザに送られます。
import java.io.*; import jakarta.servlet.*; import jakarta.servlet.http.*; // HttpServlet クラスを継承する public class ServletTest extends HttpServlet { // HTTP GETメソッドを処理するメソッド public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // GETパラメータの name の値を取得 // パラメータが送信されてないときは変数 name に null が入る String name = request.getParameter("name"); response.setContentType("text/html; charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE html>"); out.println("<html lang=\"ja\">"); // ダブルクオーテーションは\マークでエスケープすること out.println("<head>"); out.println("<meta charset=\"UTF-8\">"); out.println("<style>"); out.println("body{"); out.println("background: #ffff00;"); out.println("}"); out.println("</style>"); out.println("<title>タイトル</title>"); out.println("</head>"); out.println("<body>"); if( name == null ) out.println("<p>name がセットされていません</p>"); else out.println("<p>name は「"+name+"」です</p>"); out.println("</body>"); out.println("</html>"); } }