JSP は、基本的な JSP シンタックスまたは JSP XML シンタックスで記述できます。JSP XML シンタックスは、整形式の XML 文書に JSP を記述するための形式を定義します。 従来の JSP シンタックスでは、HTML マークアップとともに、JavaScript および JSP ディレクティブ、スクリプトレット、アクション、および式を自由に使用することができました。JSP XML シンタックスの場合は、これらのすべての要素を使用することはできますが、ページ上の XML ルールに従う必要があります。
このセクションでは、JSP XML シンタックスで JSP のコードを記述する利点について説明し、これらのサンプルコードを記載します。
基本的な JSP シンタックスは、JSP 仕様によって定義されたスクリプトレット、アクション、ディレクティブ、式、および宣言で構成されています。Web ブラウザは、HTML のように JSP シンタックスを解釈することができません。ブラウザに JSP ページのコンテンツを表示するために、JRun はまず、JSP ソースコードをサーブレットとしてコンパイルする必要があります。JRun は、後でこのサーブレットを使用してレスポンスを生成します。このレスポンスは、HTML などの、リクエストされたマークアップ言語で生成されます。ただし、JSP からサーブレットへのコンパイルプロセスは直接行われません。まず、JSP を XML に変換する必要があります。
初めて JSP ページがリクエストされると、次の手順が実行されます。
jrun.jsp.runtime.HttpJSPServlet
を拡張し、jrun.jsp.runtime.JRunJspPage
を実装します。サーブレットのソースコードは表示することができます。表示方法については、 「サーブレットのソースコードの表示」 を参照してください。
次の図は、クライアントが初めて JSP ページをリクエストしてから最終的にサーブレットにコンパイルされるまでの JSP ページのライフサイクルを示しています。その後、サーブレットはリクエストをクライアントに返します。
JSP ページを表すサーブレットのソースコードを表示することも可能です。JSP ページの XML 表現は、JRun がサーブレットを作成する間一時的にメモリ内に維持されるだけなので、表示できません。
デフォルトでは、JRun は、JSP のソースコードから生成されたサーブレットを保持しません。このセクションでは、Java ファイルを保持するように JRun を設定し、それらを表示する方法について説明します。
keepGenerated
初期化パラメータを true
に設定します。次にサンプルを示します。<servlet> <servlet-name>JSPServlet</servlet-name> <servlet-class>jrun.jsp.JSPServlet</servlet-class> <init-param> <param-name>keepGenerated</param-name> <param-value>true</param-value> </init-param> </servlet>
このファイルを削除すると、それまでに生成されたサーブレットのクラスファイルが削除されます。JRun は、JSP を再コンパイルする前にクラスファイルの有無を確認します。クラスファイルが存在する場合、JSP は再コンパイルされません。また、JRun は JSP の日付/時刻の記録も確認します。したがって、ユーザーが JSP ソースコードを変更し、JSP ファイルを保存すると、JRun では Java ソースコードが再生成され、そのクラスが再コンパイルされます。
Java 1.2 JSP 仕様に、JSP シンタックスではなく XML で直接 JSP ページを記述できる機能が採用されました。JSP XML シンタックスは、従来の JSP シンタックスと似たマークアップを使用してページを記述しますが、XML 標準に準拠し、JSP 文書型記述 (DTD) に特有のタグがいくつか追加されています。
JSP XML シンタックスが JSP ページでサポートされていることによる利点は次のとおりです。
JSP XML シンタックススキーマの説明については、http://java.sun.com/dtd/jspxml.xsd をご覧ください。
JSP XML DTD の説明については、http://java.sun.com/dtd/jspxml.dtd をご覧ください。
次のサンプルは、前者が従来の JSP シンタックスで記述した JSP ページで、後者が JSP XML シンタックスで記述した JSP ページです。
<%-- 従来の JSP シンタックス --> <%@ taglib uri=/WEB-INF/doclib.tld prefix="docs" %> <HTML> <BODY> <docs:format><P>これはシンプルなページです。</docs> <I>とても</I>シンプルです。 </BODY> </HTML>
<jsp:root xmlns:jsp="http://java.sun.com/jsp_1_2" xmlns:docs="/WEB-INF/doclib.tld" version="1.2"> <jsp:text> <!-- XML JSP シンタックス --> <![CDATA[ <HTML><BODY> ]]> </jsp:text> <docs:format>これはシンプルなページです。 <![CDATA[<I>とても</I>]]>シンプルです。</docs> <jsp:text> <![CDATA[ </HTML></BODY> ]]> </jsp:text> </jsp:root>
サンプルの JSP を表示するには、samples JRun サーバを起動し、ブラウザで
http://localhost:8200/techniques を開きます。
前のサンプルでもわかるように、JSP XML シンタックスは、従来の JSP シンタックスよりも詳細な指定が必要ですが、より構造化されたページを表現することができます。
前のサンプルの JSP シンタックスとの JSP XML シンタックスの違いは次のとおりです。
jsp:root
はページ全体をラップします。JRun はこのタグを JSP XML ページの始まりとして認識します。
jsp:root
要素は、XML のネーム空間およびバージョン属性を定義します。ネーム空間属性は、ページで使用されるカスタムタグライブラリの接頭辞および URI を定義します。jsp:text
要素はテンプレートデータをラップします。テンプレートデータは、ページの本文、HTML タグ、JavaScript コードなどの JSP シンタックス要素が使用されていないすべてのデータを指します。CDATA
要素は、HTML タグなど、XML パーサーによる解釈から除外するテンプレートデータをラップします。XML パーサーは、このようなデータをうまく解釈できません。XML パーサーは、CDATA
要素内のすべてのデータを無視します。次の表に、従来の JSP シンタックスと JSP XML シンタックスの主な違いを示します。
次の表で、従来の JSP シンタックスの一部ではないが、JSP XML シンタックスで使用される新しい要素を説明します。
要素のシンタックス |
説明 |
---|---|
<jsp:root> |
jsp:root 要素は、JSP XML シンタックスで最上位の要素です。この要素は、JSP のバージョン、ネーム空間、およびタグライブラリを定義します。シンタックス <jsp:root xmlns:jsp="http://java.sun.com/jsp_1_2" xmlns:tag_prefix="tag_library_URI" version="1.2"> Contents_of_JSP </jsp:root> JSP XML ネーム空間は必須であり、http://java.sun.com/jsp_1_2 に設定する必要があります。 他の xmlns 属性はオプションです。これらの属性は、JSP ページのカスタムタグライブラリの接頭辞および URI を定義します。 version 属性は必須であり、1.2 (JSP 仕様のバージョン) に設定する必要があります。例: <jsp:root xmlns:jsp="http://java.sun.com/jsp_1_2" xmlns:test="/WEB-INF/DocSamples.tld" version="1.2"> </jsp:root> |
<jsp:text> |
jsp:text 要素は、JSP のテンプレートデータをラップします。 XML パーサーは、 jsp:text 要素内のテンプレートデータを検証します。したがって、テンプレートデータでは、引用符や括弧などの特殊文字に注意する必要があります。 詳細については、 「JSP XML での特殊文字の表現」 を参照してください。 |
<![CDATA[template _data]]> |
それ以外の JSP XML 要素では、 CDATA 要素がテンプレートデータをラップします。XML パーサーは、CDATA 要素によってラップされているデータをすべて無視します。したがって、CDATA 要素は、特殊文字を多数含む HTML ブロック、JSP スクリプトレット、および宣言をラップするために広く使用されています。シンタックス <jsp_XML_element_tag> <![CDATA[ template_data ]]> </jsp_XML_element_tag> 例: <jsp:text> これは<![CDATA[<I>とても</I>]]>簡単な例です。 </jsp:text> |
次のセクションでは、JSP XML 要素のシンタックスについて詳しく説明します。
括弧や引用符などの特殊文字が XML パーサーで正しく解釈されるようにするには、CDATA
要素内に宣言や式をラップする必要があります。次の例では、CDATA
タグを使用して JSP XML 宣言全体をラップします。
<jsp:declaration><![CDATA[
public int incrementCounter(int x) { x = x + 1; return x; } ]]> </jsp:declaration>
jsp:text
要素には、jsp:expression
および jsp:declaration
要素をラップしないでください。ただし、これらの要素には CDATA
要素を含めることができます。
式および宣言に含まれる特殊文字は、Unicode シーケンスに置き換えることもできます。次の例は、Unicode シーケンス ¥u0022
を使用して引用符を表した JSP XML 式を示しています。
<jsp:expression>request.getParameter(¥u0022backgroundcolor¥u0022) </jsp:expression>
JSP XML で Unicode シーケンスを使用する方法については、 「JSP XML での特殊文字の表現」 を参照してください。
JSP XML シンタックスのスクリプトレットと JSP シンタックスのスクリプトレットの動作の仕組みはほとんど同じです。ただし、特殊文字 (引用符や括弧など) を使用すると XML パーサーが誤って解釈することがあるので、これらは特別な方法でエンコードする必要があります。スクリプトレットに特殊文字を配置する場合は次を使用します。
JSP XML で Unicode シーケンスとHTML エンティティを使用する方法については、 「JSP XML での特殊文字の表現」 を参照してください。
jsp:text
要素には jsp:scriptlet
要素をラップしないでください。
また、jsp:scriptlet
要素には CDATA
要素を含めないでください。
JSP アクションは、従来の JSP シンタックスおよび JSP XML シンタックスのいずれを使用した場合でも XML 標準に準拠します。したがって、コード内のアクションへのアクセス方法を変更する必要はありません。ただし、要求時属性値にアクセスするには、少し異なるシンタックスを使用する必要があります。つまり、次の例に示すように括弧を削除します。
<jsp:include page="<%= filename %>" />
<jsp:include page="%= filename %" />
jsp:text
要素には JSP の action
要素をラップしないでください。また、JSP の action
要素には CDATA
要素を含めないでください。
次のサンプルコードは、JSP XML シンタックスで記述した JSP ページを示しています。
<jsp:root xmlns:jsp="http://java.sun.com/jsp_1_2">
<jsp:scriptlet> String backgroundcolor=request.getParameter (¥u0022backgroundcolor¥u0022); String textcolor=request.getParameter(¥u0022textcolor¥u0022); </jsp:scriptlet>
<jsp:text>
<![CDATA[ <HTML> ]]>
<![CDATA[ <BODY bgcolor="]]></jsp:text><jsp:expression> backgroundcolor</jsp:expression>
<jsp:text><![CDATA[">]]>
<![CDATA[ <FONT FACE="arial, helvetica" COLOR="]]> </jsp:text><jsp:expression>textcolor</jsp:expression>
<jsp:text><![CDATA[">]]> </jsp:text>
<jsp:text>
<![CDATA[<P>]]> テキストの色は </jsp:text> <jsp:expression>textcolor</jsp:expression>
<jsp:text>
<![CDATA[<P>]]> 背景の色は </jsp:text> <jsp:expression>backgroundcolor</jsp:expression>
<jsp:text>
<![CDATA[ </FONT></BODY></HTML>]]> </jsp:text> </jsp:root>
このページを表示するには変数の設定を使用します。次の URL のように、リクエストパラメータを使用してフォントの色と背景色を設定してください。
http://localhost:8100/testxml.jsp?textcolor=orange&backgroundcolor=black
<HTML>
<BODY bgcolor="black"> <FONT FACE="arial, helvetica" COLOR="orange"> テキストの色は オレンジ <P> 背景の色は 黒 </FONT></BODY></HTML>
サンプルの JSP を JSP XML シンタックスで表示するには、samples JRun サーバを起動し、ブラウザで http://localhost:8200/techniques を開きます。
FONT
タグなどの HTML タグを作成する場合は、もう一方のタグと同じ行に request-time 変数式を配置してください。そうしないと、ブラウザがタグを誤って解釈し、予期しない結果が出力される場合があります。
JSP ページに HTML タグを含める場合は必ず CDATA
要素を使用してください。そうしないと、XML パーサーは jsp:text
要素の内容を検証するときに特殊文字を誤って解釈してしまいます。
場合によっては、HTML エンティティまたは Unicode シーケンスを使用して特殊文字を表現できます。詳細については、 「JSP XML での特殊文字の表現」 を参照してください。
XML パーサーが誤って解釈する可能性のある特殊文字を表現するには、Unicode エスケープシーケンスまたは HTML エンティティを使用してください。すべての特殊文字を CDATA
要素内に配置するよりも、これらの文字コード体系を使用する方が簡単です。
JSP XML 要素内では、場合によっては引用符 (") の代わりにアポストロフィ (') を使用できます。JRun XML パーサーはアポストロフィを引用符として受け入れます。ただし、コンパイラによっては受け入れないものがあります。
次のセクションでは、JSP XML で HTML エンティティと Unicode シーケンスを使用する方法について説明します。
HTML エンティティリファレンスは記号名を使用して文字を表します。HTML エンティティリファレンスは次のシンタックスで指定します。
& + entity_name + ;
たとえば、右不等号 (>) の HTML エンティティリファレンスは次のとおりです。
>
HTML エンティティのリストについては、http://www.ramsch.org/martin/uni/fmi-hp/iso8859-1.html をご覧ください。
XML パーサーは、JSP レスポンスを出力に書き込む際に、HTML エンティティを対応する文字表現に変換します。次の表で、JSP XML 要素内で使用できる HTML エンティティを説明します。
Unicode は、すべての文字に対して固有の数値を提供しており、ほとんどのプラットフォームでサポートされています。Unicode シーケンスは 4 文字のシーケンスで構成され、これらの文字シーケンスが記号にマッピングされます。右不等号 (>) の Unicode シーケンスは次のとおりです。
003E
Java コードでは、次の例のように、¥u
を付けてシーケンスをエスケープ処理する必要があります。
¥u003E
Unicode シーケンス文字のリストについては、http://www.unicode.org をご覧ください。
XML パーサーは、JSP レスポンスを出力に書き込む際に、Unicode シーケンスを対応する文字表現に変換します。次の表に、JSP XML 要素内で Unicode シーケンスを使用するためのガイドを示します。