ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server Webアプリケーション、サーブレット、JSPの開発
11g リリース1 (10.3.6)
B60993-05
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

13 WebLogic JSPリファレンス

次の項では、JavaServer Pages (JSP)の作成に関するリファレンス情報を提供します。

JSPタグ

以下の表では、JSPページで使用できる基本的なタグについて説明します。短縮形のタグには、それぞれ対応するXMLタグがあります。

表13-1 JSPページの基本タグ

JSPタグ 構文 説明
Scriptlet
<% java_code %> 

または対応する以下のXMLタグを使用する

<jsp:scriptlet>

java_code

</jsp:scriptlet>

Javaソース・コード・スクリプトレットを、HTMLページ内に埋め込みます。Javaコードが実行され、その出力が順に残りのHTMLとともにページへ挿入されます。詳細は、「スクリプトレット」を参照してください。

Directive

<%@ dir-type dir-attr %>

または対応する以下のXMLタグを使用する

<jsp:directive.dir_type dir_attr />

ディレクティブには、アプリケーション・サーバーへのメッセージが含まれます。

また、ディレクティブは、attr="value"という形式の名前/値ペア属性も含んでおり、これらはアプリケーション・サーバーへの付加的な命令を提供します。「WebLogic JSPのディレクティブ」を参照。

Declarations
<%! declaration %>

...または、等価なXMLタグを使用します...

<jsp:declaration>
  declaration;
</jsp:declaration>

ページ内の他の宣言、スクリプトレット、または式から参照できる変数またはメソッドを宣言します。「宣言」を参照してください。

Expression
<%= expression %> 

...または、等価なXMLタグを使用します...

<jsp:expression>
expression
</expression> 

ページをリクエストするときに評価され、Stringに変換されてから、JSPレスポンスの出力ストリームにインライン化された状態で送信されるJava式を定義します。「式」を参照してください。

Actions
<jsp:useBean ... >

Beanをここでインスタンス化する場合は、ここにJSP本文を入れる

</jsp:useBean>
<jsp:setProperty ... >
<jsp:getProperty ... >
<jsp:include ... >
<jsp:forward ... >
<jsp:plugin ... >

JSPの高度な機能へのアクセスを提供し、XML構文のみを使用します。これらのアクションは、JSP 2.1仕様の定義のとおりにサポートされています。「アクション」を参照してください。

Comments
<%/* comment */%>

HTMLファイルの表示可能なソースからコメントを削除する場合は、JSPコメント・タグのみを使用してください。ブラウザでソースの表示を選択した場合、HTMLのコメントは表示されたままになります。


JSPバージョンの定義

JSP 2.1ではいくつかの新機能が導入され、同じ構文がJSP 2.1とJSP 2.0間で異なる意味を持つ場合があるため、想定する動作を実現するにはJSPバージョンを定義する必要があります。例:

JSPファイル・バージョンの定義ルール

JSPページのバージョンは、明示的な指定方法がないため、次のようにWebアプリケーションのバージョンによって決まります。

  • JSPドキュメントのバージョンは、ドキュメント内に<jsp:root>がある場合はその属性のバージョン値によって決まり、ない場合はWebアプリケーションのバージョンによって決まります。

  • WebアプリケーションのバージョンによってJSPバージョンが決まる場合、2.5はそのバージョンがJSP 2.1であることを、2.4はそのバージョンがJSP 2.0であることを示します。

  • JSPドキュメントに<jsp:root>があり、Webアプリケーションのバージョンが2.4である場合、<jsp:root>のバージョンは2.0を超えてはなりません。ただし、Webアプリケーションのバージョンが2.5の場合は、<jsp:root>のバージョンは2.1未満にできます。

  • 参照されるすべてのJSPタグ・バージョンは、現在のJSPファイルのバージョンを超えてはなりません。

タグ・ファイル・バージョンの定義ルール

すべてのJSPタグ・ファイルのバージョンは、そのタグ・ファイルが属するタグ・ライブラリのバージョンによって決まります。

  • 暗黙的なタグ・ライブラリはディレクトリごとに作成されるため(タグ・ファイルを含む)、暗黙的なタグ・ライブラリのバージョンはデフォルトで2.0となります。ただし、このバージョンは、JSP 2.1の同じディレクトリにあるimplicit.tldファイルによって構成することができます。

  • .tagxファイルの<jsp:root>属性のバージョン値は、タグ・ファイルのバージョンと同じである必要があります。

  • 参照されるすべてのJSPタグ・バージョンは、現在のタグ・ファイルのバージョンを超えてはなりません。

暗黙的オブジェクト用の予約語

JSPでは、スクリプトレットや式に含まれる暗黙的オブジェクト用に予約語が用意されています。この暗黙的オブジェクトとは、JSPページに有用なメソッドや情報を提供するJavaオブジェクトです。WebLogic JSPは、JSP 2.1仕様に定義されている暗黙的オブジェクトをすべて実装しています。JSP APIについては、JSPホームページ(http://www.oracle.com/technetwork/java/javaee/jsp/index.html)にあるJavadocで説明されています。


注意:

この暗黙的オブジェクトはスクリプトレットや式の中でのみ使用するようにします。宣言で定義されるメソッドからこれらのキーワードを使用すると、未定義の変数を参照することになるため、変換時にコンパイル・エラーが発生します。


表13-2 暗黙的オブジェクト用の予約語

予約語 説明
request

HttpServletRequestオブジェクトを表します。ブラウザからのリクエストについての情報が含まれ、Cookie、ヘッダー、およびセッション・データを取得するために便利な一連のメソッドも用意されています。

response

HttpServletResponseオブジェクト、JSPページからブラウザに返送されるレスポンスの設定に便利な複数のメソッドを表します。このレスポンスの例には、Cookieやその他のヘッダー情報があります。

注意: JSPページ内からresponse.getWriter()メソッドを使用することはできません。使用した場合、実行時例外がスローされます。JSPレスポンスをブラウザに返送するには、可能であればスクリプトレット・コード内からoutキーワードを使用します。WebLogic Serverのjavax.servlet.jsp.JspWriterの実装では、javax.servlet.ServletOutputStreamを使用しています。これは、response.getServletOutputStream()を使用できることを暗黙的に示しています。しかし、この実装はWebLogic Serverに固有のものであることに注意が必要です。コードの保守容易性および移植性を保つには、outキーワードを使用します。

out

javax.jsp.JspWriterのインスタンスで、ブラウザへの出力の返送に使用できるメソッドがあります。

出力ストリームを必要とするメソッドを使用している場合、JspWriterは動作しません。この制限を回避するには、バッファされたストリームを提供して、このストリームをoutに記述します。次のコードに、例外スタック・トレースをoutに記述する方法を示します。

  ByteArrayOutputStream ostr = new ByteArrayOutputStream(); 
  exception.printStackTrace(new PrintWriter(ostr));
  out.print(ostr);
pageContext

javax.servlet.jsp.PageContextオブジェクトを表します。様々なスコープのネームスペースやサーブレット関連オブジェクトへのアクセスに便利なAPIで、一般的なサーブレット関連機能のためのラッパー・メソッドを提供します。

session

リクエストに対するjavax.servlet.http.HttpSessionオブジェクトを表します。セッション・ディレクティブは、デフォルトではtrueに設定されています。したがって、sessionはデフォルトで有効です。JSP 2.1仕様では、セッション・ディレクティブがfalseに設定されている場合、sessionキーワードを使用すると変換時に致命的なエラーが発生することが説明されています。

application

javax.servlet.ServletContextオブジェクトを表します。サーブレット・エンジンやサーブレット環境に関する情報の検索に使用します。

リクエストを転送または取り込む場合は、ServletContextを使用してサーブレットのrequestDispatcherにアクセスできます。または、他のサーブレットへのリクエストの転送にJSPのforwardディレクティブ、他のサーブレットからの出力の取込みにJSPのincludeディレクティブを使用することもできます。

config

javax.servlet.ServletConfigオブジェクトを表し、サーブレット・インスタンスの初期化パラメータへのアクセスを提供します。

page

このJSPページから生成されたサーブレット・インスタンスを表します。スクリプトレット・コード内のJavaキーワードthisと同義です。

pagejava.lang.Objectのインスタンスとして定義されるため、使用する際にはJSPページを実装しているサーブレットのクラス・タイプにキャストする必要があります。デフォルトでは、このサーブレット・クラスはJSPファイル名を取って名付けられます。便宜上、pageを使用するかわりに、Javaキーワードthisを使用してサーブレット・インスタンスを参照し、初期化パラメータへアクセスすることをお薦めします。


WebLogic JSPのディレクティブ

関数を実行したり、JSPページを特定の方法で解釈したりするようWebLogic JSPに指示するには、ディレクティブを使用します。ディレクティブは、JSPページのどこに挿入してもかまいません。通常、ディレクティブの位置は無関係で(includeディレクティブを除く)、複数のディレクティブ・タグを使用できます。ディレクティブは、ディレクティブ・タイプとその1つまたは複数の属性で構成されます。

構文は、次に示すように短縮形とXMLの2種類を使用できます。

dir_typeはディレクティブのタイプ、dir_attrはそのディレクティブ・タイプの1つまたは複数のディレクティブ属性のリストで置き換えます。

ディレクティブには、page、taglib、includeの3種類があります。

ページ・ディレクティブを使用した文字エンコーディングの設定

文字エンコーディング・セットを指定するには、そのページの先頭で次のディレクティブを使用します。

<%@ page contentType="text/html; charset=custom-encoding" %>

contentTypeディレクティブで指定した文字セットは、JSPおよびそのJSPに含まれるすべてのJSPで使用される文字セットを指定します。

WebアプリケーションのWebLogic固有のデプロイメント記述子に、デフォルトの文字エンコーディングを指定できます。

taglibディレクティブの使用方法

taglibディレクティブを使用して、JSPページが、タグ・ライブラリに定義されているカスタムJSPタグ拡張を使用することを宣言します。カスタムJSPタグの記述方法と使用方法の詳細は、『WebLogic JSPタグ拡張のプログラミング』を参照してください。

宣言

宣言を使用して、生成されたJSPサーブレット内のクラス・スコープ・レベルの変数とメソッドを定義します。JSPタグの間に記述された宣言は、JSPページの他の宣言やスクリプトレットからアクセスできます。例:

<%!
  int i=0;
  String foo= "Hello";
  private void bar() {
    // ...java code here...
  }
%>

クラス・スコープのオブジェクトは、サーブレットの同一のインスタンス内で実行中の複数のスレッド間で共有されます。共有違反を防ぐには、クラス・スコープのオブジェクトを同期させます。スレッドセーフなコードの記述に自信がない場合は、次のディレクティブを使用して、サーブレットを非スレッドセーフとして宣言できます。

<%@ page isThreadSafe="false" %>

デフォルトでは、この属性はtrueに設定されています。isThreadSafeをfalseに設定すると、メモリー消費量が増えるのでパフォーマンスが低下することがあります。

スクリプトレット

JSPスクリプトレットは、JSPサーブレットのHTTPレスポンスのJava本文を構成します。次に示すように短縮形またはXMLのscriptletタグを使用して、JSPページ内にスクリプトレットを含めます。

短縮形:

<%
  // Your Java code goes here
%>

XML:

<jsp:scriptlet>
  // Your Java code goes here
</jsp:scriptlet>

スクリプトレットの特長は次のとおりです。

JSPファイルの中に式を含めるには、次のタグを使用します。

<%= expr %>

exprをJava式で置き換えます。式が評価されるときに、そのstring表現がHTMLレスポンス・ページ内にインラインで配置されます。これは次の短縮形です

<% out.print( expr ); %>

このテクニックを使用すると、JSPページ内のHTMLを読みやすくできます。次の項のサンプルではexpressionタグの使用方法を示します。

式は、ユーザーが以前に入力したデータを戻すためによく使われます。ユーザーが入力したデータを出力する場合、HTML特殊文字が入力されていればすべて削除することをお薦めします。これらの文字を削除しない場合、クロス・サイト・スクリプティングによってWebサイトが損なわれるおそれがあります。詳細は、「JSP式言語」を参照してください。

HTMLと埋め込みJavaを使用したJSPの例

次に、HTMLと埋め込みJavaを使用したJSPの例を示します。

<html>
  <head><title>Hello World Test</title></head>
<body bgcolor=#ffffff>
<center>
<h1> <font color=#DB1260> Hello World Test </font></h1>
<font color=navy>
<%
    out.print("Java-generated Hello World");
%>
</font>
<p> This is not Java!
<p><i>Middle stuff on page</i>
<p>
<font color=navy>
<%
     for (int i = 1; i<=3; i++) {
%>
        <h2>This is HTML in a Java loop! <%= i %> </h2>
<%
     }
%>
</font>
</center>
</body>
</html>

上記のコードがコンパイルされると、ブラウザには次のようなページが表示されます。

jsp_output.jpgについては周囲のテキストで説明しています

アクション

JSPアクションを使用して、JavaBeanで表されるオブジェクトの変更、使用、または作成を行います。アクションでは、XML構文のみが使用されます。

JSPでのJavaBeanの使用方法

<jsp:useBean>アクション・タグを使用すると、JavaBean仕様に準拠したJavaオブジェクトをインスタンス化し、それをJSPページから参照できます。

JavaBean仕様に準拠するには、オブジェクトに次のものが必要です。

  • 引数をとらないパブリック・コンストラクタ

  • variableフィールドに対するsetVariable()メソッド

  • variableフィールドに対するgetVariable()メソッド

JavaBeanオブジェクトをインスタンス化する

<jsp:useBean>タグは、既存の名前付きJavaオブジェクトを特定のスコープから検索しようと試みます。既存のオブジェクトが見つからなければ、新しいオブジェクトをインスタンス化し、id属性で指定された名前にそのオブジェクトを関連付けようとします。オブジェクトは、オブジェクトの可用性を決定するscope属性で指定された位置に格納されます。たとえば、次のタグでは、examples.jsp.ShoppingCartというタイプのJavaオブジェクトを、cartという名前のHTTPセッションから検索しようとします。

<jsp:useBean id="cart"
    class="examples.jsp.ShoppingCart" scope="session"/>

そのようなオブジェクトが存在しない場合、JSPでは新しいオブジェクトを作成し、cartという名前のHTTPセッション内に格納しようとします。クラスは、WebLogic Serverの起動に使用するCLASSPATH、またはJSPを含むWebアプリケーションのWEB-INF/classesディレクトリに入っている必要があります。

捕捉が必要な実行時例外があるので、<jsp:useBean>タグとともにerrorPageディレクティブを使用することをお薦めします。errorPageディレクティブを使用しない場合、JavaBeanで参照されるクラスを作成できず、InstantiationExceptionがスローされ、ブラウザにエラー・メッセージが返されます。

Java内で有効な型キャスト操作であれば、type属性を使用して、そのJavaBeanタイプを別のオブジェクトやインタフェースにキャストできます。class属性なしでこの属性を使用する場合、JavaBeanオブジェクトは、指定したスコープ内にすでに存在している必要があります。有効でない場合は、InstantiationExceptionがスローされます。

JavaBeanインスタンス化のセット・アップ作業を行う

<jsp:useBean>タグ構文には、別の形式もあります。これを使用すると、オブジェクトがインスタンス化されるときに実行するJSPコードの本文を定義できます。名前付きJavaBeanが指定したスコープ内にすでにある場合、本文は実行されません。この形式を使用すると、オブジェクトが最初に作成されるときのプロパティを設定できます。例:

<jsp:useBean id="cart" class="examples.jsp.ShoppingCart"
 scope=session>
    Creating the shopping cart now...
    <jsp:setProperty name="cart"
     property="cartName" value="music">
</jsp:useBean>

注意:

class属性なしでtype属性を使用すると、JavaBeanオブジェクトはインスタンス化されません。したがって、本文を含めるようなタグ形式は使用しないでください。代わりに、単一のタグ形式を使用します。この場合、JavaBeanが指定したスコープ内に存在している必要があります。存在していないとInstantiationExceptionがスローされます。errorPageディレクティブを使用して、潜在的な例外を捕捉します。


JavaBeanオブジェクトを使用する

JavaBeanオブジェクトをインスタンス化したら、Javaオブジェクトのように、JSPファイルでそのid名により参照できます。スクリプトレット・タグや式評価タグ内でそれを使用できます。<jsp:setProperty>タグを用いてそのsetXxx()メソッドを呼び出すこともでき、また<jsp:getProperty>タグを用いてgetXxx()メソッドを呼び出すこともできます。

JavaBeanオブジェクトのスコープを定義する

scope属性を使用して、JavaBeanオブジェクトの可用性とライフスパンを指定します。スコープは以下のいずれかです。

表13-3 JavaBeanオブジェクトのscope属性の定義

スコープ 説明
page

JavaBeanに対するデフォルトのスコープです。オブジェクトは現在のページのjavax.servlet.jsp.PageContextに格納されます。このJSPページの現在の呼出しからのみ使用できます。インクルードされたJSPページでは使用できません。このページ・リクエストの完了時には破棄されます。

request

requestスコープを使用すると、オブジェクトは現在のServletRequest内に格納されます。同じリクエスト・オブジェクトに渡された他のインクルード済みJSPページで使用可能です。このオブジェクトは現在のリクエストが完了したときに破棄されます。

session

複数のHTTPページにわたってJavaBeanオブジェクトを追跡できるよう、sessionスコープを使用してHTTPセッション内にJavaBeanオブジェクトを格納できます。JavaBeanへの参照は、このページのHttpSessionオブジェクトに格納されます。このスコープを使用するには、JSPページがセッションに参加できなければなりません。つまり、このpageディレクティブで、sessionfalseに設定しないようにします。

application

application-scopeレベルでは、JavaBeanオブジェクトはWebアプリケーションに格納されます。このスコープを使用すると、同じWebアプリケーションの中で実行されている他のサーブレットやJSPページからもこのオブジェクトが使用可能になります。


JavaBeansの使用の詳細は、JSP 2.1仕様(http://www.oracle.com/technetwork/java/javaee/jsp/index.html)を参照してください。

リクエストの転送

どのような種類の認証を使用している場合でも、<jsp:forward>タグでリクエストが転送されるときには、ユーザーを再認証する必要はありません(デフォルト設定)。この動作を変更して、転送されたリクエストの認証を実行するには、<check-auth-on-forward/>要素をWebLogic固有のデプロイメント記述子(weblogic.xml)の<container-descriptor>要素に追加します。例:

<container-descriptor>
    <check-auth-on-forward/>
</container-descriptor>

リクエストのインクルード

<jsp:include>タグを使用すると、JSPに別のリソースを含めることができます。このタグは、次の2種類の属性を取ります。

page - 含めるリソースを指定するためにページ属性を使用します。例:

<jsp:include page="somePage.jsp"/>

flush - このブール型属性をtrueに設定すると、ページ出力がバッファに格納され、リソースが含まれる前にそのバッファがフラッシュされます。<jsp:include>タグがJSPページの別のタグ内にあり、含めるリソースをそのタグで処理する場合は、flush="false"に設定すると便利です。

JSP式言語

新しいJSP式言語(JSP EL 2.1)は、ECMAScript式言語とXPath式言語の両方の影響を受けています。JSP ELは、標準アクションおよびカスタム・アクションの属性値と、テンプレート・テキスト内で使用可能です。どちらの場合も、JSP ELは一貫して構文#{expr}または${expr}で呼び出されます。

#{expr}構文は、JSP EL 2.1で導入された遅延式を示します。「#{}」で区切られた式は、その値がシステムで必要とされるまで評価されないため、「遅延評価」を使用します。これにより、式はライフサイクル内の適切な時点で基底のメカニズムによって処理されるようになります。一方、「${}」で区切られた式は、JSPページのコンパイル時にコンパイルされ、JSPページの実行時に実行されるため、「即時評価」を使用します。遅延式には、遅延ValueExpressionおよび遅延MethodExpressionが含まれます。${expr}構文は、JSP EL 2.1でサポートされています。

このJSP ELがJSP技術に追加されたことで、スクリプトレットJSPページをより簡単に記述できるようになりました。スクリプトレットJSPページではJSP EL式を使用できますが、Javaスクリプトレット、Java式、そしてJava宣言要素は使用できません。この使用パターンは、web.xmlデプロイメント記述子のscripting-invalid JSP構成要素を介して使用することができます。

JSP式言語の詳細は、http://java.sun.com/products/jsp/download/index.htmlを参照してください。

式および属性値

JSP EL式は、実行時の式を受け入れられる任意の属性で、標準アクションとカスタム・アクションのどちらの場合にも使用できます。以下に、属性値での式の使用方法として例を示します。

  • 属性値に式の構文<some:tag value="${expr}"/>または<some:tag value="#{expr}"/>を1つ含めます。この場合、式が評価され、結果がその属性の想定される型に変換されます。この変換は、http://java.sun.com/products/jsp/download/index.htmlのセクション1.18 「Type Conversion」で説明されている型変換のルールに従います。

  • 属性値に1つまたは複数の式をテキストを挟むかテキストで囲む形で含めます。たとえば<some:tag value="some${expr}${expr}text${expr}"/>または<some:tag value="some#{expr}#{expr}text#{expr}"/>のようにします。この場合、式が左から右へ評価され、(後述の型変換ルールに従って) String型に変換されてから、間に挟まれたテキストと連結されます。結果であるString型はhttp://java.sun.com/products/jsp/download/index.htmlのセクション1.18 「Type Conversion」で説明されている型変換のルールに従って、その属性の想定される型に変換されます。

  • 属性値にテキストのみを含めます。たとえば<some:tag value="sometext"/>のようにします。この場合、属性のString値がその属性の想定される型に変換されます。この変換は、http://java.sun.com/products/jsp/download/index.htmlのセクション1.18 「Type Conversion」で説明されている型変換のルールに従います。


    注意:

    このルールはJSP 2.1の変換と同様ですが、空の文字列の扱いが異なります。


JSPXを使用する際は、以下の2つの条件を満たす必要があります。

  • web.xml - web-appで、サーブレットのバージョン属性が2.4以上に定義されている必要があります。この条件が満たされない場合は、すべてのEL機能が無視されます。

  • TLDファイル- jsp接頭辞に、次のようなネームスペース宣言が必要です。

    <html xmlns:jsp="http://java.sun.com/JSP/Page";
    

以下に、JSP ELを使用してBeanのプロパティが3個未満かどうかを調べる条件付きのアクションを示します。

<c:if test="${bean1.a < 3}">
...
</c:if>

通常のJSPの制御メカニズムでも<mytags: if test="true" />を使用することは可能です。リテラル値に文字列${を含める場合、この値を含むリテラルの使用方法は次のようになります。この場合、その値を含むリテラルの使用方法は次のようになります。

<mytags:example code="an expression is ${'${'}expr}" />

結果として生じる属性値は、「an expression is ${expr}」という文字列になります。

式およびテンプレート・テキスト

テンプレート・テキスト内にはJSP ELを直接使用できます。カスタムまたは標準のアクションの本文内でもアクション外部のテンプレート・テキスト内でも構いません。ただし、タグの本体がタグ依存の場合や、(通常、互換性の問題から)ディレクティブによって明示的に、または暗黙的にJSP ELが無効化されている場合は除きます。

JSP EL式のセマンティクスはJava式と同じで、値が計算されて現在の出力に挿入されます。エスケープ処理が必要な場合(クロス・サイト・スクリプティング攻撃を予防するために行う場合など)は、JSTLのコア・タグ<c:out>を使用できます。例:

<c:out value="${anELexpression}" />

以下に示すカスタム・アクションでは、2つのJSP EL式を使用してBeanのプロパティにアクセスしています。

<c:wombat>
One value is ${bean1.a} and another is ${bean2.a.c}. 
</c:wombat>

JSP式言語の暗黙的オブジェクト

JSPページ内で使用するJSP EL式で利用可能な暗黙的オブジェクトが、複数用意されています。これらのオブジェクトは以下の名前を使用して常に利用可能です。

表13-4に、上記の暗黙的オブジェクトの使用例をいくつか示します。

表13-4 暗黙的オブジェクトの使用例

説明
${pageContext.request.requestURI}

リクエストのURI (HttpServletRequestから取得)

${sessionScope.profile}

セッション・スコープの属性の名前付きプロファイル(見つからなかった場合null)

${param.productId}

productIdパラメータのString値(見つからなかった場合null)

${paramValues.productId}

productIdパラメータのすべての値を含むString[] (見つからなかった場合null)


JSP式言語のリテラルと演算子

以降の節では、JSP EL式のリテラルと演算子について説明します。JSP ELの構文はとても簡単です。変数には名前でアクセスできます。汎用の演算子[]を使用すると、マップ、リスト、オブジェクトの配列、およびJavaBeanオブジェクトのプロパティにアクセスできます。この演算子は自由にネスト可能です。.演算子は、JavaのID規約に従った名前を持つプロパティに対し、簡単にアクセスする手段として使用できます。一方、[]演算子では、より汎用的なアクセスが可能です。

標準のJava関係演算子を使用して、関係比較を行えます。他の値、ブール値(等価比較のみ)、String型、整数、または浮動小数点リテラルに対して比較を実行できます。算術演算子を使用すると、整数および浮動小数点の値を計算できます。論理演算子も利用可能です。

リテラル

ブール値、整数、浮動小数点、文字列、null用のリテラルが用意されています。

  • ブール値 - trueおよびfalse

  • 整数 - JSP 2.1 EL仕様の1.19項 「Collected Syntax」のIntegerLiteralコンストラクトで定義されています。

  • 浮動小数点 - JSP 2.1 EL仕様の1.19項 「Collected Syntax」のFloatingPointLiteralコンストラクトで定義されています。

  • 文字列 - 単一引用符および二重引用符。"引用符は、同じ種類の引用符で囲まれた文字列値でのみエスケープする必要があります。

  • Null - null

エラー、警告、デフォルト値

ほとんどの場合、JSPページは表示用に使われます。表示に使用する場合は一般的に、ページに単純なエラーがあっても可能な限り良い状態で表示できるようにすることが、もっとも重要なポイントになります。JSP ELでは、この要件のための警告は用意されていませんが、デフォルト値とエラーを利用できます。デフォルト値は入力を修正する値で、問題がある場合に代わりに表示するものとして割り当てられます。エラーは例外であり、スローされた後には標準のJSP機構で処理されます。

演算子

JSP式言語で提供される演算子の一覧を以下に示します。

  • .および[]

  • 算術演算子: +、- (二項演算子)、*、/およびdiv、%およびmod、- (単項演算子)

  • 論理演算子: and、&&、or、||、not、!

  • 比較演算子: ==、eq、!=、ne、<、lt、>、gt、<=、ge、>=、le他の値、ブール値、文字列、整数、または浮動小数点リテラルに対して比較を実行できます。

  • 空演算子: empty演算子は接頭辞操作で、値がnullまたは空のどちらなのかを判断するために使用できます。

  • 条件演算子: A ?B : C。Aを評価した結果に応じてBまたはCの評価が実施されます。

演算子とその機能の詳細は、JSP 2.1仕様を参照してください。

演算子の優先順位

以下に、演算子の優先順位を高い方から低い方へ、左から右の順で示します。

  • [] .

  • ()

  • - (単項演算子) not ! empty

  • * / div % mod

  • + - (二項演算子)

  • < > <= >= lt gt le ge

  • == != eq ne

  • && and

  • || or

  • ? :

JSP式言語の予約語

以下の単語は予約語であり、識別子として使用することはできません。

JSP式言語の名前付き変数

JSP ELの基本的な構想に、変数名を評価してオブジェクトに解決することがあります。JSP EL APIでは、名前をオブジェクトに解決する汎用メカニズムとしてVariableResolverが提供されています。このデフォルトの解決メカニズムが、テンプレートや属性内にあるJSP EL式の評価に使用されます。このデフォルト解決メカニズムでは、「JSP式言語の暗黙的オブジェクト」で説明した暗黙的オブジェクトが提供されています。

デフォルトの解決メカニズムでは、他の識別子をマップすることも可能です。これには、pageContextオブジェクトのPageContext.findAttribute(String)の動作により、識別子の値を属性としてルックアップします。たとえば${product}のようにします。

この式ではproductという名前の属性を検索し、ページ、リクエスト、セッション、およびアプリケーション・スコープを検索して、属性の値を返します。属性が見つからない場合、nullが返されます。JSP 2.1仕様の第14章「Expression Language API」を参照してください。VariableResolverの詳細と、評価APIとの対応関係について参照してください。

JSPでのユーザー入力データのセキュリティ

式やスクリプトレットを使用すると、JSPでユーザーからデータを受け取ったり、ユーザーが入力したデータを返したりできます。たとえば、例13-1のサンプルJSPでは、ユーザーに文字列の入力を求め、その文字列をuserInputという名前のパラメータに代入してから、<%= javax.servlet.ServletRequest.getParameter("userInput")%>という式を使ってそのデータをブラウザに返しています。

例13-1 ユーザーが入力した内容を戻すための式の使用

<html>
  <body>
    <h1>My Sample JSP</h1>
      <form method="GET" action="mysample.jsp">
          Enter string here:
          <input type="text" name="userInput" size=50>
          <input type=submit value="Submit">
       </form>
    <br>
    <hr>
    <br>
    Output from last command: 
    <%= javax.servlet.ServletRequest.getParameter("userInput")%>
  </body>
</html>

このようにユーザーが入力したデータを返す機能があると、クロス・サイト・スクリプティングと呼ばれるセキュリティの脆弱性がもたらされます。これは、ユーザーのセキュリティ認可を盗用するために利用されるおそれがあります。クロス・サイト・スクリプティングの詳細については、http://www.cert.org/tech_tips/malicious_code_mitigation.htmlの「Understanding Malicious Content Mitigation for Web Developers」(CERTのセキュリティ勧告)を参照してください。

セキュリティの脆弱性をなくすには、ユーザーが入力したデータを戻す前に、そのデータをスキャンして、表13-5に示すHTML特殊文字があるかどうかを調べます。特殊文字が見つかった場合、HTMLのエンティティ参照または文字参照と置き換えます。文字を置換することで、ブラウザでユーザー入力によるデータがHTMLとして実行されることを回避します。

表13-5 置換えの必要があるHTMLの特殊文字

置き換える必要のある特殊文字 置換え後のエンティティ/文字参照

<

&lt;

>

&gt;

(

&40;

)

&41;

#

&35;

&

&38;


WebLogic Serverユーティリティ・メソッドを使用する

WebLogic Serverには、ユーザーが入力したデータ内の特殊文字を置き換えるweblogic.servlet.security.Utils.encodeXSS()メソッドが用意されています。このメソッドを使用するには、ユーザー入力データを入力として提供します。例:

<%= weblogic.servlet.security.Utils.encodeXSS(
javax.servlet.ServletRequest.getParameter("userInput"))%>

アプリケーション全体を保護するため、ユーザーが入力したデータは、戻す際に毎回encodeXSS()メソッドを使用する必要があります。上記の例はencodeXSS()メソッドを明らかに使用すべき場所ですが、表13-5には、他にencodeXSS()メソッドの使用を検討すべき場所を示します。

表13-6 ユーザー入力データを戻すコード

ページのタイプ ユーザー入力データ

エラー・ページ

誤りのある入力文字列、無効なURLやユーザー名

「ユーザー名はアクセスを許可されていません。」と表示するエラー・ページ

ステータス・ページ

ユーザー名、以前のページでの入力の要約

以前のページでの入力を確認するようユーザーに求める要約ページ

データベース表示

データベースから提示されたデータ

以前にユーザーによって入力されたデータベース・エントリのリストを表示するページ


JSPでのセッションの使用方法

WebLogic JSP内のセッションは、JSP 2.1仕様にしたがって動作します。次に、セッションの使用方法に関連した留意事項を示します。

JSPからのアプレットのデプロイメント

JSPを使用すると、適切なクライアント・ブラウザ・タグを含むHTMLを生成することによって、WebページにJava Plug-inを簡単に組み込むことができます。Java Plug-inでは、クライアントのWebブラウザにより実装されたJVMのかわりに、Java Runtime Environment (JRE)を使用することができます。この機能により、アプレットと特定の種類のWebブラウザ間の非互換性による問題が回避できます。Java Plug-inは、http://www.oracle.com/technetwork/java/index-jsp-141438.htmlで入手可能です。

Internet ExplorerとNetscapeでは使用している構文が違うため、<jsp:plugin>アクションから生成されたサーブレット・コードでは、動的にブラウザ・クライアントの種類が調べられ、適切な<OBJECT>タグか、<EMBED>タグがそのHTMLページに送信されます。

<jsp:plugin>タグでは、<APPLET>タグの属性に似た多くの属性、および使用するJava Plug-inのバージョンを構成できる他の属性群が使用されます。アプレットがサーバーと通信する場合、アプレット・コードを実行するJVMはWebLogic Serverを実行するJVMと互換性がある必要があります。

次のサンプルでは、プラグイン・アクションを使用してアプレットをデプロイします。

<jsp:plugin type="applet" code="examples.applets.PhoneBook1"
 codebase="/classes/" height="800" width="500" 
 jreversion="2.0" 
 nspluginurl=
 "http://java.sun.com/products/plugin/1.1.3/plugin-install.html"
 iepluginurl=
"http://java.sun.com/products/plugin/1.1.3/
  jinstall-113-win32.cab#Version=1,1,3,0" >
<jsp:params>
  <param name="weblogic_url" value="t3://localhost:7001">
  <param name="poolname" value="demoPool">
</jsp:params>
<jsp:fallback>
  <font color=#FF0000>Sorry, cannot run java applet!!</font>
</jsp:fallback>

</jsp:plugin>

上のサンプルのJSP構文は、ブラウザに対して、(まだダウンロードされていなければ) Java Plug-inバージョン1.3.1をダウンロードし、code属性で指定したアプレットを、codebaseで指定された位置から実行するように指示しています。

jreversion属性は、アプレットが要求しているJava Plug-inのバージョンを識別します。Webブラウザでは、このバージョンのJava Plug-inを使おうとします。プラグインがまだブラウザにインストールされていない場合、nspluginurl属性およびiepluginurl属性で、Java Plug-inのダウンロード元のURL(http://www.oracle.com/technetwork/java/index-jsp-141438.html)を指定します。一度プラグインがWebブラウザにインストールされれば、再度そのプラグインをダウンロードする必要はありません。

WebLogic ServerではJava 1.3.x VMを使用するため、<jsp:plugin>タグ内に、Java Plug-inバージョン1.3.xを指定する必要があります。上のサンプル・コードで1.3 JVMを指定するには、対応する属性値を次のように置き換えます。

jreversion="1.3"
nspluginurl=
"http://java.sun.com/products/plugin/1.3/plugin-install.html"
iepluginurl=
"http://java.sun.com/products/plugin/1.3/jinstall-131-win32.cab"

プラグイン・アクションのほかの属性は、<APPLET>タグの属性に相当します。アプレット・パラメータは、<params>タグのペアで指定し、<jsp:plugin>タグと</jsp:plugin>タグでネストします。

<jsp:fallback>タグでは、<jsp:plugin>アクションでサポートされていないブラウザ用にHTMLを置換できます。<fallback>タグと</jsp:fallback>タグでネストされたHTMLが、プラグイン構文のかわりに送られます。

WebLogic JSPコンパイラの使用方法


注意:

WebLogic JSPコンパイラは非推奨になっています。EARファイル、WARファイル、およびEJBをコンパイルするには、WebLogicのappcコンパイラであるweblogic.appcの使用をお薦めします。『Oracle WebLogic Server WebLogic Enterprise JavaBeansのプログラミング』のappcリファレンスに関する項を参照してください。


WebLogic JSPコンパイラではコンパイルのパフォーマンスを向上させるため、ディスク上にまずjavaファイルを作成してからクラス・ファイルにコンパイルするのではなく、直接JSPをディスク上のクラス・ファイルに変換します。javaファイルはメモリー上にのみ置かれます。

生成されたjavaファイルを参照するには、メモリー内のjavaファイルをディスクにダンプする -keepgeneratedフラグをオンにします。


注意:

JSPのコンパイル中には、コマンド・ライン・フラグ(compilerclass)も記述子要素も呼び出されません。


JSPコンパイラの構文

JSPコンパイラは、他のWebLogicコンパイラ(RMIコンパイラやEJBコンパイラなど)とほとんど同じ方法で動作します。JSPコンパイラを起動するには、次のコマンドを入力します。

$ java weblogic.jspc -options fileName

fileNameを、コンパイルするJSPファイルの名前で置き換えます。ターゲットのfileNameの前か後にoptionsを指定することもできます。次の例では、-dオプションを使用してmyFile.jspをコンパイルし、出力先ディレクトリweblogic/classesに出力します。

$ java weblogic.jspc -d /weblogic/classes myFile.jsp

注意:

Webアプリケーションの一部で、Webアプリケーションのリソース(JSPタグ・ライブラリなど)を参照しているJSPをプリコンパイルする場合は、-webappフラグを使用してWebアプリケーションの場所を指定する必要があります。次のJSPコンパイラ・オプションのリストで、-webappフラグについて説明します。


JSPコンパイラ・オプション

次のオプションを任意で組み合わせて使用します。

表13-7 JSPコンパイラ・オプション

オプション 説明
-classpath

希望するCLASSPATHとなるディレクトリのリストを(Windows NT/2000プラットフォームではセミコロンで区切り、UNIXプラットフォームではコロンで区切って)追加します。JSPに必要なすべてのクラスを格納するディレクトリを含めます。次に例を示します(実際には1行で入力します)。

$ java weblogic.jspc -classpath  java/classes.zip;/weblogic/classes.zip myFile.JSP
-charsetMap

JSP contentTypeディレクティブで使用されるIANAまたは非公式の文字セット名からjava文字セット名へのマッピングを指定します。例:

-charsetMap x-sjis=Shift_JIS,x-big5=Big5

最も一般的なマッピングは、JSPコンパイラに組み込まれています。このオプションは、希望の文字セット・マッピングが認識されない場合にのみ使用します。

-commentary

JSPコンパイラにより、生成されたHTMLページにJSPからのコメントが含められます。このオプションを省略すると、コメントは生成されたHTMLページに表示されません。

-compileAll

カレント・ディレクトリ、または-webappオプションで指定したディレクトリ内のすべてのJSPを再帰的にコンパイルします-webappの説明を参照)。サブディレクトリ内のJSPもコンパイルされます。

-compileFlags

1つまたは複数のコマンド・ライン・フラグをコンパイラに渡します。複数のフラグはスペースで区切り、引用符で囲みます。例:

java weblogic.jspc -compileFlags "-g -v" myFile.jsp
-compiler 

生成されたJavaソース・コードからクラス・ファイルをコンパイルする際に使用するJavaコンパイラを指定します。デフォルトでは、コンパイラとしてjavacが使われます。コンパイラのフルパスを明示的に指定する場合を除いて、Javaコンパイラ・プログラムはPATH内になければなりません。

-compilerclass

Javaコンパイラを、ネイティブ実行ファイルとしてではなく、Javaクラスとして実行します。

-compressHtmlTemplate

JSPテンプレート・ブロック内のHTMLを圧縮し、実行時のパフォーマンスを改善します。

JSPのHTMLテンプレート・ブロックに<pre>タグが含まれる場合は、このオプションを有効にしないでください。

-d <dir>

コンパイルされた出力(クラス・ファイル)の出力先ディレクトリを指定します。このオプションは、コンパイルされたクラスを、すでにCLASSPATHに入っているディレクトリに置くためのショートカットとして使用します。

-depend

JSPの以前に生成されたクラス・ファイルのタイム・スタンプが、JSPソース・ファイルよりも新しい場合、JSPは再コンパイルされません。

-debug

デバッグ・モードでコンパイルします。

-deprecation

生成されたJavaソース・ファイルをクラス・ファイルにコンパイルしているときに、ソース・ファイル中に非推奨のメソッドが使用されていると警告します。

-docroot directory

-webappを参照してください。

-encoding default|named character encoding

有効な引数は、(a) JDKのデフォルト文字エンコーディングの使用を指定するdefault、または(b) 8859_1などの名前付き文字エンコーディングです。-encodingフラグが指定されない場合、バイト配列が使用されます。

-g

クラス・ファイルにデバッグ情報も入れるよう、Javaコンパイラに指示します。

-help

JSPコンパイラで使用可能なオプションをすべて表示します。

-J

コンパイラに渡されるオプションのリストを取得します。

-k

1つのコマンドで複数のJSPをコンパイルする場合、1つまたは複数のJSPがコンパイルに失敗しても、コンパイルを続行します。

-keepgenerated

コンパイル処理の途中で作成されたJavaソース・コード・ファイルを削除せずに残します。通常、こうしたファイルはコンパイル後に削除されます。

-noTryBlocks

JSPファイルに、多数のまたは深くネストしたカスタムJSPタグが含まれていて、コンパイル時にjava.lang.VerifyError例外が発生する場合、JSPを正しくコンパイルするためにこのフラグを使用します。

-nowarn

Javaコンパイラからの警告メッセージが出力されないようにします。

-noPrintNulls

JSPの式の"null"が"" (空の文字列)として示されます。

-O 

最適化を有効にして、生成されたJavaソース・ファイルをコンパイルします。このオプションは、-gオプションをオーバーライドします。

-optimizeJavaExpression

Java式を最適化し、実行時のパフォーマンスを改善します。

-package packageName

生成されたJava HTTPサーブレットのパッケージ名の前に追加するパッケージ名を設定します。デフォルトはjsp_servletです。

-superclass classname

生成されたサーブレットによって拡張されたスーパークラスのクラス名を設定します。スーパークラスの名前は、HttpServletまたはGenericServletから派生したものでなければなりません。

-verbose

compilerフラグで指定されたJavaコンパイラに、verboseフラグを渡します。詳細は、コンパイラのドキュメントを参照してください。デフォルトはoffです。

-verboseJavac

指定したJSPコンパイラによって生成されたメッセージを出力します。

-version

JSPコンパイラのバージョンを出力します。

-webapp directory

展開されたディレクトリ形式のWebアプリケーションが含まれるディレクトリの名前。JSPタグ・ライブラリやその他のJavaクラスなど、Webアプリケーション内のリソースへの参照がJSPに含まれる場合、JSPコンパイラはそのリソースをこのディレクトリで検索します。Webアプリケーションのリソースを要求するJSPをコンパイルする場合、このフラグを省略するとコンパイルに失敗します。


JSPのプリコンパイル

weblogic.xmlデプロイメント記述子の<jsp-descriptor>要素のprecompileパラメータをtrueに設定すると、Webアプリケーションをデプロイまたは再デプロイしたとき、またはWebLogic Serverを起動したときにJSPをプリコンパイルするようにWebLogic Serverを構成できます。サーバーを再起動するたびに、また追加でサーバーをターゲット指定したときに、JSPを再コンパイルしないようにするには、weblogic.jspcを使用してJSPをプリコンパイルし、プリコンパイルしたJSPをWEB-INF/classesフォルダにコピーして、.warファイルにアーカイブします。ソース・ファイルをアーカイブ.warファイルとは別のディレクトリに格納すると、クラス・ファイルのいずれかとJSPとの依存関係によってエラーが発生するおそれがなくなります。

JSPClassServletの使用

JSPの再コンパイルを回避する別の方法は、JSPServletのかわりにJSPClassServletを使用し、コンパイル済みのJSPをWEB-INF/classesディレクトリ内に格納することです。これによって、ソース・コードがサーバーから検出されなくなるため、JSPが再コンパイルされる可能性がなくなります。この方法を使用すると、JSPに対するいかなる変更も記録されず、JSPは再コンパイルされません。この方法により、プリコンパイル後にアプリケーションからJSPソース・コードを完全に削除することができます。

JSPClassServletをWebアプリケーションのweb.xmlファイルに追加する方法の例を次に示します。

<servlet>
    <servlet-name>JSPClassServlet</servlet-name>
    <servlet-class>weblogic.servlet.JSPClassServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>JSPClassServlet</servlet-name>
    <url-pattern>*.jsp</url-pattern>
  </servlet-mapping>

仮想ホスティングを使用する場合は、作成するマッピングに対応する物理的なディレクトリを用意し、サーバーがファイルを検出できるようにする必要があります。