XML での JSP の記述

JSP は、基本的な JSP シンタックスまたは JSP XML シンタックスで記述できます。JSP XML シンタックスは、整形式の XML 文書に JSP を記述するための形式を定義します。 従来の JSP シンタックスでは、HTML マークアップとともに、JavaScript および JSP ディレクティブ、スクリプトレット、アクション、および式を自由に使用することができました。JSP XML シンタックスの場合は、これらのすべての要素を使用することはできますが、ページ上の XML ルールに従う必要があります。

このセクションでは、JSP XML シンタックスで JSP のコードを記述する利点について説明し、これらのサンプルコードを記載します。

XML ビューについて

基本的な JSP シンタックスは、JSP 仕様によって定義されたスクリプトレット、アクション、ディレクティブ、式、および宣言で構成されています。Web ブラウザは、HTML のように JSP シンタックスを解釈することができません。ブラウザに JSP ページのコンテンツを表示するために、JRun はまず、JSP ソースコードをサーブレットとしてコンパイルする必要があります。JRun は、後でこのサーブレットを使用してレスポンスを生成します。このレスポンスは、HTML などの、リクエストされたマークアップ言語で生成されます。ただし、JSP からサーブレットへのコンパイルプロセスは直接行われません。まず、JSP を XML に変換する必要があります。

初めて JSP ページがリクエストされると、次の手順が実行されます。

  1. 最初は、クライアントが JSP をリクエストします。
  2. JRun は、JSP を、XML ビューと呼ばれる一時的な XML 表現に変換します。
  3. JRun は、JSP ページの XML ビューを検証します。
  4. JRun は XML ビューを .java クラスファイルに変換します。
    この .java クラスファイルは jrun.jsp.runtime.HttpJSPServlet を拡張し、
    jrun.jsp.runtime.JRunJspPage を実装します。サーブレットのソースコードは表示することができます。表示方法については、 「サーブレットのソースコードの表示」 を参照してください。
  5. JRun は、新規クラスをサーブレットにコンパイルします。
  6. サーブレットは、クライアントリクエストに基づいて出力を生成します。

次の図は、クライアントが初めて JSP ページをリクエストしてから最終的にサーブレットにコンパイルされるまでの JSP ページのライフサイクルを示しています。その後、サーブレットはリクエストをクライアントに返します。

クライアントが初めて JSP ページをリクエストしたときの JSP ページの流れを示しています。JSP ページは、*.JSP から XML ビュー、*.JAVA、サーブレットの順に処理されてコンパイルされます。その後、サーブレットはリクエストをクライアントに返します。

サーブレットのソースコードの表示

JSP ページを表すサーブレットのソースコードを表示することも可能です。JSP ページの XML 表現は、JRun がサーブレットを作成する間一時的にメモリ内に維持されるだけなので、表示できません。

デフォルトでは、JRun は、JSP のソースコードから生成されたサーブレットを保持しません。このセクションでは、Java ファイルを保持するように JRun を設定し、それらを表示する方法について説明します。

生成された JSP を保持するには

  1. <JRun のルートディレクトリ>/servers/<JRun サーバ>/SERVER-INF/default-web.xml ファイルで、JSPServlet の 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>
    
  2. Web アプリケーションの /WEB-INF/jsp ディレクトリにある JSP クラスファイルを削除します。

    このファイルを削除すると、それまでに生成されたサーブレットのクラスファイルが削除されます。JRun は、JSP を再コンパイルする前にクラスファイルの有無を確認します。クラスファイルが存在する場合、JSP は再コンパイルされません。また、JRun は JSP の日付/時刻の記録も確認します。したがって、ユーザーが JSP ソースコードを変更し、JSP ファイルを保存すると、JRun では Java ソースコードが再生成され、そのクラスが再コンパイルされます。

  3. JRun サーバを再起動します。
  4. JSP をリクエストします。
  5. Web アプリケーションの /WEB-INF/jsp ディレクトリに生成された、JSP の Java クラスファイル (*.java) を開きます。JRun は、ソースコードに "jrun__" で始まる名前を付け、この名前にバージョン情報を付加します。

JSP XML について

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 XML サンプル

次のサンプルは、前者が従来の JSP シンタックスで記述した JSP ページで、後者が JSP XML シンタックスで記述した JSP ページです。

従来の JSP シンタックス

<%-- 従来の JSP シンタックス -->
<%@ taglib uri=/WEB-INF/doclib.tld prefix="docs" %>
<HTML>
 <BODY>
  <docs:format><P>これはシンプルなページです。</docs>
  <I>とても</I>シンプルです。
 </BODY>
</HTML>

JSP XML シンタックス

<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 シンタックスと JSP XML シンタックスの違い

前のサンプルでもわかるように、JSP XML シンタックスは、従来の JSP シンタックスよりも詳細な指定が必要ですが、より構造化されたページを表現することができます。

前のサンプルの JSP シンタックスとの JSP XML シンタックスの違いは次のとおりです。

次の表に、従来の JSP シンタックスと JSP XML シンタックスの主な違いを示します。
タイプ
従来の JSP シンタックス
JSP XML シンタックス
page
ディレクティブ
<% page ... %>
<jsp:directive.page ... />
include
ディレクティブ
<%@ include ... %>
<jsp:directive.include ... 
/>
taglib
ディレクティブ
<%@ taglib ... %>
<jsp:root 
xmlns:prefix="taglibURI">
...
</jsp:root>
宣言
<%! declaration %>
<jsp:declaration> 
declaration 
</jsp:declaration>
<%= expression %>
<jsp:expression> 
expression 
</jsp:expression>
スクリプトレット
<% scriptlet_code %>
<jsp:scriptlet> 
scriptlet_code 
</jsp:scriptlet>
アクション
<jsp:include> ...
</jsp:include>
<jsp:forward> ...
</jsp:forward>
<jsp:plugin> ...</jsp:plugin>
<jsp:useBean> ...
</jsp:useBean>
<jsp:setProperty> ...
</jsp:setProperty>
<jsp:getProperty> ...
</jsp:getProperty>
旧バージョンの JSP 仕様では、標準アクションに XML シン
タックスを使用するように規定されています。したがって、JSP XML でのアクションのシン
タックスについても変更はありません。
jsp:include アクションで含めるファイルは JSP シンタックスまたは JSP XML シンタックスのいずれでもかまいませんが、同じファイルで両方のタイプのシンタックスを使用することはできません。
テンプレートデータ
template_data
<jsp:text> template_data 
</jsp:text>
コメント
<%-- コメント -->
<!-- コメント -->

新しい 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 シンタックスの詳細

次のセクションでは、JSP XML 要素のシンタックスについて詳しく説明します。

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 シンタックス

<jsp:include page="<%= filename %>" />

JSP XML シンタックス

<jsp:include page="%= filename %" />

jsp:text 要素には JSP の action 要素をラップしないでください。また、JSP の
action 要素には CDATA 要素を含めないでください。

JSP XML の例

次のサンプルコードは、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 バージョンです。

   <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 での特殊文字の表現」 を参照してください。

JSP XML での特殊文字の表現

XML パーサーが誤って解釈する可能性のある特殊文字を表現するには、Unicode エスケープシーケンスまたは HTML エンティティを使用してください。すべての特殊文字を CDATA 要素内に配置するよりも、これらの文字コード体系を使用する方が簡単です。

JSP XML 要素内では、場合によっては引用符 (") の代わりにアポストロフィ (') を使用できます。JRun XML パーサーはアポストロフィを引用符として受け入れます。ただし、コンパイラによっては受け入れないものがあります。

次のセクションでは、JSP XML で HTML エンティティと Unicode シーケンスを使用する方法について説明します。

HTML エンティティリファレンスの使用

HTML エンティティリファレンスは記号名を使用して文字を表します。HTML エンティティリファレンスは次のシンタックスで指定します。

& + entity_name + ;

たとえば、右不等号 (>) の HTML エンティティリファレンスは次のとおりです。

&gt;

HTML エンティティのリストについては、http://www.ramsch.org/martin/uni/fmi-hp/iso8859-1.html をご覧ください。

XML パーサーは、JSP レスポンスを出力に書き込む際に、HTML エンティティを対応する文字表現に変換します。次の表で、JSP XML 要素内で使用できる HTML エンティティを説明します。
要素
jsp:text
次の例は、jsp:text 要素内で左不等号と右不等号の代わりに使用する HTML エンティティを示しています。
<jsp:text>
 &lt;HR&gt;
</jsp:text>
jsp:declaration
次の例は、jsp:declaration 要素内で引用符の代わりに
使用する HTML エンティティを示しています。
<jsp:declaration>
 public String returnColor() {
  String color=&quot;black&quot;;
  return color;
 }
</jsp:declaration>
jsp:expression
次の例は、jsp:expression 要素内で引用符の代わりに使用する HTML エンティティを示しています。
<jsp:expression>
 request.getParameter(&quot;backgroundcolor&quot;)
</jsp:expression>
jsp:scriptlet
次の例は、jsp:scriptlet 要素内で引用符の代わりに使用
する HTML エンティティを示しています。
<jsp:scriptlet>
 String power=request.getParameter(&quot;power& 
 quot;);
</jsp:scriptlet> 
CDATA
CDATA 要素内で HTML エンティティを使用することは
できません。
JSP アクション
action 要素内で HTML エンティティを使用することは
できません。

Unicode シーケンスの使用

Unicode は、すべての文字に対して固有の数値を提供しており、ほとんどのプラットフォームでサポートされています。Unicode シーケンスは 4 文字のシーケンスで構成され、これらの文字シーケンスが記号にマッピングされます。右不等号 (>) の Unicode シーケンスは次のとおりです。

003E

Java コードでは、次の例のように、¥u を付けてシーケンスをエスケープ処理する必要があります。

¥u003E

Unicode シーケンス文字のリストについては、http://www.unicode.org をご覧ください。

XML パーサーは、JSP レスポンスを出力に書き込む際に、Unicode シーケンスを対応する文字表現に変換します。次の表に、JSP XML 要素内で Unicode シーケンスを使用するためのガイドを示します。
要素
jsp:text
jsp:text 要素内では Unicode シーケンスを使用できません。
jsp:declaration
次の例は、jsp:declaration 要素内で引用符の代わりに
使用する Unicode シーケンスを示しています。
<jsp:declaration>
 public String returnCheese() {
  String cheese=¥u0022cheese¥u0022;
  return cheese;
 }
</jsp:declaration>
jsp:expression
次の例は、jsp:expression 要素内で引用符の代わりに使用する Unicode シーケンスを示しています。
<jsp:expression>request.getParameter(¥u0022power¥u0022)</jsp:expression>
jsp:scriptlet
次の例は、jsp:scriptlet 要素内で引用符の代わりに使用する Unicode シーケンスを示しています。
<jsp:scriptlet>
 String 
power=request.getParameter(¥u0022power¥u0022);
 out.println("¥u003CH1¥u003EBehold the power of " 
+ power);
</jsp:scriptlet> 
CDATA
次の例は、CDATA 要素内で引用符の代わりに使用する Unicode シーケンスを示しています。
<jsp:declaration><![CDATA[
 public String returnCheese() {
  String cheese=¥u0022cheese¥u0022;
  return cheese;
 } ]]>
</jsp:declaration>
JSP アクション
action 要素内では Unicode シーケンスを使用できません。