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

JSPタグ

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

分類 タグ 説明
コメント <%-- comment --%> HTMLには出力されないJSPコメント
スクリプトレット <% statements %> 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 1タグライブラリ <html:base> <base>タグを出力する。
<html:button> <input type="button">タグを出力する。
<html:cancel> <input type="submit">タグを出力する。validate回避用。
<html:checkbox> <input type="checkbox">タグを出力する。
<html:errors> requestスコープに格納されているActionErrorsオブジェクトの内容を出力する。
<html:file> <input type="file">タグを出力する。
<html:form> <form>タグを出力する。
<html:frame> <frame>タグを出力する。
<html:html> <html>タグを出力する。
<html:image> <input type="image">タグを出力する。
<html:img> <img>タグを出力する。
<html:javascript> validate用JavaScriptを出力する。
<html:link> <a>タグを出力する。
<html:messages> requestスコープに格納されているActionMessageオブジェクトの内容を出力する。
<html:multibox> <input type="checkbox">タグを出力する(配列型)。
<html:option> <option>タグを出力する。
<html:options> Collection型(配列)を利用し<option>タグを出力する。
<html:optionsCollection> Collection型(配列)を利用し<option>タグを出力する。
<html:password> <input type="password">タグを出力する。
<html:radio> <input type="radio">タグを出力する。
<html:reset> <input type="reset">タグを出力する。
<html:rewrite> リンク先URL文字列を出力する。JavaScript用。
<html:select> <select>タグを出力する。
<html:submit> <input type="submit">タグを出力する。
<html:text> <input type="text">タグを出力する。
<html:textarea> <textarea>タグを出力する。
<html:hidden> <input type="hidden">タグを出力する。
<logic:empty>属性が空の場合、処理を実行する。
<logic:equal>属性が指定した値と等しい場合、処理を実行する。
<logic:forward>リクエストを指定したパスへ転送する。
<logic:greaterEqual>属性が指定した値以上の場合、処理を実行する。
<logic:greaterThan>属性が指定した値より大きい場合、処理を実行する。
<logic:iterate>指定したコレクションで処理を実行する。
<logic:lessEqual>属性が指定した値以下の場合、処理を実行する。
<logic:lessThan>属性が指定した値より小さい場合、処理を実行する。
<logic:match>属性が指定した文字列を含む場合、処理を実行する。
<logic:notEmpty>属性が空でない場合、処理を実行する。
<logic:notEqual>属性が指定した値と等しくない場合、処理を実行する。
<logic:notMatch>属性が指定した文字列を含まない場合、処理を実行する。
<logic:notPresent>属性が存在しない場合、処理を実行する。
<logic:Present>属性が存在する場合、処理を実行する。
<logic:redirect>指定したパスへリダイレクトする。
<logic:messagesPresent>requestスコープに格納されているActionErrosオブジェクトが存在する場合、処理を実行する。
<logic:messsagesNotPresent>requestスコープに格納されているActionErrorsオブジェクトが存在しない場合、処理を実行する。
<bean:cookie>クッキーを取得する。
<bean:define>Beanプロパティを取得する。
<bean:header>HTTPヘッダを取得する。
<bean:include>JSPページの出力を取得する。
<bean:message>MessageResourcesからメッセージを取得して表示する。
<bean:page>pageContextから暗黙オブジェクトを取得する。
<bean:parameter>リクエストパラメータを取得する。
<bean:resoruce>Webアプリケーションのリソースを取得する。
<bean:size>配列やコレクションの要素数を取得する。
<bean:struts>Struts-config.xmlを取得する。
<bean:write>Beanのプロパティを表示する。
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にコメントを記述できる。JSPのコメントはレンダリングする際に削除されるので、JSPコンテナが生成したHTMLには残らない。したがって、Webブラウザで「ソースの表示」を行っても、JSPのコメントを見ることはできない。

<%-- comment -->

コメントを使用したJSPの例を次に示します。

<html>
  <head>
    <title>An example of JSP comment</title>
  </head>
  <body>
    <!-- HTML COMMENT -->
    <%-- JSP COMMENT --%>
    <p>This is an exsample of JSP comment.</p>
  </body>
</html>

上記のJSPを実行した際、ブラウザに送信されるHTMLを次に示します。

<html>
  <head>
    <title>An example of JSP comment</title>
  </head>
  <body>
    <!-- HTML COMMENT -->
    <p>This is an exsample of JSP comment.</p>
  </body>
</html>

スクリプトレット

JSPタグのスクリプトレットは、JSPにJava言語のソースコードを埋め込むことができます。

<% code %>

code にはJava言語のソースコードを指定します。

JSPのソース

<html>
 <head><title>Scriptlet sample</title></head>
 <body>
  <% out.println("<p>Scriptlet sample</p>"); %>
 </body>
</html>

ブラウザに送信されるソース

<html>
 <head><title>Scriptlet sample</title></head>
 <body>
  <p>Scriptlet sample</p>
 </body>
</html>

JSPのソース

<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-2022-jp">
  <title>Scriptlet sample</title>
 </head>
 <body>
  <%! String kanSuji = "一二三四五"; %>
  <%
    kanSuji = new String(kanSuji.getBytes("ISO2022JP"), "JISAutoDetect");
    for (int i = 0; i < 5; i++) {
      out.println(kanSuji.charAt(i) + "<br>");
    }
  %>
 </body>
</html>

ブラウザに送信されるソース

<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-2022-jp">
  <title>Scriptlet sample</title>
 </head>
 <body>
  一<br>
  二<br>
  三<br>
  四<br>
  五<br>
 </body>
</html>

<%= expression %>

expression には定数または変数を指定します。

JSPのソース

<html>
 <head><title>Hello! JSP</title></head>
 <body>
  <%= "<p>JSP</p>" %>
 </body>
</html>

ブラウザに送信されるソース

<html>
 <head><title>Hello! JSP</title></head>
 <body>
  <p>JSP</p>
 </body>
</html>

JSPのソース

<html>
 <head><title>Hello! JSP</title></head>
 <body>
  <p>HTML</p>
  <%! String text="<p>JSP</p>"; %>
  <%= text %>
 </body>
</html>

ブラウザに送信されるソース

<html>
 <head><title>Hello! JSP</title></head>
 <body>
  <p>HTML</p>
  <p>JSP</p>
 </body>
</html>

JSPのソース

<html>
 <head><title>Print Numbers</title></head>
 <body>
  <h1>Print Numbers</h1>
  <% for (int i = 1; i <= 5; i++) { %>
  <%= "<p>" + i + "</p>" %>
  <% } %>
 </body>
</html>

ブラウザに送信されるソース

<html>
 <head><title>Print Numbers</title></head>
 <body>
  <h1>Print Numbers</h1>
  <p>1</p>
  <p>2</p>
  <p>3</p>
  <p>4</p>
  <p>5</p>
 </body>
</html>

宣言

このタグの中に変数やオブジェクトのインスタンスの使用宣言を書き込むと、初回のJSPファイルの起動で変数やインスタンスが生成されます。サーバが起動されている間、それらは値を保持します。それらの値はJSPファイルを使用するクライアント全てに共通です。そしてメソッドも定義しておくことができます。

<%! 宣言文 %>

次にJSPの宣言文を使用したソースの例を示します。countは0から10までの値をとるようにしています。「増やす」ボタンで増加、「減らす」ボタンで減少、「リセット」ボタンで0に戻ります。

<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-2022-jp">
  <%!
    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(int c) { return 0; }
  %>
  <title>JSP Declaration sample</title>
 </head>
 <body>
  <%
    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>
  <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を実行した際、ブラウザに送信されるHTMLを次に示します(countの値が3になっている状態の例)。

<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-2022-jp">
  <title>JSP Declaration 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>

ディレクティブ

pageディレクティブ

JSPのpageディレクティブは、エンコード方式、クラスのインポート及びセッション管理などJSPプログラム全体の動作に関する定義を行う。

<%@ page arrtibute=value ... %>

arrtibuteにはpageディレクティブの属性名を指定する。valueには属性に設定する値を指定する。pageディレクティブに指定できる属性を次に示す。

language

JSPで使用する言語を指定する。デフォルト値はjavaである。

import

インポートするクラス及びパッケージを指定する。カンマで区切って複数指定することができる。

session

セッションを有効にするかどうかを指定する。

buffer

バッファのサイズを指定する。

autoFlush

バッファを自動的にフラッシュするかどうかを指定する。

isThreadSafe

スレッドセーフで実行するかどうかを指定する。

info

コメントを指定する。

errorPage

エラーが発生したときに表示するページを指定する。

isErrorPage

エラー表示用のページかどうかを指定する。

contentType

応答の際のMIMEタイプ及び文字コードを指定する。

pageEncoding

JSPの文字コードを指定する。

isElIgnored

EL式を適用するかどうかを指定する。

JSPのpageディレクティブの例を示す。

<%@ page contentType="text/html; charset=windows-31j" pageEncoding="windows-31j" %>
<%@ page import="java.io.*" %>
<%@ page import="java.util.HashMap" %>

taglibディレクティブ

<%@ taglib arrtibute=value ... %>

arrtibuteにはtaglibディレクティブの属性名を指定する。valueには属性に設定する値を指定する。tablibディレクティブに指定できる属性を次に示す。

uri

名前空間を識別するためのURI

prefix

カスタムタグの接頭辞

アクション

<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>

Struts 1タグライブラリ

<html:errors>

requestスコープに格納されているActionErrorsオブジェクトの内容を表示する。

<hml:erros [attribute=value ...] />
bundle

リソースファイルを保持しているBean名

locale

Localeオブジェクトを格納しているsessionスコープのBean名

name

エラーメッセージが格納されているBean名

property

Beanのプロパティ名。省略した場合はすべてが表示される。

<html:errors />

<html:hidden>

<html:hidden attribute=value ... />
property

Beanのプロパティ名(必須項目)

styleId

識別子

value

フィールドの初期値

<html:hidden property="salary" styleId="salary" value="${salary}" />

<bean:message>

MessageResourcesからメッセージを取得して表示する。

<bean:message attribute=value ... />
key

メッセージキー

name

メッセージキーが格納されているBean名

property

Beanのプロパティ名

arg0
arg1
arg2
arg3
arg4

メッセージ内の {} に代入する文字列

bundle

MessageResourcesオブジェクトを格納しているapplicationスコープのBean名

locate

Locateオブジェクトを格納しているsessionスコープのBean名

scope

スコープ

<bean:message key="${msgKey}" />

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)

スポンサーリンク