目次

JSP

ディレクティブ

ディレクティブ(指令)とは、その名のとおり、JSP/サーブレットコンテナに対する指示を行うものです。一般的に、ディレクティブは以下のような構文で記述することができます。
<%@ ディレクティブ名 属性名1=“属性値1” 属性名2=“属性値2” … %>

ディレクティブ概要
@page現在のページの処理方法を指定
@include外部ファイルをインクルード(「アクションタグ」参照)
@taglibタグライブラリを定義(後続の記事で紹介)

@page

最も重要なディレクティブが@pageディレクティブです。その性質上、ページの先頭に記述するのが一般的です。ページ内に複数回記述することができますが、import属性を除いては、同一の属性を複数回指定することはできません。ですから、

<%@ page contentType="text/html;charset=Shift_JIS" %>
<%@ page import="java.sql.*" %>

という記述は可能ですが、

<%@ page contentType="text/html;charset=Shift_JIS" %>
<%@ page contentType="text/html;charset=EUC-JP" %>

のような記述は不可です(相互に矛盾しているため)。

@pageディレクティブで使用することのできる主な属性

contentType属性
buffer、autoFlush属性
import属性
isErrorPage属性、session属性

宣言部

「<%!~%>」で囲まれた部分を「宣言部」といいます。宣言部では、その名のとおり、変数や定数、ユーザー定義メソッドなどの宣言を行います。JSP(というより、JSPのベースとなるJava言語)においては、変数の使用に当たって宣言は必須となります。

スクリプトレット

「<%~%>」の形式で定義され、HTMLコードの任意の個所に埋め込むことができる、文字どおりスクリプトコードの
断片(let)です。 JSP内にJavaの断片的なコードを埋め込む場合、最も汎用的に使うことができます。
 ほかgのスクリプトレットや式(Expression)の中に入れ子(ネスト)で定義することはできませんので、注意してください。例えば、以下のような記述は不可です。

<%
out.println("....");
<%...%>
%> 

スクリプトレットの内容は、JSPページ実行時に処理され、その処理結果のみがクライアントに出力されるしくみです。Javaの基本的な制御構文(ifやfor、whileなど)をはじめ、@pageディレクティブで指定されたクラスライブラリ、outやrequest、sessionのような暗黙オブジェクトを使用することができます。暗黙オブジェクトについては次回記事にて、クラスライブラリについては第6回以降でご紹介することにします。各命令の最後には、必ずセミコロン(;)を付加するのを忘れないようにしてください。
 また、以下に、断片的なスクリプトレットの特殊な使い方を挙げておくことにします。

<% if(blnFlag==true){ %>
変数blnFlagはtrueです
<% } else { %>
変数blnFlagはfalseです
<% } %>

 上記の記述は、

<%
if(blnFlag==true){
out.print("変数blnFlagはtrueです");
} else {
out.print("変数blnFlagはfalseです");
}
%>

と同意です。ifやswitchのような制御構文とあわせて使用した場合、スクリプトレットの外にある静的なコンテンツ部分の出力/非出力を制御することもできます。コード部分を簡素化する際に役立つ便利なテクニックですので、ぜひ押さえておくとよいでしょう。

JSPの式(Expression)

「<%~%>」で表されるスクリプトレットの構文は、動的なコードを記述する場合に最も汎用的に採用できるスクリプトレット要素ですが、その分、記述がどうしても冗長になってしまうきらいがあります。
 特に、文字列を出力する場合に使用するout.print命令(あえてここでは「命令」といっておきます)は使用頻度も多く、いくつも連なるとコードの可読性を損ねることにもなりかねません。

クライアントに情報を出力する場合は、<%= ~ %>タグを使用します。
<%= ~ %>タグは、<% out.print(~) %>を省略したものになります。

<%= ~ %>タグの中には、クライアントに出力する情報を返す式もしくは値を記述しますが、最後にセミコロン「;」は不要です。

式の例

<%@ page language="java" contentType="text/html;charset=Shift-JIS" %>
<HTML><BODY>
<%="TEST!!" %><BR>
<%=(20+30)*10 %><BR>
<%=new java.util.Date() %><BR>
</BODY></HTML>

上記の式を、<% ~ %>タグで記述すると以下のようになります。

<%@ page language="java" contentType="text/html;charset=Shift-JIS" %>
<HTML><BODY>
<% out.print("TEST!!"); %><BR>
<% out.print((20+30)*10); %><BR>
<% out.print(new java.util.Date()); %><BR>
</BODY></HTML> 

アクションタグ

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

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

または、

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

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

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

 ただし、あくまでこのような規則に沿わなければならないのは、アクションタグの記述部分のみです。通常のHTMLタグについては、この限りではありません。
 JSP1.2で用意されている主なアクションタグには以下のようなものがあります。

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

JSP1.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つの種類があります。
これらは用途によって使い分けます。

{ :12system開発:java:pasted:20180531-164903.png }}