SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

GlassFishからアプローチするJava

GlassFishからアプローチするJava~入門編~
第3回「Webアプリケーションの作成 JSPの基礎を学ぶ」

JSPはWebアプリケーションのUIの基本

JSPの構造

 図1は大まかなJSPの構造と捉えてください。JSPの正確な構造はJSPの構文に則る必要がありますが、基本的なことを捉えるには以下の4つを抑えておけば大丈夫でしょう。JSP 2.0まではELはJSPやJSF(JavaServer Faces)の仕様の一部でしたが、JSP 2.1ではJSPとJSFで統一されており、将来的には独自のJSRになると言われているため、1番上位の要素として挙げています。また、JSP以外の要素はテンプレート・テキストと呼ばれます。

図1.JSPの構造
図1.JSPの構造

 以下、簡単にディレクティブ式言語スクリプティング要素アクションについて説明します。詳しくは、次回実際にWebアプリケーションを開発する際に説明します。

ディレクティブって何?

 JSPはJSPコンテナ上に乗っています。ディレクティブとはJSPからJSPコンテナに対し指示を与えるものです。ディレクティブ(directive)が指示(指令)という意味を持つことから、イメージしやすいと思います。具体的には、JSPからServletへの翻訳の仕方、JSPの実行方法の指示を行います。図1に示した以外にも、attribute、tag、variableディレクティブがJSP 2.0から存在します。ただし、これらはタグファイルの中だけで有効なディレクティブのため今回は省略します。

pageディレクティブ

 pageとはまさしくJSP pageのことです(蛇足ですが、JSP pageというとJSPの中のpagesとダブるから不要ではないかとよく聞かれますが、トヨタ自動車の自動車と同じことです)。つまり、JSPそのものに関する処理の仕方をコンテナに伝えるものがpageディレクティブです。JSP 2.1の仕様書では次のように記述されています。

<%@ page page_directive_attr_list %>

 例としてbufferとautoFlushを記述すると、次のように属性="値"となります。

<%@ page buffer="32kb" autoFlush="true" %>

 表2にpage_directive_attr_listの一覧を示します。

表2.pageディレクティブの属性
属性
language JSP 2.1ではjavaしか指定できませんが、ResinなどではJavaScriptもサポートしているようです。将来的にjava以外の言語をサポートするために予約されていると思われます。
extends 普段はあまり使いません。JSPもただのJavaなので継承できます。指定するクラスは、Servletに翻訳された後の親のクラス名です。
import java.lang.*、javax.servlet.*、javax.servlet.jsp.*、javax.servlet.http.*以外のクラスを使用したい場合に指定します。
session trueの場合、javax.servlet.http.HttpSessionが使え、falseの場合、使えないことを意味します。
buffer "none"の場合、JSPで処理されるたびにクライアントに結果が送られます。"none"以外はkb(KBでないことに注意)で指定します。デフォルトは8kbです。
autoFlush trueの場合、bufferで指定した値を超えると自動的にクライアントに結果が送られます。従って、buffer属性で"none"を指定した場合、論理的に矛盾するためtrueは指定できません。falseの場合、注意しないといけないのはbuffer属性で指定した値を超えてしまうと例外が発生することです。
isThreadSafe 当属性はdeprecateなので使用すべきではありません。
isErrorPage trueの場合、自分自身がエラー情報出力用のJSPであることを指定します。
errorPage JSP内部で例外が発生した場合、isErrorPageが指定されているJSPのURLを指定します。
contentType 生成されるコンテンツのMIMEタイプとエンコーディングを指定します。
pageEncoding JSP自身のエンコーディングを指定します。
isELIgnored trueの場合、式言語は無視されます。falseの場合、式言語は認識され評価されます。
deferredSyntaxAllowedAsLiteral trueの場合、式言語において、文字列リテラルの遅延評価を許します。falseの場合、許しません。
trimDirectiveWhitespaces trueの場合、ディレクティブとテンプレート・テキストの間にある空白文字列を削除します。falseの場合、そのままの状態で残ります。つまり、ディレクティブで複数回改行していると複数行の空白行が出力されてしまいます。

taglibディレクティブ

 tagと言えばテーブルタグやインプットタグなどHTMLタグのことを想像しますが、JSPではHTMLにないタグが用意されています。JSTL(JSP Standard Tag Library)はそれらのタグを集めたものです。またJSPに用意されていなくとも独自にタグを作ることができます。独自に作成するタグをカスタムタグと呼びます。それらをまとめたものがカスタムタグ・ライブラリです。これらのタグを使用することにより、より動的なコンテンツの生成が可能です。JSP 2.1の仕様書では次のように記述されています。

<%@ taglib (uri="tagLibraryURI" | tagdir="tagDir") prefix="tagPrefix" %>

 従って、uriとtagdirはどちらか一方を指定します。表3がtaglibディレクティブの属性一覧です。

表3.taglibディレクティブの属性
属性
uri web.xml(デプロイメント記述子)にはtaglib要素の子要素としてtaglib-uri要素とtaglib-location要素が存在します。uriはこのtaglib-uriの要素内容を指定します。実際にはこのURIをもとにTLD(tag library descriptor)の名前を検索するために使われます。TLDとは簡単に言えば、タグとその実装を紐付けるための設定ファイルです。
tagdir JSP2.0から導入された属性で、タグファイルのディレクトリを指定します。
prefix JSP2.1の仕様書では<myPrefix:myTag>のように記述されています。このmyPrefixを指定します。JSP2.1で使用できないprefixは、
  • jsp:
  • jspx:
  • java:
  • javax:
  • servlet:
  • sun:
  • sunw:
です。思わず面倒になりjsp:と付けがちですが注意してください。

includeディレクティブ

 includeディレクティブは、JSPの翻訳時にfile属性で指定したリソースに置き換えてくれとJSPコンテナに指示を出すためのものです。リソースはHTMLでもJSPでも構いません。ただし、JSPをインクルードする場合、includeするJSPのディレクティブと矛盾がないようにしなくてはなりません。pageディレクティブのimport属性は累積的な指定ができるため意識しなくてもいいのですが、それ以外のディレクティブは矛盾を起こす可能性があり、矛盾がある場合、JSPの翻訳時にエラーとなります。大きなプロジェクトの場合、includeされるJSPのディレクティブに制約を設けるなどの工夫が必要となります。属性はfileのみで、その値は取り込みたいリソースのパスを指定します。このパスの指定にもルールがあります。コンテキストパスからの絶対パスの場合、"/"で始めます。"/"で始めない場合、includeするJSPからの相対パスを指定します。入門者が意外と悩むところです。JSP 2.1の仕様書では次のように記述されています。

<%@ include file="relativeURLspec" %>

 file以外に属性はないため、属性一覧は省略します。

次のページ
式言語って何?

この記事は参考になりましたか?

GlassFishからアプローチするJava連載記事一覧

もっと読む

この記事の著者

川久保 智晴(カワクボ トモハル)

haruプログラミング教室(https://haru-idea.jp/)主宰。COBOL、FORTRANで13年、Javaを中心としたWeb開発で11年。3つしか言語知らないのかというとそうでもなく、sed/awk、Perl、Python, PHP,  C#, JavaScriptなども一時期は業...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4775 2010/02/17 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー