JSP
本資料で説明する内容
・JSPのしくみ
・スコープ(scope)
・暗黙のオブジェクト
・スクリプト要素(Scripting elements)
・ディレクティブ(directive)
・JSPアクションタグ(JSP action tag)
JSPについての解説がweb上にたくさん掲載されています。特にタグについては豊富ですので、本資料は主要なタグを紹介するにとどめます。詳細はweb上の解説を参照して下さい。参考になるweb上の資料の例は本資料末に記載しています。これに限らず、気に入ったものを検索して使って下さい。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1.JSPのしくみ
図1.1は、JSPに記述した内容がどのようにしてクライアント(ブラウザ)に送信されるのかを示す図です。
図1.1JSPからhtmlへの変換
JSPはいったんJavaのソースに変換されます。それがコンパイルされて実行されるのです。
サーブレットコンテナ(例:TOMCAT *1)がJSPのコードをJavaのコードに変換します。サーブレットコンテナのこの機能を持つ部分をJSPエンジンと呼びます。図1.2にJSPの実行を受け持つソフトウェアの構成を示します。
注*1webコンテナとも呼ばれます。
図1.2 JSPを実行するソフトウェア
JSPから変換されてできるJavaのクラスはサーブレットクラス(javax.servlet.GenericServlet)を継承したクラスです。サーブレットクラスを継承したクラスを通常、単にServlet(サーブレット)と呼んでいます。
JSPだけ使っている限りは、サーブレットについて深く知る必要はありません。それでも、コンパイルエラーや実行時のエラーの内容を理解するには、サーブレットを意識せざるを得ないこともあります。
JSPから変換されたサーブレットではなく、直接、コードを書いたサーブレットを本資料では「ナマ」のサーブレットと呼ぶことにします。この用語は一般には通用しません。
「ナマ」のサーブレットとJSPは違った目的で使われます。JSPはブラウザに表示される画面を作ることを目的としています。それに対して「ナマ」のサーブレットはクライアントからの入り口として、入力の内容に従って処理を分ける目的で使われます。「ナマ」のサーブレットとJSPの役割分担を考えたプログラムの構造を図1.2に示します。実際のアプリは、通常、この構造で作られます。これについては後に説明します。
学習が目的の演習では、「業務の処理」部分は省略するか、仮のものが多いです。
図1.3webアプリの構造
2.スコープ
言語レベルのスコープ(scope)と趣旨は似ています。言語の場合は、クラスやメソッド、ブロックの内と外の関係から変数の参照できる範囲(可視範囲)をスコープと呼んでいます。
JSPの場合のスコープはブラウザとサーバとの交信(要求とそれに対する応答)の時間的な推移に関係して、オブジェクトを参照できる範囲、オブジェクトが「生きている」期間を意味します(*1)。
注*1各生存期間を持つ変数を保持する「場所(ロケーション)」(オブジェクト)という意味で使われる場合があります。
具体的な例をあげると、複数の「要求-応答」を繰り返す操作を考えた場合、ある一つの要求の処理に、その一つ前の要求で使った変数(オブジェクト)が使えるとは限らないということです。後に説明するrequestスコープは、特定の(一つの)「要求-応答」区間を指します。requestスコープの変数は、複数の「要求-応答」の間で共通に使えません。
JSPには四つのスコープがあります。図2.1はこれらを図で表現したものです。
図2.1 スコープ
図2.1の中で太字で記述しているページ、リクエスト、セッション、アプリケーションがスコープです。それぞれ、長円で束ねている範囲が各スコープに対応します。includeは子のJSPを取り込む機能で、forwardは別のJSPに移行する機能です。これらについては後に説明します。
表2-1は四つのスコープをまとめたものです。
表2-1 スコープ
# |
スコープ名 |
Servlet |
JSP |
説明 |
1 |
ページ Page |
無 |
有 |
一つの画面が複数のJSPで構成されることがあります。構成要素となる一つのJSPの処理中だけのスコープです。 |
2 |
リクエスト Request |
有 |
有 |
あるクライアント(ブラウザ)からの一つの要求を受けて応答を戻すまでのスコープです。 |
3 |
セッション Session |
有 |
有 |
ある特定のクライアントが、(通常は複数回の)要求を出して、結果を得て、該当アプリから離れるまで(セッション)の間のスコープです。 |
4 |
アプリ ケーション Application |
有 |
有 |
(特定の)webアプリが起動されてから終わるまでのスコープです。異なるユーザ間のすべてのページ、リクエスト、セッションにまたがり、(該当アプリの)どのJSPでも有効です。 |
四つのスコープには包含関係があり、次の順序で並べると、後者は前者を含みます。
ページ ⊆ リクエスト⊆ セッション ⊆ アプリケーション |
ページスコープはJSPに固有のスコープで「ナマ」のサーブレットにはありません。一つの画面を複数の画面から構成する場合(*1)や、別のJSPに移る場合(*2)に個々のJSPで有効なスコープです。
注*1 後に説明するincludeディレクティブ、includeアクションタグを参照下さい。
*2 後に説明するforwardアクションタグを参照下さい。
3.暗黙のオブジェクト(インスタンス)
暗黙のオブジェクトはJSPの記述者(開発者)が値を設定しなくても、値が設定されて提供される参照(リファレンス)が指すオブジェクトです。参照の名前(変数名)は決められています。
暗黙のオブジェクトを表3-1に示します。
各オブジェクトの詳細は参考資料(1)のJ2EEマニュアルの各クラスを参照して下さい。
表3-1 暗黙のオブジェクト
# |
変数名 |
スコープ |
型 |
説明 |
1 |
out |
page |
javax.servlet.jsp .JspWriter |
出力ストリーム |
2 |
page |
page |
java.lang.Object。 |
現ページのインスタンス。Javaの'this'に対応。 javax.servlet.GenericServletでキャストできます。 |
3 |
pageContext |
page |
javax.servlet.jsp .PageContext
|
ページに関するメソッドを集約したオブジェクト。 |
4 |
request |
request |
javax.servlet.http .HttpServletRequest |
ブラウザからの要求に関するデータ/メソッドを集約したオブジェクト |
5 |
response |
page |
javax.servlet.http .HttpServletResponse |
ブラウザへの応答を作るためのデータ/メソッドを集約したオブジェクト |
6 |
session |
session |
javax.servlet.http .HttpSession |
セッションの間、生存するオブジェクト。セッションを破棄する機能も持つ。 |
7 |
application |
application |
javax.servlet .ServletContext |
アプリの生存期間と同じ生存期間を持つオブジェクト。 |
8 |
config |
page |
javax.servlet .ServletConfig |
サーブレットの初期設定のパラメータを処理するメソッドを持つオブジェクト |
9 |
exception |
page |
java.lang.Throwable |
例外のインスタンス。エラーページからしかアクセスできない。 |
pageContext、request、session、applicationはそれぞれ、アトリビュート(attribute)と呼ぶプロパティを持っています。これは(キー/値)対のデータを保存するオブジェクトです。Mapそのものではありませんが、Mapのget()/put()メソッドに対応するgetAttribute()/setAttribute()メソッドを持っています。このアトリビュートをコンテキストと呼ぶ場合もあります。本資料では分かりやすいアトリビュートを使います。
pageContext、request、session、applicationはそれぞれ、ページ、リクエスト、セッション、アプリケーションのスコープのオブジェクトです。これらのアトリビュートに保存される(キー/値)対の値(オブジェクト)は、対応するスコープを持ちます。
JSP間で参照しあうオブジェクトは、必要なスコープに合わせて、pageContext、request、session、applicationのいずれかのオブジェクトのアトリビュートに保管します。次はセッションのアトリビュートにuseridを保管/参照するコード例です。
<%-- 保管 --%> <% ... String userid = ...; // useridを設定 ... session.setAttribute("jp.co.ichi.myapp.userid",userid); %> <%-- 参照 --%>
<% String userid = (String)session.setAttribute("jp.co.ichi.myapp.userid");
%> |
アトリビュートに保管される(キー/値)対の値は任意のオブジェクトです。そのため、取得する場合は(必要なら)キャストする必要があります。
アプリの中でユニークでないキーは予期しない問題を起こす恐れがあります。キーの作り方のルールを決めておく必要があるでしょう。通則では、パッケージと同じ、url反転ルールに従います。
これらの暗黙のオブジェクトは、JSP宣言(<%!...%>)の中のメソッドの中では参照できません。
暗黙のオブジェクトは「ナマ」のサーブレットに絡んだオブジェクトであるため、htmlの作成に使わない機能(データ/メソッド)も含んでいます。htmlを作るというJSP本来の目的に沿うメソッドを中心にして、各暗黙オブジェクトを紹介します。
3.1page
自身のJSP(*1)のインスタンスの参照です。Javaに変換されたとき、「this」に等しい変数です。javax.servlet.GenericServletクラスを継承したクラスです。どんなクラス名が付いているのか確認するコードは次の通りです。
注*1 正確には、JSPから生成されたクラス
<%-- file:implicit-obj-trivialities.jsp --> <%= "page.getClass().getName() = " + page.getClass().getName() %><br/> <%= "page.getServletName() = " + ((javax.servlet.GenericServlet )page).getServletName() %><br/> |
3.2 pageContext
アトリビュート以外のメソッドとしてはfindAttribute()メソッドが便利なメソッドです。その他のメソッドは、その機能を代替する便利な機能をJSPが備えているため、スクリプトの中ではほとんど使わいません。アプリの上位のソフトウェア(例:TOMCAT)で使われます。
findAttribute()メソッドは、getAttribute()メソッドに似ています。違う点は、探しているキーが見つからないときは、より広い範囲のアトリビュートを探索するということです。pageContextのアトリビュートになければ、requestのアトリビュート、さらに、...といった具合にapplicationのアトリビュートまで探索します。
3.3request
次のデータに関するメソッドを含みます。
入力パラメータ
クッキー
ヘッダ
url
3.4 response
次のデータの設定に関するメソッドを含みます
クッキー
ヘッダー
リダイレクト
3.5session
セッションの生成/消滅に関するメソッドを持っています。
3.6 application
アプリを初期化するデータ/メソッドを含みます。アプリを初期化するのに使うデータはweb.xmlに記述できます。(「ナマ」のサーブレットで使うのが普通なので)詳細は略します。
3.7config
該当するサブレットを初期化するデータ/メソッドを含みます。サブレットを初期化するのに使うデータはweb.xmlに記述できます。(「ナマ」のサーブレットで使うのが普通なので)詳細は略します。
3.8exception
JSPの中で例外が生じたときに表示する画面(JSP)が指定されている場合に、その画面で参照できるオブジェクトです。例外に関する情報を持っています。例外が生じたときに表示する画面(JSP)を指定する方法は、後のpageディレクティブで説明します。
4.スクリプト要素
参考資料(2)、(3)を参照して下さい。
4.1 コメント
コメントは次の2種類あります。
4.1.1 出力コメント
JSPから生成されるhtmlの中に残るコメントです。
形式
<!-- comment [ <%= expression %> ] --> |
このタグはhtmlのコメントと同じです。(--は連続した二つの-(マイナス)です)
コメントの中にJSP式を記述できます。
4.1.2 隠しコメント
JSPから生成されるhtmlの中に残らないコメントです。言い換えると、ブラウザに送信されたソースに含まれません。
形式
<%-- hidden comment --%> |
<%--から--%>までは、処理の対象になりません。JSP式を書いても無視されます。
4.2 エスケープ文字
これはタグではありませんが、タグと関係していますので、ここで説明します。
<\% |
HTMLの中、又は属性(attribute)の中で文字列として「<%」 |
%\> |
scriptletの中、又は属性(attribute)の中で文字列として「%>」 |
\' |
「'」 ただし、""の中では'だけでもよい。 |
\" |
「"」 ただし、''の中では"だけでもよい。 |
4.3JSP スクリプトレット(scriptlet)
一般形
<% //java codes %> |
通常のJavaのコードが使えます。
コードの中で、後に説明する暗黙のオブジェクトが使えます。
同一のJSP内の複数のスクリプトレットは、すべて同一のメソッドの中にあるのと同じように働きます。たとえば、同じ変数名を異なるスクリプレット内で宣言できません。
4.4JSP式
一般形
<%=... %> |
...の部分の式の値が表示されます。
コードの中で、後に説明する暗黙のオブジェクトが使えます。
4.5JSP宣言
一般形
<%! ... // java変数の宣言文 %> |
JSP宣言で宣言した変数はJavaのクラスに変換されたとき、そのクラス(サーブレット)のフィールド変数になります。
JSPから変換されたクラス(サーブレット)は一つのインスタンスをマルチスレッドで走ります。つまり、複数のユーザで共有します。結果としてJSP宣言で宣言した変数はスレッドセーフではない問題をはらんでいます。マルチスレッドで問題がないかを意識して使わなければなりません。
重要! (危)JSP宣言で宣言した変数はスレッドセーフではない。
JSPの宣言(<%!... %>)の中で宣言した変数はスレッドで共通に使う。JSPはマルチスレッドで走るのでJSPの宣言の中で変数を宣言して使うのは危険を伴う。 |
スクリプトレットの中で宣言した変数はローカルな変数になります。したがって、スクリプトレットの中で宣言する変数はスレッドに関して安全です(ローカルな変数はスレッドに共通でない)。
ページ間でデータを受け渡すのならRequestスコープ又はSessionスコープを利用します(使い方は後に説明します)。
スクリプトレットはあくまで、webアプリの学習の一ステップとして説明しています。手軽にできると思いますが、この手軽さが本格的なプログラムには問題なのです。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
実際の開発では、スクリプトレットは使わないことが推奨されています。 |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5.ディレクティブ
参考資料(2)、(3)を参照して下さい。
JSPをJavaのソースに変換するのに使う情報を指定します。形式は次の通りです。
一般形
<%@directive attribute="value" %> |
attributeは空白で区切って複数個書けます。ただし、一つずつ書く方が分かりやすい場合が多いのでお勧めします。
よく使われるディレクティブを次に示します。
# |
ディレクティブ名 |
説明 |
1 |
page |
クラスのインポート、文字コード、エラーページ等の指定 |
2 |
include |
取り込むファイルの指定。取り込めるファイルはサーバによって異なる。 |
3 |
taglib |
ユーザが作成したタグを使うための宣言 |
6. JSPアクションタグ
アクションタグはそのページでの動作を指示します。ディレクティブは、JSPからJavaへの変換に使われるのに対し、アクションタグの内容は変換されてできたJavaコードの実行のしかたを指示します。
現在のJSP(1.1以降)はユーザ定義のアクションタグも使えます。タグリブ(Taglib)と呼ばれています。タグリブについては後に説明します。
形式
<jsp:tag> body </jsp:tag> 又は <jsp:tag/> |
tagの部分が、各アクションによって変わります。
アクションタグには次のものがあります。
参考資料(2)、(3)を参照して下さい。
# |
action |
説明 |
1 |
useBean |
Java beanをインスタンシェートするか、又は既存のJava beanオブジェクトを再利用するのに使う。 |
2 |
setProperty |
Java beanの特定のプロパティを設定するのに使う。 |
3 |
getProperty |
Java beanから特定のプロパティを取り出すのに使う。 |
4 |
include |
サブルーチンとして働きます。暫定的には指定されたJSP/サーブレットにrequestとresponseを渡します。その後、制御は現在のJSPページに戻ります。ソースレベルでは取り込まれません。 |
5 |
forward |
別のJSP又はサーブレットに移るのに使います。いったん別のJSP又はサーブレットに移ると、現在のJSPに制御は戻りません。 |
6 |
param |
現在のrequest(オブジェクト)に特定のパラメータを追加します。includeか、forwardはjsp:paramsブロックの中で使えます。 |
補足beanとbeanもどき
beanであることの本来の条件と、厳格にはbeanといえない「beanもどき」について説明します。
beanは次の条件をすべて満足するJavaのクラスです。
(1)デフォルトのコンストラクタ、つまり引数を持たないコンストラクタを持つ。 (2)getter/setterと呼ばれるメソッドでアクセスできるプロパティを持つ。 第2の条件をJSPに限定して言えば、このように表現できます。一般にはもっと複雑です。 getter/setter以外のメソッドを持つことはかまいません。 getterはプロパティの値を戻すメソッドです。メソッド名はgetXxx()の形式です。xxxがプロパティ名です。getterの名前は、プロパティ名の先頭を大文字にして、2文字目以降はプロパティ名と同じです。プロパティの型がbooleanの場合はgetXxx()の代わりにisXxx()が使われます。 setterはプロパティを設定するメソッドです。メソッド名はsetXxx()の形式です。Xxxの付け方はgetterのルールと同じです。引数は一つで、型はプロパティの型です。型がbooleanの場合もメソッド名の形式は変わりません。 getter/setterはaccessor/mutatorとも呼ばれます。また、accessorはgetter/setterの両方を指す場合もあります。 多くの場合、プロパティはクラスのフィールドに対応していますが、必ずしも対応している必要はありません。EclipseやNetBeansはフィールド名から、プロパティの規則を使って、getter/setterを生成する機能を持っています。フィールドに対応したプロパティの場合は、この機能を使うと便利です。 (3)シリアライザブル(serializable)である。 オブジェクトがシリアライザブルとは、そのオブジェクトがファイルに保存でき、かつ、ファイルから回復できることです。 |
上記の3条件を必ずしも守っていない場合でもbeanと呼んでいることが多くあります。特に(3)が守られていないの場合が多いようです。
JSPのuseBeanの対象になるクラスも本来は「bean」です。実際には、「beanもどき」で使われることがあります。
(1)の条件は、クラスにコンストラクタを明示的に記述しなければ満足する条件です。逆に、引数を持つコンストラクタを記述した場合は、忘れずに、引数無しのコンストラクタも追加しなければなりません。この条件を満たさないと、useBeanの比較的簡単な例題で例外を起こします。
(2)は必須です。(2)だけでも例外が発生しない場合も作れないことはありません。
(3)の条件は無視されている場合が多いようです。シリアライザブルの条件は、リソースが不足してきたときに、外部ファイルにオブジェクトを退避するために使われるはずです。しかし、学習目的の場合はもちろん、実運用でもリソースが不足する状況で使うことは恐らくないので、問題が顕在化しないのだと推測します。実際には、class文に"implements Serializable"を追加するだけでシリアライザブルになることが少なくありません。もちろん、それだけではすまない場合もあります。本資料の例題は、シリアライザブルを目的にしない限りは、シリアライザブルの条件を無視します。
usebeanアクションタグ
複雑なタグなので、図を使って説明します。
useBeanアクションタグの記述法は次の通りです。
<jsp:useBean id="beanInstanceName" scope="page|request|session|application" class="package.class" type="package.class" beanName="package.class" > (body) </jsp:useBean> |
# |
属性名 |
説明 |
1 |
id |
beanを指す参照の変数名。スクリプトレット又はJSP式の中でもこの変数名が使えます。Javaの変数の命名則に従います。 |
2 |
scope |
beanが有効な(生きている)スコープ。指定しないときはpageが仮定されます。 |
3 |
class |
beanが存在しない場合、インスタンシェートするクラスの完全名。 抽象クラスやインタフェースは指定できない。 指定したクラスはデフォルトのコンストラクタを持っていなければならない。 |
4 |
type |
beanの参照(reference)の型。beanの祖先の抽象クラスや、bean(又はその祖先)が実装するインタフェースでもいい。beanが既存の場合だけ意味がある。beanが存在しない場合、typeが指定されていても、classもbeanNameも指定していなければ、インスタンシェートしない。 |
5 |
beanName |
文字列の他、JSP式でも指定できる。 クラスか又はシリアライズされたオブジェクトからbeanを生成する。 |
JSPの中からbeanをアクセスする構図を図6.1に示します。
図6.1JSPからbeanを参照する構図
sessionはスコープを持つ暗黙オブジェクトの代表として使っています。他の候補としては、page、request、applicationがあります。useBeanタグのscope属性で指定します。
attributeはgetAttribute()/setAttribute()でアクセスするオブジェクトです。keyはuseBeanタグのid属性で指定されたものです。id(の値)は、beanの変数(参照)としても使われます。このため、idはJavaの変数の命名則に従っていなければなりません。
beanの型は、useBeanタグのclass又はtype又はその両方の属性で指定されます。Java言語で使うのと同じ使い方をします。beanNameも同じ目的の属性ですが、beanがシリアライザブルのときにclassやtypeにはない機能が発揮されます。シリアライザブルに関する説明は略します。
beanが存在しない場合はclassで設定されたクラスのインスタンスが生成されます。(body)が記述されていれば、そのときに限って、(body)が実行されます。beanが存在する場合(インスタンシェートしない場合)は、(body)が記述されていても、(body)は実行されません。
次のようにuseBeanタグが記述された場合のJSP内の処理をJavaで書いたコードを示します。
<jsp:useBean id="manager" scope="session " class="jp.co.ichi.myjsp.Manager" type=" jp.co.ichi.myjsp.Person" /> |
// beanが既存の場合 jp.co.ichi.myjsp.Person manager = (jp.co.ichi.myjsp.Person)session.getAttribute("manager");
// beanが存在しない場合 jp.co.ichi.myjsp.Person manager= new jp.co.ichi.myjsp.Manager(); session.getAttribute("manager",manager); |
付録
付録AURL
付録A.1URLの構成
http://localhost:8080/AAAAAAAA/XXXXXXXX/YYYYYYYY?p=1&q=tom
|---①---|
|--②-|
|---③---|
|---④---|
|---⑤---|
|--------⑥-------|
例 http://localhost:8080/web_basic/servlets/command/countup?begin=1
①サーバ名 アプリがインストールされたサーバのアドレス(ホストネーム) [localhost]
②ポート番号 TOMCATが特定される。 [8080]
③コンテキストパス(context path) [/web_basic]
④サーブレットパス(servlet path) この中に/が含まれることがある。[/servlets/command]
⑤PathInfo [/countup]
⑥クエリ文字列 [begin=1]
コンテキストパス
context.xmlで決まる。空のこともある(通常は空は使わない)。空でなければ/で始まる。/では終わらない。
一つのwebアプリ全部に共通。TOMCATの下には複数のwebアプリがあり得る。各アプリごとに異なる。一つのwebアプリに複数のサーブレットがあり得る。その場合、一つのwebアプリに含まれるサーブレット全部に共通。
サーブレットパス
サブレットコンテキストはサーブレットを特定する。同じwebアプリの中で、各サーブレットにユニークに割り当てる(同じサーブレットパスを割り当てることもできるが、「誤り」というべきか)。/で始まる。/では終わらない。/*と一致する場合は空。
web.xmlのservlet-mappingタグで定義します。
PathInfo
サーブレットパスより後ろで、クエリ文字列より前。該当する文字列がない場合はnull。そうでない場合は/で始まる。
付録A.2URLの指定法
付録A.2.1HTMLの中
現在表示されているHTMLを表示するURLを例として次のものを仮定します。
http://localhost:8080/web_basic/html/kensyu/countup.html |
(1)<a href="/answer.html">...</a> <a href="http://localhost:8080/answer.html ">...</a> (2)<a href="answer.html">...</a> <a href=" http://localhost:8080/web_basic/html/kensyu/answer.html ">...</a> (3)<a href="./answer.html">...</a> <a href=" http://localhost:8080/web_basic/html/kensyu/answer.html ">...</a> (4)<a href="../answer.html">...</a> <a href=" http://localhost:8080/web_basic/html/answer.html ">...</a> (5)<a href="../../answer.html">...</a> <a href=" http://localhost:8080/web_basic/answer.html ">...</a> (6)<a href="../exercise/answer.html">...</a> <a href=" http://localhost:8080/web_basic/html/exercise/answer.html ">...</a>
|
付録A.2.2JSPの中
現在表示されているJSPを表示するURLを例として次のものを仮定します。
http://localhost:8080/web_basic/jsp/kensyu/countup.jsp |
(1)<a href="/answer.html">...</a> <a href="http://localhost:8080/web_basic/jsp/kensyu/answer.html">...</a> (JSPが/web_basicを補う) (2)<a href="answer.html">...</a> <a href=" http://localhost:8080/web_basic/jsp/kensyu/answer.html ">...</a> (3)<a href="./answer.html">...</a> <a href=" http://localhost:8080/web_basic/jsp/kensyu/answer.html ">...</a> (4)<a href="../answer.html">...</a> <a href=" http://localhost:8080/web_basic/jsp/answer.html ">...</a> (5)<a href="../../answer.html">...</a> <a href=" http://localhost:8080/web_basic/answer.html ">...</a> (5)<a href="../exercise/answer.html">...</a> <a href=" http://localhost:8080/web_basic/jsp/exercise/answer.html ">...</a> |
付録A.2.3 サーブレットへの要求の場合
現在表示されている画面を表示するURLを例として次のものを仮定します。
http://localhost:8080/web_basic/servlets/command/countup |
この場合、ブラウザは、HTMLの中に記述されたURLを、現在位置が
.../web_basic/servlets/command/countup |
にあるとして解釈します。サーブレットを要求するURL(例:/servlets/command/countup)は実際のファイルの位置に対応していません。servlet-mappingで定まるので。ブラウザはそれについては関係ありませんので、例の場合、.../web_basic/servlets/command/countupのファイルがあるとして解釈するのです。
たとえば、HTMLの中で、../test.htmlと書くと、HTMLはつぎのように解釈します。
http://localhost:8080/web_basic/servlets/test.html |
付録 B JSPアンチョコ
参考
http://java.sun.com/products/jsp/tags/11/syntaxref11.fm14.html
http://java.sun.com/products/jsp/syntax/1.2/syntaxref12.html
スクリプト
# |
要素 |
形式 |
1 |
出力コメント |
<!-- comment [ <%= expression %> ] --> |
2 |
隠しコメント |
<%-- hidden comment --%> |
3 |
スクリプトレット |
<% code fragment %> |
4 |
JSP式 |
<%= expression %> |
5 |
JSP宣言 |
<%! declarations %> |
ディレクティブ
# |
要素 |
形式 |
1 |
page |
<%@ page [ language="java" ] [ extends="package.class" ] [ import= "{ package.class | package.* }, ..." ] [ session="true|false" ] [ buffer="none|8kb|sizekb" ] [ autoFlush="true|false" ] [ isThreadSafe="true|false" ] [ info="text" ] [ errorPage="relativeURL" ] [ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ] [ isErrorPage="true|false" ] [ pageEncoding="characterSet | ISO-8859-1" ] %> |
2 |
include |
<%@ include file="relativeURL" %> |
3 |
taglib |
<%@ taglib uri="uri" prefix="tagPrefix" %> |
アクションタグ
# |
要素 |
形式 |
1 |
useBean |
<jsp:useBean id="beanInstanceName" scope="page|request|session|application" class="package.class" type="package.class" beanName="package.class" > (body) </jsp:useBean> 注(class)、(type)、(class,type)、(beanName,type)の組合わせで使います。beanNameはJSP式が使えます。 (body)はこの文で新たにクラスをインスタンシェートしたときに限って実行されます。 beanInstanceNameは変数名及び該当スコープのキーの両方に使われます。 |
2 |
setProperty |
<jsp:setProperty name="beanInstanceName " property="propertyName|*" param="parameterName" value="val" /> 注 (property=*)、(property="propName",param="paramName")、(property="propName",value="val")の組み合わせで使います。valはJSP式が使えます。 |
3 |
getProperty |
<jsp:getProperty name="beanInstanceName" property="propertyName" /> |
|
param |
<jsp:param name ="parameterName" value="parameterValue" | <%= expression %>}" /> 独立したアクションではなく、includeとforwardアクションの一部(句)として使われる。 |
4 |
include |
<jsp: include page="relative URL" flush="true"> (param)--- 0個以上 </jsp: include > 注flushの値はtrueだけ。(param)はparam句を使う。 |
5 |
forward |
<jsp:forward page="relative URL"> (param)--- 0個以上 </jsp:forward> 注flushの値はtrueだけ。(param)はparam句を使う。 |
ディレクティブのincludeとJSPアクションタグのincludeの違い
取り込む時期が次の通り異なります。
ディレクティブのinclude : JSPからJavaへ変換されるとき
アクションタグのinclude : アプリが起動された後、該当JSPが実行されるとき
取り込めるファイルの種類は、サーブレットコンテナに依存して、両者で異なる可能性があります。アクションタグのincludeは取り込む(include)というより、呼ぶ(call,invoke)という方が的確な表現です。
参考資料
(1)http://java.sun.com/j2ee/sdk_1.3/ja/techdocs/api/
Java(TM) 2 Platform, Enterprise Edition, v 1.3.1 API 仕様
最新版ではありませんが本資料の説明範囲には十分です。
もっと新しい版は(4)を参照して下さい。これと(5)の組み合わせがJSPの仕様です。
(6)はJSP1.0の解説、(7)JSP2.0の解説です。(6)はJSPのエッセンスです。
(2)http://www.javaroad.jp/servletjsp/
Javaの道 Servlet・JSP
(3)http://struts.wasureppoi.com/
忘れっぽいエンジニアの
Jakarta Strutsリファレンス
以下は英文のサイトです。
(4)http://download.oracle.com/javaee/5/api/
JavaTM 2 Platform Enterprise Edition, v 5.0 API Specifications
http://download.oracle.com/javaee/6/api/にもあります
(5)http://java.sun.com/products/jsp/syntax/1.2/syntaxref12.html
JavaServer Pages (JSP) v1.2 Syntax Reference
(6)http://java.sun.com/developer/onlineTraining/JSPIntro/contents.html
Tutorials & Code Camps
jGuru: JavaServer Pages Fundamentals, Short Course Contents
(7)http://java.sun.com/developer/technicalArticles/javaserverpages/JSP20/
Developing Web Applications With JavaServer Pages 2.0
(8)http://geekexplains.blogspot.com/2008/06/errorexception-handling-in-jsp-using.html
Error/Exception Handling in JSP - using JSPs or Servlets
(9)http://geekexplains.blogspot.com/2008/06/what-are-implicit-objects-in-jsp.html
What are Implicit Objects in JSP? 暗黙のオブジェクトの説明
(10)http://java.sun.com/products/jsp/pdf/card11.pdf
JAVASERVER PAGESª (JSPª) SYNTAX version 1.1 (アンチョコ)
(11)http://develop.levity.com/ref/jsp-directives.xtp
JSP Directives
(12)http://www.developer.com/tech/article.php/626391
Java Server Pages, The Page Directive
簡潔な解説とカラーの注意事項
(13)http://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/
>> Servlets and JavaServer Pages (JSP) 1.0: A Tutorial
>> http://pdf.coreservlets.com/
Servletから解説しています。JSPは12章と13章です。1章は概観、2章は開発環境のセットアップです。2章はTOMCATのセットアップについて詳しく記述しています。
(14)http://www.roseindia.net/jsp/index.shtml
JSP tutorial 解説と豊富な例題
以上