(0)目次&概説
(1) サーブレットの基本
(1-1) サーブレットとは?
(1-2) サーブレットの前身技術との比較
(1-3) サーブレットとJSPの違い
(1-4) サーブレットのHelloWorld
(2) サーブレットコンテナの基本(※別ページ)
(1) サーブレットの基礎情報
(1-1) サーブレットとは?
またサーブレットがなぜ必要か?という点について、JSPに全てのロジックを入れてしまうと、可読性や保守性が損なわれてしまいます。「ただ動けばよい」はNGで、長い視点で見た保守性を考えるとサーブレットが必要となります。JSPに埋め込むJavaコードは「出力に直接関係する」データがふさわしく、逆に「出力に直接関係しない」データはServletに記載するのが望ましいです。
観点 | JSP | Servlet |
用途 | MVCモデルの「View」の役割を果たします。Modelから受け取ったデータを画面に表示したり、Viewから入力したデータをModelに渡したりします。 | MVCモデルの「Model」の役割を果たします。Viewの入力欄からデータを読み取り、ModelとViewに適切な調整を施します。 |
特徴 | ・HTMLベースの中に部分的にJava言語を組み込んでいる | ・Javaプログラムそのもの |
記述内容 | 出力(画面表示)に直接関係する内容のJavaコードを記載する。 | 出力(画面表示)に直接関係しない内容(処理ロジックなど)のJavaコードを記述する |
(1-2) サーブレットの前身技術との比較
CGI(Common Gateway Interface)と比較すると以下の利点があります。
<Java Servlet利点>
・マルチスレッド方式のためクライアント毎にプロセス起動しない
・プラットフォームに依存しない(JavaVM上で動作するため)
・セッション管理の機能がある(同一クライアントとの一続きの処理が続く間、そのデータを保持する)
CGIはクライアントから要求がある度にプロセスを1つずつ起動していくため、要求数が多くなるとレスポンスに影響が出るという問題がありますが、サーブレットは各要求に対してプロセス内のスレッドを割り当てて処理する事でこの問題を解決しています。
<参考>マルチスレッドとマルチプロセス
マルチスレッドは一般的にマルチプロセスよりも効率が良いが、スレッド間でメモリを共有するため、排他制御が必要となる(スタックはスレッド毎に保有)。
(1-3) サーブレットとJSPの違い
JSPは内部でサーブレットに自動変換されるため、実行する過程においてはサーブレットになっています 。下図はJSPの実行の流れを表現したものですが、JSPはサーブレットコンテナによりサーブレットに変換され(①)、その後コンパイルされて”.class”のファイルが生成され(②)、最終的に実行されます(③)。
(1-4) サーブレットのHelloWorld
サーブレットのHelloWorldのプログラムを示します。特に23~29行目がJSPで同じ内容を記述する際に対応してくる部分になります。逆に残りの部分はJavaやサーブレットのお約束事コードです。
package studyc; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class HelloWorldServlet */ @WebServlet("/HelloWorldServlet") public class HelloWorldServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html; charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE html><html><head><meta charset='UTF-8' />"); out.println("<title>Hello Rainbow !</title>"); out.println("</head><body>"); out.println("<p><font size='20'>Hello Rainbow Engine !</p>"); out.println("</body></html>"); } }
上記HelloWorldを実行すると以下のような出力になります。