JSP (JavaServer Pages) は Java サーブレットのように動的にページを作成できます。 サーブレットと異なり、HTML とクラスファイルが分かれておらず、ひとつのファイル (*.jsp) になっています。 JSP は実際のところ、アプリケーションサーバーが自動的にサーブレットを生成してくれるだけです。

JSPタグ

JSPのページはHTMLのタグだけでなく、JSPタグも使用できる。サーバ側のJSPコンテナがJSPからサーブレットを作成する際にJSPタグが解釈されて、出力HTMLが作成される。

分類 タグ 説明
コメント <%-- comment --%> HTMLには出力されないJSPコメント
スクリプトレット <% scriptlet %> Java言語の埋め込み
<%= expression %> 値の表示
宣言 <%! declaration %> 宣言文
ディレクティブ <%@ include %> 更に読み込み
<%@ page %> ページ設定
<%@ taglib %> 独自タグ設定
アクション <jsp:include> 更に読み込み
<jsp:useBean> JavaBeansの利用設定
<jsp:getProperty> JavaBeansのプロパティの値取得・表示
<jsp:setProperty> JavaBeansのプロパティの値設定
<jsp:plugin> Java Plug-inによる表示(アプレット)
<jsp:forward> 別のページに転送 (Forward)
JSTL <c:out> 値を出力する。
<c:set> 変数に値を設定する。
<c:remove> 変数を削除する。
<c:forEach> 繰り返し処理
<c:forTokens> 文字列を区切り文字で分けたトークンを順次処理する。
<c:if> 条件分岐
<c:choose> switch case分岐
<c:when>
<c:otherwise>
<c:catch> 例外を補足する。
<c:import> 外部のコンテンツをインポートする。
<c:url> パラメータをURLエンコードする。
<c:redirect> URLのリダイレクトする。
<c:param> <c:import><c:url><c:redirect>で使用するパラメータを設定する。
<fmt:formatDate> 日付データを指定した書式で出力する。
Struts 2タグライブラリ <s:if> 条件が真の場合、処理を実行する。
<s:a> HTMLの<a>タグを生成する。
<s:checkbox> HTMLの<input type="checkbox">タグを生成する。
SAStrutsタグライブラリ <s:form> <form>タグを出力する。
<s:link> <a>タグを出力する。
<s:submit> <input type="submit">タグを出力する。
分類 タグ 説明

アクション

<jsp:param>タグ

<jsp:param>タグは、キーと値のペアを指定する。<jsp:param>タグは<jsp:include>タグ内で使われる。

<jsp:param name="parameterName" value="parameterValue">

<jsp:param>タグのサンプルを示す。

<jsp:include>
  <jsp:param name="sessionid" value="1">
  <jsp:param name="username" value="marina">
</jsp:include>

<jsp:useBean>タグ

使用するBeansオブジェクトのインスタンスを生成し、その有効範囲(スコープ)を指定します。

<jsp:useBean id="instancename" class="classname" />

id オプションはBeanオブジェクトのインスタンス名を指定します。classオプションはBeanオブジェクトのクラス名を指定します。

<html>
 <head><title>JSP useBean sample</title></head>
 <body>
  <jsp:useBean id="counter" scope="session" class-"sampjsp.Counter" />
  <%
    if((request.getParameter("reset")) != null)
      counter.reset();
    if((request.getParameter("inc")) != null)
      counter.inc(count);
    if((request.getParameter("dec")) != null)
      counter.dec(count);
  %>
  <h1>カウンタの増減</h1>
  <p>カウンタの値: <%= counter.getCount() %></p>
  <form method="post" action="incsamp.jsp">
   <input type="submit" name="inc" value="増やす">
   <input type="submit" name="dec" value="減らす">
   <input type="submit" name="reset" value="リセット">
  </form>
 </body>
</html>

Counter.java

package sampjsp;
public class Counter {
  int count;
  public Counter() {
    count = 0;
  }
  public void setCount(int c) {
    count = c;
  }
  public int getCount() {
    return count;
  }
  public void inc() {
    count++;
  }
  public void dec() {
    count--;
  }
  public void reset() {
    setCount(0);
  }
}

上記のJSPを実行した際、ブラウザに送信されるHTMLを次に示します(countの値が3になっている状態の例)。

<html>
 <head><title>JSP useBean sample</title></head>
 <body>
  <h1>カウンタの増減</h1>
  <p>カウンタの値: 3</p>
  <form method="post" action="incsamp.jsp">
   <input type="submit" name="inc" value="増やす">
   <input type="submit" name="dec" value="減らす">
   <input type="submit" name="reset" value="リセット">
  </form>
 </body>
</html>

Servletの問題点

HTMLを生成するサーブレットプログラムを書くと、HTMLタグを出力するprintメソッドが連なったコーディングになってしまいます。これでは最終的に生成されるHTMLを想像しづらくなります。それに、画面生成プログラムを各場合には、まずHTMLで画面設計をして、それをJavaプログラム中のprintメソッドにいちいち置き換えていくという作業となります。これは2度手間になります。

また、画面の変更が大仕事になるという点にも問題があります。Webの画面を変更したいという要求は頻繁に発生するでしょう。しかし、本番稼動中のServletプログラムには手を入れたくない場合もあります。結局、HTMLは直らず魅力が無いWebページが残りつづけるということになりかねません。

なお、こうした問題はCGIプログラムを各場合でもまったく同様です。

これらの問題を解決する技術として登場したのがJSPです。HTMLファイルの中にJavaコードを含めることができます。この点はASP (Active Server Pages)と似ています。

ServletだけでHTMLファイルを生成すると・・・

問題1:プログラムコードのあちこちでHTML生成用のprintメソッドを呼び出すため、最終的なHTMLファイルを想像しづらい。

問題2:HTMLファイル(出力画面)を手作業でprintメソッドに書き直すことになり、手間が増える。

問題3:出力画面を変更するのにServletのコード修正が必要

解決策:プレゼンテーション部分をJSPとして分離する。

JSPのスクリプト(Scriptlet)だけでロジックを記述しようとすると・・・

→ServletからJSPを呼び出す。ロジックはServlet、プレゼンテーションはJSPと分離する。

JSPではJavaによるスクリプト「Scriptletを記述できる。ちょっとしたプログラムを組んだWebページを作ることも可能である。

ただJSPだけでプログラムを作ろうとすると、やはり問題が出てくる。Scriptletの間でデータ交換したり、複数のscriptletを並行動作させるといった使い方はJSPだけでは実現しづらい。

ちょっとしたWebプログラムであれば、JSPだけでも作成可能だが、本格的なシステム構築ではServletとJSPを組み合わせて利用することが望ましい。

ASPとJSPの違いは

  1. Visual Basicだけでなく、Javaによるプログラムを記述できる
  2. 複数のWebアプリケーション・サーバ製品でサポートが予定されている。
  3. WindowsだけでなくUNIXサーバでも動作する。

HTML中に直接Javaコードを挿入しておくと、そのHTMLのロード時に自動的かつ一瞬でそれをServlet化し、コンパイルと実行をします。

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

パッケージをインポートするには次のように記述します。

<%@ page import="java.io.*, java.util.*" %>

リクエスト時に jspInit() が呼ばれ、処理終了後 jspDestroy() が呼ばれます。JSPページ中で生成されたオブジェクトは、参照可能な範囲(スコープ)を持ちます。

Fixed Template Data: JSPページ中で直接表記されたHTML部分

Directives: リクエストごとに共有の属性を指定したりする部分

Actions: 処理の詳細を記述する部分

Directives
    <%@ directive ... %>
Actions:
    <xxx xxx="xxx" ... >xxx</xxx>

または

<xxx xxx="xxx" ... >

タグの種類を増やす「Tag extention mechanism」も用意されています。

Scripting elements: declarations/scriptlets/expressions

declarations: パラメータを定義するもの

scriptlets: サブルーチン的に利用されるもの

expressions: リクエストごとに実行されるもの

Javaとの連携が可能なら自由にScripting elementsを定義して実装することもできます。

Bean: Tagインタフェースを実装すると、直接HTMLのコードとの連携が行えます。

Scripting elementsは読みにくく、メンテナンスがしにくいので、多くの場合は単にactionをまとめるための記述に使われる程度でしょう。

XMLに従ってJSPページを記述する方法もあります。

JSPページから生成されるのがHTMLとは限りません。XMLやプレーンテキストも生成可能です。

JPSページ内で発生し、かつcatchされていないThrowableは、ServletRequestオブジェクトの"javax.serlet.jsp.jspException"という名前のattributeとしてputAttribute()されます。

「page isErrorPage=true」というdirectiveで指定されたページにexceptionという変数にそのthrowableを格納して転送することもできます。

JSPページ内のコメント:

<%--- コメント ---%>
<% /** コメント **/ %>

JSPのコメントはネスト(入れ子)はできません。

JSPで生成されたHTML(またはXML)中のコメント:

JSPページ内に「<--- コメント --->」と書けば、そのまま出力されます。

JSPページ内で「<%」をtemplateに書きたければ「<\%」と書きます。

JSPページ内で「%>」をtemplateに書きたければ「\%>」と書きます。

「"」や「'」をtemplateに書きたければ「\"」や「\'」と書きます。

directiveは「<%@ xxx xxx = "xxx" xxx = "xxx" ... %>」と書きます。

通常のHTMLの「Server side include」はJSPに無効なので注意。

<%@ page xxx="xxx" %>
language="java"
extends="xxx.xxx.xxx"
import="xxx.xxx.xxx.*"
session="true"
buffer="none"
autoFlush="true"
isThreadSage="true"
info="xxx"
isErrorPage="true"
erroPage="xxx.jsp"
contentType="xxx; charset=xxx"
extends
JSPページから生成されたサーブレットのスーパークラスを指定
import
JSPページから生成されるサーブレットにimportされるパッケージ
session
意味
true サーブレットはセッションに組み込まれる(規定値)
false サーブレットはセッションに組み込まれない
buffer
意味
none そのまま出力される
数字kb 数字を指定すると、そのサイズだけ蓄積されてからフラッシュされる
autoFlush
意味
true バッファがオーバーフローしたときに自動的にフラッシュする
false バッファがオーバーフローしたときにExceptionとなる
isThreadSafe
意味
true 同時に呼ばれる(規定値)
false 同時に呼ばれない
info
Servlet.getServInfo()が返す文字列
isErrorPage
他のサーブレットで発生したExceptionを参照するか否かを指定します。典型的にはエラー処理用のページに指定されます。

true を指定すると、exception という半数が参照可能になります。Exception は ServletRequestの"javax.servlet.jsp.jspExecption"という名前のarrributeとしてセットされます。

意味
true 他のサーブレットで発生したExceptionを参照する
false 他のサーブレットで発生したExceptionを参照しない
errorPage
エラー時の処理を行うJSPページのURLを指定する。
contentType
iso-2022-jp などのキャラクタセットを指定する。

Scripting elementsとしては「declaration」「scriptlet」「expression」の3種類がある。

declaration: <%! declaration %>

scriptlet: <% scriptlet %>

expression: <%= expression %>

Actionエレメントの属性は、ひとつのステートメントを使って動的に生成できる。String以外の型を「type」属性に宣言することで使えます。デフォルトはString。

2つ以上のステートメントは使えません。属性名のほうは動的に変更できません。

属性地をコンパイル時に決定するような書き方もできます。この方法とステートメントで属性値を生成する方法は両立しません。

「id="..."」でActionエレメントで定義されたオブジェクトを名前で参照することができます。「id="..."」で名前が付けられたオブジェクトは「scope="..."」に書かれた範囲で参照可能。

scope=page/request/session/application

Standard Actions

<jsp:useBean>

beanName: クラス名またはserファイル名

<jsp:useBean> ... </jsp:useBean>

間に通常のJSPコードを挿入することができます。これはBeanの初期化コードを書き込んで確実に初期化するときなどに使います。

idは大文字小文字の区別があります。

<jsp:setProperty>

property="*"とすると、ServletRequest中に格納されているxxx=xxxの全ての組合せについて、そのままBeanのプロパティとして格納される。

param="..."を指定すると、ServletRequest中のその名前の属性がBeanに同じ名前でセットされる。

value="..."は直接値を指定する書き方。paramとの併用はできない。

ServletとJSPを使い分ける

ServletとJSPを同使い分ければよいのか。その指針を次に示します。

  1. ServletからcallPageメソッドでJSPを呼び出す。HTMLを生成するprintメソッドがなくなるため、Servletプログラマはビジネス・ロジックに専念できる。
  2. ServletプログラマはHTML(出力画面)の作成に必要なデータをJavaオブジェクトにセーブする。
  3. JSPを作成するデザイナーは、JSPの <USERBEAN> タグでJavaオブジェクトへ取り込み、<DISPLAY> タグで属性の値を取り出す。
  4. ServeltとJSPファイルはそれぞれ独立してバージョンアップできる。

利用者からの要求を受け付け、セッションを管理するのはServletである。JSPはServletから呼び出されてHTMLによる出力画面を生成します。

ServletからJSPにデータを渡す手段もあらかじめ用意されています。JSPを呼び出すサーブレットは出力画面を生成するのに必要なデータをJavaオブジェクトに格納した後にcallPageメソッドを使いJSPを呼び出します。

JSPファイルの中では、Java負ぶえじぇ区とを取り込む <USERBEAN> タグ、その属性を取り出して表示する <DISPLAY> タグという専用タグを利用できます。

この枠組みを使うことで、JSP側にはロジックは一切持たせないで開発を進めることができます。

ServletかとJSPを併用するメリットは、ビジネスロジックとプレゼンテーション(画面作成)をきれいに分離できることです。サーブレットの開発者はJavaプログラマである必要がありますが、JSPファイルならばWebデザイナーでも書けるでしょう。ロジックを作るプログラマとプレゼンテーションを作るデザイナーとの分業が可能となります。システム開発の規模が大きくなれば、この分業は効果的になるでしょう。

インクルード・ディレクティブ (Include Directive)

インクルード・ディレクティブは、JSPやHTMLの外部ファイルを取り込みます。

インクルード・ディレクティブには2種類あり、それぞれ若干機能が異なります。

<%@ include file="filename" %>

JSPファイルの初回起動時に読み込まれます。

file オプションにはJSPファイルとHTMLの両方を指定することができます。

<jsp:include page="filename" flush="true" />

ブラウザからの呼び出し(リクエスト)の度ごとに読み込まれます。

page オプションにはJSPファイルのみを指定できます。

flush オプションには必ず true を指定します。

incsamp.jsp:

<html>
 <head><title>JSP include sample</title></head>
 <body>
  <jsp:include page="counter.jsp" flush="true" />
  <%@ include file="counter.html" %>
 </body>
</html>

counter.jsp:

<%!
  int count = 0;
  public int inc(int c) { if(c<10) return ++c; else return c; }
  public int dec(int c) { if(c>0) return --c; else return c; }
  public int reset() { reutrn 0; }
%>
<%
  if((request.getParameter("reset")) != null)
    count = reset();
  if((request.getParameter("inc")) != null)
    count = inc(count);
  if((request.getParameter("dec")) != null)
    count = dec(count);
%>
<h1>カウンタの増減</h1>
<p>カウンタの値: <%= count %></p>

counter.html:

<form method="post" action="incsamp.jsp">
 <input type="submit" name="inc" value="増やす">
 <input type="submit" name="dec" value="減らす">
 <input type="submit" name="reset" value="リセット">
</form>

上記のJSPを実行した際、ブラウザに送信されるHTMLを次に示します(countの値が3になっている状態の例)。

<html>
 <head><title>JSP include sample</title></head>
 <body>
  <h1>カウンタの増減</h1>
  <p>カウンタの値: 3</p>
  <form method="post" action="incsamp.jsp">
   <input type="submit" name="inc" value="増やす">
   <input type="submit" name="dec" value="減らす">
   <input type="submit" name="reset" value="リセット">
  </form>
 </body>
</html>

JSPで初めから宣言せずに使用できる特別なオブジェクト

out (javax.servlet.jsp.JspWriter)

outはクライアント(ユーザのブラウザ画面)への出力ストリームを表しており、print(), println()メソッドでHTMLタグなどを送信するのに使用します。

out.print()メソッドとout.println()メソッドの違いは、改行をするかしないかの点です。ただし、その改行とはCR+LFのことであって、<br>タグのことではありません。

request

requestは、javax.servlet.ServletRequestクラスのオブジェクトです。クライアントから受信したパラメータやデータを送信してきたクライアントのIPアドレスなどを取り出すことができます。

requestオブジェクトが持つメソッドのうち、最もよく使われるであろうgetParameter()メソッドですが、これはひとつのパラメータを取り出します。しかし、checkboxを使用する場合は、名前はひとつでも複数の値を送信してきます。そんなときにはgetParameterValues()メソッドを使用します。

requestオブジェクトの使用例を次に示します。

if(request.getParameter("reset") != null)
    counter.reset();

response (javax.servlet.ServletResponse)

responseはServeletResponseのサブクラスなのですが、実際にはHttpServletResponseのメソッドが使用できます。クライアント(ユーザのブラウザ画面)に送信すべきtext/htmlなどのデータをセットするのに使用できます。

session (javax.servlet.http.HttpSession)

sessionはHttpSessionクラスのオブジェクトで、クライアントに接続していることを示すためのセッションIDを保持しています。クライアントが接続している間はページの間をまたがってオブジェクトを保持させておくことができます。

application (javax.servlet.ServletContext)

applicationはjavax.servlet.ServletContextクラスのオブジェクトです。これをサーブレット内で取得しようとするとgetServletConfig().getServletContext()などとしなければならないが、JSPではこのようにあらかじめ用意されています。

config (javax.servlet.ServletConfig)

configはサーブレット内ではgetServletConfig()などとして取得しなければなりませんが、applicationと同様にJSPではあらかじめ用意されています。初期設定パラメータを取得するのに使用します。

pageContext (javax.servlet.jsp.PageContext)

page (javax.lang.Object)

exception (javax.lang.Throwable)

このエントリーをはてなブックマークに追加
スポンサーリンク