はしくれエンジニアもどきのメモ

情報系技術・哲学・デザインなどの勉強メモ・備忘録です。

JSPとJava Servletについて

JSPJava Servletについて

JSPJava Servletについてのメモ。

環境

JSP

JSP は、Java Server Pages の略。 画面表示とJavaの処理を行い、 HTMLとJavaが一緒になったような技術。

JSPファイルの仕組み

JSPのメリット

  • HTML内に(PHPのように)Javaのプラグラムを書ける。

JSPのデメリット

  • HTML内にJavaプログラムが混在するので可読性が下がる。

そのため、 JSPファイル内には、画面表示に関する最低限の処理を書くのが理想的になる。 (MVCモデルで設計すると改善できる。)

JSPJavaファイル

ユーザからJSPファイル(例:index.jsp)にリクエストがあった場合、サーバ側では以下の手順で処理される。

  1. index.jsp → index_jsp.java

    index.jsp ファイルが、 javaファイル(Servlet)に変換される。

  2. index_jsp.java → index_jsp.class

    javaファイルがコンパイルされ、 classファイルが生成される。

  3. classファイルから、 Javaの処理が実行され 出力するHTMLを生成する。

  4. レスポンスとして、 出力するHTMLを返す。

JSPの構文

JSPの要素

基本的な要素
名称説明構文
テンプレート HTMLで書かれた場所 <!DOCTYPE html>など
Pageディレクティブ JSPの設定を定義する場所 <%@page %>
スクリプトレット Javaプログラムを記入する場所 <% %>
スクリプト式 変数の値やメソッドの戻り値を出力する場所 <%= %>
JSPコメント JSP内のコメントを記入する場所 <%-- --%>
知っておいたほうが良い要素
名称説明
includeディレクティブ 他のJSPページを取り込む場所
tagディレクティブ 使用するタグライブラリを宣言する場所
スクリプト宣言 JSP内で変数やメソッドを宣言する場所
アクションタグ tagディレクティブで読み込んだタグを使用する場所
EL式 処理結果などを簡単に使用するための式

テンプレート

HTMLで書かれた部分。


<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>

  </body>
</html>
etc.

Pageディレクティブ

<%@page で始まり、 %> で終わる。 JSPで使用する言語や JSPページの設定(文字コードなど)を指定する。


<%@page language="java" contentType="text/html; charset=UTF-8"%>

importするライブラリを書く。


<%@page import="java.util.ArrayList"%>

スクリプトレット

<% %> の中にJavaコードを書く。 複数行も書ける。 PHPのようにHTMLと組み合わせて 跨いで書くこともできる。


<body>
  <% for(int i = 0; i < 5; i++ ){ %>
    <p>cartman</p>
  <% } %>
</body>

スクリプト

<%= で始まり、 %> で終わる。 出力関数無しで式を評価して表示できる。


<body>
  <%= 1 + 2 + 3 + 4 + 5 %> //15
</body>

JSPコメント

<%-- で始まり、 --%>で終わる。

HTMLのコメント(<!-- -->)と違って、 ブラウザからソースを開いても 画面上には表示されない。 見えてもいい場合はHTMLのコメントをつかう。


<body>
  <%-- 変数の宣言 --%>
  <% int i = 0; %>
</body>

JSPのサンプル

jspのサンプル

「はしくれ エンジニア もどきの メモ」と表示される。
実行結果

生成されるソースは以下。 JSPコメントは表示されない。

ソースコード:JSPコメントは表示されない。
ソースコード

Servlet

Java Servlet(Servlet) は、Javaの処理を行う。 サーバ側(バックエンド)での処理を担当する。

リクエストの受付窓口のようなものとなっている。

Servletの仕組み

HttpServletクラスを継承することで使える。


public class SampleServlet extends HttpServlet {

}

HttpServletクラスからオーバライドできるメソッド

メソッド名説明
doGet GETメソッドでリクエスされた場合に呼び出される
doPost Postメソッドでリクエスされた場合に呼び出される
doHead Headメソッドでリクエスされた場合に呼び出される
doPut Putメソッドでリクエスされた場合に呼び出される
doDelete DELETEメソッドでリクエストされた場合に呼び出される

HTTPメソッド

クライアント端末からサーバへ リクエストが有った場合、 サーバはレスポンスを返す。 通信プロトコル「HTTP」で振る舞いが決められている。

主に使われるHTTPメソッドは2つある。

GETメソッド

サーバに値を渡す場合、 URLに続けて値を付加する方式。 URLの後ろにクエリパラメータが付く。

POSTメソッド

サーバに値を渡す際、 見えない部分(HTTPリクエストボディ) に値を付加する方式。

一般的には「見られたくない情報を送受信するとき」に使用する。

HTTPメソッドとServletの関係

  • クライアント端末:使用されたHTTPが 「GETメソッド」の場合

    サーバ:「doGet()」が呼びだされる。

  • クライアント端末:使用されたHTTPが 「POSTメソッド」の場合

    サーバ:「doPost()」が呼びだされる。

Servletがどうやって実行されるか

リクエストが受け取ったとき、 WebコンテナであるApache Tomcat がGetかPostかなどを自動で振り分けてくれる。

振り分け処理(自動判別)後、 Getであれば、doGet()メソッドが呼ばれ、 Postであれば、doPost()メソッド が呼ばれる。

HttpServletからオーバーライドするメソッド

IDEServletファイルを新規作成した場合、 以下のメソッドは自動的にオーバーライドされる。

コメントも、NetBeansで生成されたもの。


/**
  * Handles the HTTP GET method.
  *
  * @param request servlet request
  * @param response servlet response
  * @throws ServletException if a servlet-specific error occurs
  * @throws IOException if an I/O error occurs
  */
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}

  /**
    * Handles the HTTP POST method.
    *
    * @param request servlet request
    * @param response servlet response
    * @throws ServletException if a servlet-specific error occurs
    * @throws IOException if an I/O error occurs
    */
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) hrows ServletException, IOException {

}

Servletの構文

クラス宣言部

  • @WebServlet()でリクエストがきた際に使用するURLを決める。

  • クラス宣言時に必ず「HttpServlet」を継承する。 (IDEではServletファイルを新規作成したときに自動的につく。)

  • private static final long serialVersionUID をユニークになるように決める。

    参考:http://java-study.blog.jp/archives/1021151333.html


@WebServlet(urlPatterns = {"/SampleServlet"})
public class SampleServlet extends HttpServlet {
  private static final long serialVersionUID = 1L;
  ...
}

コンストラク

NetBeansでは自動で追加されないようなので手動で書く。


/**
 * コンストラクタ.
 */
 public SampleServlet() {
  super();
 }

メソッド

Servletファイルを新規作成すると、 doGet()doPost() が自動的にオーバーライドされる。


/**
 * Handles the HTTP GET method.
 *
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}

/**
 * Handles the HTTP POST method.
 *
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}

Servletのサンプル

Servletで簡易なWebページをつくるサンプル。

Servletのサンプル

実行結果

まとめ

JSPのまとめ

  • 画面(HTML)とサーバ(Java)の橋渡し役であり、 実態はjavaファイル。

  • JSPにはHTMLタグとは異なる独自タグがあり、 Javaの処理と組み合わせるために必要となる。

  • JSP内にJavaプログラムを組み合わせて動的に画面を作成できる。

Servletのまとめ

  • Servletはリクエストを受け付ける窓口の役割

  • Servletは決まったmethod(getやpostなど)で 呼び出されたメソッド(doGetやdoPostなど)の処理を書く。

  • JSPだけでなく、ServletでHTMLの画面を作成して出力もできる。