連載
» 2003年04月15日 00時00分 公開

JSPの基本構文を理解する基礎から学ぶサーブレット/JSP(4)(3/3 ページ)

[山田祥寛,@IT]
前のページへ 1|2|3       

式(Expression)

 「<%〜%>」で表されるスクリプトレットの構文は、動的なコードを記述する場合に最も汎用的に採用できるスクリプトレット要素ですが、その分、記述がどうしても冗長になってしまうきらいがあります。

 特に、文字列を出力する場合に使用するout.print命令(あえてここでは「命令」といっておきます)は使用頻度も多く、いくつも連なるとコードの可読性を損ねることにもなりかねません。

 例えば、以下のような例を見てみましょう。

<img src="<% out.print(strSrc);%>" alt="<% out.print(strAlt);%>"
width="<% out.print(strWdh);%>" height="<% out.print(strHgh);%>" />

 断片的なスクリプトレットがHTMLのコードを分断しており、非常に見にくいコードです。もちろん、これを以下のように1つのスクリプトレットにまとめてしまうことも可能でしょう。

<%out.print("<img src='" + strSrc + "' alt='" + strAlt + "' width='" + strWdh + "' height='" + strHgh + "' />");%>

 しかし、これにしてもシングルクオーテーション(')とダブルクオーテーション(")の入り組んで複雑で一目ではなかなか分かりにくいコードです。見にくいということはそれだけでバグが混入しやすいコードであるともいえます。

 そこでJSPページでは、out.print命令を略記した<%=〜%>という式構文(Expression)を認めています。上記の例を式構文で書き換えてみると、以下のようになります。

<img src="<%=strSrc%>" alt="<%=strAlt%>"
width="<%=strWdh%>" height="<%=strHgh%>" />

 いかがですか? 記述が極めて簡略化されたのがお分かりになるでしょう。ただし、スクリプトレットの場合と異なり、末尾にセミコロン(;)を付加した場合にはエラーとなりますので、注意してください。

 式構文では、単純な変数・定数だけでなく、値を返す命令(メソッド)やちょっとした演算子を記述することもできます。例えば、以下のようにです。

<%=request.getParameter("nam")%>
変数blnFlagの値は<%=blnFlag ? "true" : "false" %>です。

 上記2番目の式に含まれる「?」は三項演算子と呼ばれるもので「評価式 ? 式1 : 式2」の形式で記述します。評価式がtrueである場合には式1を、falseである場合には式2を出力します。簡単な条件分岐を短く記述することができますので、この式構文とあわせて用いることでコード全体を簡略化することも可能です。

 このように、式構文は非常に重要な要素の1つですが(JSPページにおいて簡潔であるということは、特に重要なことです)、あくまでデータの出力を簡略化する省略形であることを忘れないでください。ですから、例えば、

<%=request.getParameter("nam")
request.setCharacterEncoding("JISAutoDetect"); %>

のように、2つ以上の命令を式構文内に記述することはできませんし、

<%=request.getParameter("fNam")
=request.getParameter("lNam") %>

のように複数の値を併記して出力することもできません。もしもこのようなことをしたい場合には、

<%=request.getParameter("fNam") + request.getParameter("lNam") %>

のように「+」演算子で文字列連結を行うようにしてください。

 なお、以上の「宣言部」「スクリプトレット」「式(Expression)」を総称して、「スクリプティング要素」と呼ぶ場合もあります。

One Point

式構文は「out.print」命令の省略形です。ちょっとしたデータ出力は、この式構文を利用することで、コード全体を簡略化し、JSPページの可読性を高めることができます。


アクションタグ

 アクションタグは、JSPページ内でよく使用する定型的な処理をHTML同様のタグ形式で記述可能とすることで、目的とした記述方法です。 一般的に、アクションタグは以下のような構文で記述することができます。

<タグ名 属性名1="属性値1" 属性名2="属性値2"...>〜</タグ名>


または、

<タグ名 属性名1="属性値1" 属性名2="属性値2" .../>


 タグの記述はXMLの記法にのっとる必要がある点に注意してください。大きくは以下がポイントです。

  • 大文字小文字が区別される
  • 終了タグは省略できない。空要素の場合には開始タグを「〜/>」で閉じる
  • タグ同士は必ず入れ子(ネスト)構造になっていなければならない
  • 属性値は必ずダブルクオーテーションで囲む

 ただし、あくまでこのような規則に沿わなければならないのは、アクションタグの記述部分のみです。通常のHTMLタグについては、この限りではありません。

 JSP1.2で用意されている主なアクションタグには以下のようなものがあります。

アクションタグ 概要
<jsp:include> 指定されたページをインクルード
<jsp:forward> 指定されたページにリダイレクト
<jsp:getProperty> JavaBeansのプロパティを取得
<jsp:setProperty> JavaBeansのプロパティに指定値(あるいはフォームの値)を設定
<jsp:useBean> JavaBeansの使用を定義
JSP1.2における主なアクションタグ

 このうち、<jsp:getProperty>、<jsp:setProperty>、<jsp:useBean>要素については、本連載の後半で解説するJavaBeansのパートで説明することにします。

 ここでは、残る2つのアクションタグについて、説明しておくことにしましょう。

<jsp:include>

 外部ファイルをインクルードします。構文は以下のとおりです。

<jsp:include page="インクルードするファイル"
flush="バッファのフラッシュを行なうか(true|false)" />

 ただし、JSP1.1環境においてはflush属性はtrueのみ指定可能です。類似した機能として、前述の@includeディレクティブがあり、

<jsp:include page="include.jsp" />
<%@ include file="include.jsp" %>

はほぼ同意です。ただし、<jsp:include>要素は実行時に常にインクルードファイルの変更が確認されるのに対し、@includeディレクティブはオリジナルファイル(呼び出し元)が変更されない限り、インクルードファイルの変更は認識されません。つまり、前者はインクルードファイルを動的に処理しますが、後者はあくまで静的にしか処理していないということを意味します。

 この違いを認識していないと、意外なところで「プログラムの変更が認識されない」と迷う原因にもなりますので、注意してください。

<jsp:forward>

 現在のページをほかのJSPページやサーブレットに転送します。構文は以下のとおりです。

<jsp:forward page="リダイレクト先のファイル" />

 なお、<jsp:forward><jsp:include>要素には、<jsp:param>要素を使用して、パラメータを渡すこともできます。例えば、以下のようにです。

<jsp:include page="encode.jsp">
<jsp:param name="encoding" value="Shift_JIS" />
</jsp:include>

 <jsp:param>要素を使用して渡されたパラメータ要素は、そのほかのフォーム要素同様、sample.jspでも使用したrequest.getParameter命令(メソッド)を使用して取得が可能です。

 以上が主要な標準アクションタグの機能ですが、JSP1.1からは、これら標準のアクションタグに加え、ユーザーが独自に定義したカスタムタグも使用できるようになりました。カスタムタグを織り交ぜることで、標準のアクションタグには含まれなかった独自のビジネスロジックをもタグ化し、究極的にはノンスクリプトのJSPページを記述することも可能でしょう(事実、JSP2.0では設定ファイルでスクリプトレットの使用を禁止することも可能になっています)。カスタムタグについては、本連載の後半で紹介したいと思います。

One Point

アクションタグはタグ形式で記述することのできる命令です。JSPページではアクションタグやカスタムタグを用いることで、生のJavaコードの記述を排除することができます。


コメント

  文字どおりのコメントです。コメント部分は、コード解析時に無視されます。コメントというと、一見、実際のページの動きとは関係ないものであるために、どうしても軽視されがちですが、特に中長期的な運用を前提としたシステムでは必要不可欠な要素でもあります。

 そもそも他人の書いたコードを後から確認するというのは、苦痛であることがほとんどですが、コードに関する概要的な説明をコメントとして残しておくことで、その苦痛をかなり軽減することができます。

 もちろん、コードの1行1行にコメントを付加する必要はありませんが(というよりも、それではコメントの意味をなしません。それはコードをただ単に日本語に置き換えただけで、コードを1行1行確認する苦痛はなんら軽減されないのです!)、変数の意味や大きなブロック単位の概要、更新の履歴を記述しておくことで、コードの大枠を把握するのが容易となります。

 JSPページ内では大きく4種類のコメント構文を使用することが可能です。

<%--〜--%>

 静的なコンテンツ部分に記述します。「<%--〜--%>」で囲まれたコンテンツは、コンテナによる解析時に切り捨てられ、クライアント側には送信されません。

 宣言部やスクリプトレット内で使用することはできませんが、これらスクリプティング要素全体をまとめてコメントアウトすることができます。この性質を利用して、デバッグ時などにひとかたまりのロジックをまとめて無効化する際にも使えます。

<%--
<% out.print("この部分は無視されます"); %>
--%>

/*〜*/

 スクリプトレット、宣言部内で使用することができる、Javaの一般的なコメント構文です。「/*」から「*/」で閉じられるまでの複数行をコメントアウトします。

 静的なHTMLコード内では使用することができません。また、「/*〜*/」で囲まれたコメントは「<%--〜--%>」同様にサーバサイドで切り捨てられますので、クライアント側には送信されません。

<%
out.print("複数行コメントの例です。");
/* outオブジェクトはJSPページで使用することのできる「暗黙オブジェクト」
のひとつです。printは文字列を表示する命令で、オブジェクトに属する
このような命令のことを「メソッド」といいます */
%>

//

 「/*〜*/」同様、スクリプトレット、宣言部内で使用することができる、Javaの一般的なコメント構文です。//から現在行の末尾までの単一行をコメントアウトします。静的なHTMLコード内では使用することができません。また、「//」で指定されたコメントは「<%--〜--%>」同様にサーバサイドで切り捨てられますので、クライアント側には送信されません。

<%
// この行の末尾までがコメントとして認識されます
%>

<!--〜-->

 HTMLの一般的なコメント構文です。静的なHTMLコードの中に記述することができます。クライアント側で処理されるコメント構文ですので、ブラウザ上には表示されませんが、[ソースの表示]でコードを表示させることで内容を参照することができます。デバッグ時に各ブロック単位の出力を確認する場合などにも利用可能です。

<!--ブラウザ上には表示されませんが、クライアントには送信されるコメントです-->

One Point

JSPのコメント構文には「<%--〜--%>」「/*〜*/」「//」「<!--〜-->」という4つの種類があります。これらは用途によって使い分けます。


 いかがでしたか? これで、JSPページの基本的な構成は一通りご理解いただけたことと思います。もちろん、これだけで実践的なアプリケーションが即座に組めるようになるというものではありませんが、JSPを構成する大きな骨格を知ることで、今後の学習の一助となれば幸いです。

 次回はJSPページのメインコード部分であるスクリプトレット内で使える「暗黙オブジェクト」の主要な機能について取り上げてみることにしましょう。


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。