Oracle® Fusion Middleware Oracle WebLogic Server Webアプリケーション、サーブレット、JSPの開発 12c (12.2.1.1.0) E77264-02 |
|
![]() 前 |
![]() 次 |
この章の内容は以下のとおりです。
以下の表では、JSPページで使用できる基本的なタグについて説明します。短縮形のタグには、それぞれ対応するXMLタグがあります。
表13-1 JSPページの基本タグ
JSPタグ | 構文 | 説明 |
---|---|---|
Scriptlet |
<% java_code %> または対応する以下のXMLタグを使用する
|
Javaソース・コード・スクリプトレットを、HTMLページ内に埋め込みます。Javaコードが実行され、その出力が順に残りのHTMLとともにページへ挿入されます。詳細は、「スクリプトレット」を参照してください。 |
Directive |
または対応する以下のXMLタグを使用する
|
ディレクティブには、アプリケーション・サーバーへのメッセージが含まれます。 また、ディレクティブは、 |
Declarations |
<%! declaration %> ...または、等価なXMLタグを使用します... <jsp:declaration> declaration; </jsp:declaration> |
ページ内の他の宣言、スクリプトレット、または式から参照できる変数またはメソッドを宣言します。「宣言」を参照してください。 |
Expression |
<%= expression %> ...または、等価なXMLタグを使用します...
|
ページをリクエストするときに評価され、 |
Actions |
<jsp:useBean ... > Beanをここでインスタンス化する場合は、ここにJSP本文を入れる
|
JSPの高度な機能へのアクセスを提供し、XML構文のみを使用します。これらのアクションは、JSP 2.2仕様の定義のとおりにサポートされています。「アクション」を参照してください。 |
Comments |
<%/* comment */%> |
HTMLファイルの表示可能なソースからコメントを削除する場合は、JSPコメント・タグのみを使用してください。ブラウザでソースの表示を選択した場合、HTMLのコメントは表示されたままになります。 |
JSP 2.2 (http://jcp.org/aboutJava/communityprocess/mrel/jsr245/index.html
)は、JSP 2.1のメンテナンス・リリースです。JSP 2.2仕様では、そのWebセマンティクスにサーブレット3.1仕様を使用しています。
JSP 2.1ではいくつかの新機能が導入され、同じ構文がJSP 2.1とJSP 2.0では異なる意味を持つ場合があるため、予測どおりの動作にするためにJSPバージョンを定義する必要があります。例:
<%@ page deferredSyntaxAllowedAsLiteral="true" %>
はJSP 2.0では使用できません。
# {expr}
はJSP 2.0のテンプレート・テキストでは有効ですが、JSP 2.1ではデフォルトで無効になっています。
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.2仕様に定義されている暗黙的オブジェクトをすべて実装しています。JSP APIについては、Javadocs(http://docs.oracle.com/javaee/7/api/
で入手可能)で説明されています。
注意:
この暗黙的オブジェクトはスクリプトレットや式の中でのみ使用するようにします。宣言で定義されるメソッドからこれらのキーワードを使用すると、未定義の変数を参照することになるため、変換時にコンパイル・エラーが発生します。
表13-2 暗黙的オブジェクト用の予約語
予約語 | 説明 |
---|---|
request |
|
response |
注意: JSPページ内から |
out |
出力ストリームを必要とするメソッドを使用している場合、 ByteArrayOutputStream ostr = new ByteArrayOutputStream(); exception.printStackTrace(new PrintWriter(ostr)); out.print(ostr); |
pageContext |
|
session |
リクエストに対する |
application |
リクエストを転送または取り込む場合は、 |
config |
|
page |
このJSPページから生成されたサーブレット・インスタンスを表します。スクリプトレット・コード内のJavaキーワード
|
関数を実行したり、JSPページを特定の方法で解釈したりするようWebLogic JSPに指示するには、ディレクティブを使用します。ディレクティブは、JSPページのどこに挿入してもかまいません。通常、ディレクティブの位置は無関係で(includeディレクティブを除く)、複数のディレクティブ・タグを使用できます。ディレクティブは、ディレクティブ・タイプとその1つまたは複数の属性で構成されます。
構文は、次に示すように短縮形とXMLの2種類を使用できます。
短縮形: <%@ dir_type dir_attr %>
XML: <jsp:directive.dir_type dir_attr />
dir_type
をディレクティブ・タイプで置き換え、dir_attr
をそのディレクティブ・タイプの1つ以上のディレクティブ属性のリストで置き換えます。
ディレクティブには、page、taglibまたはincludeの3種類があります。
文字エンコーディング・セットを指定するには、そのページの先頭で次のディレクティブを使用します。
<%@ page contentType="text/html; charset=custom-encoding" %>
contentType
ディレクティブで指定した文字セットは、JSPおよびそのJSPに含まれるすべてのJSPで使用される文字セットを指定します。
WebアプリケーションのWebLogic固有のデプロイメント記述子に、デフォルトの文字エンコーディングを指定できます。
宣言を使用して、生成された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>
スクリプトレットの特長は次のとおりです。
JavaコードとプレーンなHTMLが混在する複数ブロックのスクリプトレットを作成できます。
Javaコンストラクトやブロックの内部であっても、任意の場所でHTMLとJavaコードを切り替えられます。「HTMLと埋め込みJavaを使用したJSPの例」では、Javaループを宣言し、HTMLに切り替えてから、再びJavaコードに戻ってループを閉じています。ループ内部のHTMLは、ループが反復する回数分出力として生成されます。
あらかじめ定義されている変数out
を使用して、Javaコードからサーブレット出力ストリームに、HTMLテキストを直接出力できます。print()
メソッドを呼び出して、HTTPページ・レスポンスに文字列を追加します。
ユーザーが以前に入力したデータを出力する場合、HTML特殊文字が入力されていればすべて削除することをお薦めします。これらの文字を削除しない場合、クロス・サイト・スクリプティングによってWebサイトが損なわれるおそれがあります。詳細は、「JSP式言語」を参照してください。
このJavaタグはインライン・タグであり、パラグラフが分けられることはありません。
JSPファイルの中に式を含めるには、次のタグを使用します。
<%= expr %>
exprをJava式で置き換えます。式が評価されるときに、そのstring
表現がHTMLレスポンス・ページ内にインラインで配置されます。これは次の短縮形です
<% out.print( expr ); %>
このテクニックを使用すると、JSPページ内のHTMLを読みやすくできます。次の項のサンプルではexpressionタグの使用方法を示します。
式は、ユーザーが以前に入力したデータを戻すためによく使われます。ユーザーが入力したデータを出力する場合、HTML特殊文字が入力されていればすべて削除することをお薦めします。これらの文字を削除しない場合、クロス・サイト・スクリプティングによってWebサイトが損なわれるおそれがあります。詳細は、「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アクションを使用して、JavaBeanで表されるオブジェクトの変更、使用、または作成を行います。アクションでは、XML構文のみが使用されます。
<jsp:useBean>
アクション・タグを使用すると、JavaBean仕様に準拠したJavaオブジェクトをインスタンス化し、それをJSPページから参照できます。
JavaBean仕様に準拠するには、オブジェクトに次のものが必要です。
引数をとらないパブリック・コンストラクタ
各variable
フィールドに対するsetVariable()
メソッド
各variable
フィールドに対するgetVariable()
メソッド
<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
がスローされます。
<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オブジェクトをインスタンス化したら、Javaオブジェクトのように、JSPファイルでそのid
名により参照できます。スクリプトレット・タグや式評価タグ内でそれを使用できます。<jsp:setProperty>
タグを用いてそのsetXxx()
メソッドを呼び出すこともでき、また<jsp:getProperty>
タグを用いてgetXxx()
メソッドを呼び出すこともできます。
scope
属性を使用して、JavaBeanオブジェクトの可用性とライフスパンを指定します。スコープは以下のいずれかです。
表13-3 JavaBeanオブジェクトのscope属性の定義
スコープ | 説明 |
---|---|
page |
JavaBeanに対するデフォルトのスコープです。オブジェクトは現在のページの |
request |
|
session |
複数のHTTPページにわたってJavaBeanオブジェクトを追跡できるよう、 |
application |
|
JavaBeansの使用方法の詳細は、http://www.oracle.com/technetwork/java/javase/tech/index-jsp-138795.html
を参照してください。
どのような種類の認証を使用している場合でも、<jsp:forward>タグでリクエストが転送されるときには、ユーザーを再認証する必要はありません(デフォルト設定)。この動作を変更して、転送されたリクエストの認証を実行するには、<check-auth-on-forward/>要素をWebLogic固有のデプロイメント記述子(weblogic.xml)の<container-descriptor>要素に追加します。例:
<container-descriptor> <check-auth-on-forward/> </container-descriptor>
JSP式言語は、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構成要素を介して使用することができます。
WebLogic Serverでは、EL 2.1のメンテナンス・リリースであるEL 2.2がサポートされるようになりました。JSP式言語の詳細は、http://jcp.org/aboutJava/communityprocess/mrel/jsr245/index.html
を参照してください。
JSP EL式は、実行時の式を受け入れられる任意の属性で、標準アクションとカスタム・アクションのどちらの場合にも使用できます。以下に、属性値での式の使用方法として例を示します。
属性値は、式の構文<some:tag value="${expr}"/>
または<some:tag value="#{expr}"/>
を1つ含みます。この場合、式が評価され、「Type Conversions」(http://jcp.org/aboutJava/communityprocess/mrel/jsr245/index.html
)で説明されている型変換ルールに従って、結果がその属性の想定される型に変換されます。
属性値は、1つまたは複数の式をテキストを挟むかテキストで囲む形で含みます。たとえば<some:tag value="some${expr}${expr}text${expr}"/>
または<some:tag value="some#{expr}#{expr}text#{expr}"/>
のようにします。この場合、式が左から右へ評価され、(後述の型変換ルールに従って) String型に変換されてから、間に挟まれたテキストと連結されます。次に、結果のString型が「Type Conversion」(http://jcp.org/aboutJava/communityprocess/mrel/jsr245/index.html
)で説明されている型変換のルールに従って、その属性の想定される型に変換されます。
属性値は、テキストのみを含みます。たとえば<some:tag value="sometext"/>
のようにします。この場合、属性のString値は、「Type Conversions」(http://jcp.org/aboutJava/communityprocess/mrel/jsr245/index.html
)で説明されている型変換ルールに従って、その属性の想定される型に変換されます。
注意:
このルールは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 EL式で利用可能な暗黙的オブジェクトが、複数用意されています。これらのオブジェクトは以下の名前を使用して常に利用可能です。
pageContext
- pageContext
オブジェクトを表します。
pageScope
- ページ・スコープの属性名とその値のマップを表します。
requestScope
- リクエスト・スコープの属性名とその値のマップを表します。
sessionScope
- セッション・スコープの属性名とその値のマップを表します。
applicationScope
- アプリケーション・スコープの属性名とその値のマップを表します。
param
- パラメータ名と単一のString型パラメータ値(ServletRequest.getParameter(String name)
の呼出しで取得される)のマップを表します。
paramValues
- パラメータ名とそのパラメータのすべての値を含む単一のString[]
(ServletRequest.getParameterValues(String name)
の呼出しで取得される)のマップを表します。
header
- ヘッダー名と単一のString型ヘッダー値(ServletRequest.getHeader(string name)
の呼出しで取得される)のマップを表します。
headerValues
- ヘッダー名とそのヘッダーのすべての値を含むString[]
(ServletRequest.getHeaders(String name)
の呼出しで取得される)のマップを表します。
cookie
- Cookie名と単一のCookieオブジェクトのマップを表します。Cookieは、HttpServletRequest.getCookies()
のセマンティクスにしたがって取得されます。複数のCookieで同じ名前が共有されている場合、実装では必ずgetCookies()
メソッドから返されたCookieオブジェクトの配列のうち最初のものが使用されます。ただし、暗黙的オブジェクトCookieを使用するユーザーは、Cookieの順序が現在のServlet仕様では指定されていないことを認識しておく必要があります。
initParam
- コンテキストの初期化パラメータ名とそのString型のパラメータ値(ServletRequest.getInitParameter(String name)
の呼出しで取得される)のマップを表します。
表13-4に、上記の暗黙的オブジェクトの使用例をいくつか示します。
表13-4 暗黙的オブジェクトの使用例
式 | 説明 |
---|---|
${pageContext.request.requestURI} |
リクエストのURI ( |
${sessionScope.profile} |
セッション・スコープの属性の名前付きプロファイル(見つからなかった場合 |
${param.productId} |
|
${paramValues.productId} |
|
以降の節では、JSP EL式のリテラルと演算子について説明します。JSP ELの構文はとても簡単です。変数には名前でアクセスできます。汎用の演算子[]を使用すると、マップ、リスト、オブジェクトの配列、およびJavaBeanオブジェクトのプロパティにアクセスできます。この演算子は自由にネスト可能です。.演算子は、JavaのID規約に従った名前を持つプロパティに対し、簡単にアクセスする手段として使用できます。一方、[]演算子では、より汎用的なアクセスが可能です。
標準のJava関係演算子を使用して、関係比較を行えます。他の値、ブール値(等価比較のみ)、String型、整数、または浮動小数点リテラルに対して比較を実行できます。算術演算子を使用すると、整数および浮動小数点の値を計算できます。論理演算子も利用可能です。
ブール値、整数、浮動小数点、文字列、null用のリテラルが用意されています。
ブール値 - trueおよびfalse
整数: JSP 2.1 EL仕様の「Collected Syntax」のIntegerLiteral
コンストラクトで定義されています。
浮動小数点: JSP 2.1 EL仕様の「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.2仕様を参照してください。
以下の単語は予約語であり、識別子として使用することはできません。
and
eq
gt
true
instanceof
or
ne
le
false
empty
not
lt
ge
null
div
mod
注意:
現時点では、これらの単語の多くがこの言語に含まれていません。ただし、将来的に組み入れられる可能性があるので、使用は避けるようにしてください。
JSP ELの基本的な構想に、変数名を評価してオブジェクトに解決することがあります。JSP EL APIでは、名前をオブジェクトに解決する汎用メカニズムとしてVariableResolverが提供されています。このデフォルトの解決メカニズムが、テンプレートや属性内にあるJSP EL式の評価に使用されます。このデフォルト解決メカニズムでは、「JSP式言語の暗黙的オブジェクト」で説明した暗黙的オブジェクトが提供されています。
デフォルトの解決メカニズムでは、他の識別子をマップすることも可能です。これには、pageContext
オブジェクトのPageContext.findAttribute(String)
の動作により、識別子の値を属性としてルックアップします。たとえば${product}
のようにします。
この式ではproductという名前の属性を検索し、ページ、リクエスト、セッション、およびアプリケーション・スコープを検索して、属性の値を返します。属性が見つからない場合、nullが返されます。VariableResolverの詳細および評価APIとの対応関係については、JSP 2.2仕様の「Expression Language API」を参照してください。
式やスクリプトレットを使用すると、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の特殊文字
置き換える必要のある特殊文字 | 置換え後のエンティティ/文字参照 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
WebLogic Serverには、ユーザーが入力したデータ内の特殊文字を置き換えるweblogic.servlet.security.Utils.encodeXSS()
メソッドが用意されています。このメソッドを使用するには、ユーザー入力データを入力として提供します。例:
<%= weblogic.servlet.security.Utils.encodeXSS(
javax.servlet.ServletRequest.getParameter("userInput"))%>
アプリケーション全体を保護するため、ユーザーが入力したデータは、戻す際に毎回encodeXSS()
メソッドを使用する必要があります。上記の例はencodeXSS()
メソッドを明らかに使用すべき場所ですが、表13-6には、他にencodeXSS()
メソッドの使用を検討すべき場所を示します。
表13-6 ユーザー入力データを戻すコード
ページのタイプ | ユーザー入力データ | 例 |
---|---|---|
エラー・ページ |
誤りのある入力文字列、無効なURLやユーザー名 |
「ユーザー名はアクセスを許可されていません。」と表示するエラー・ページ |
ステータス・ページ |
ユーザー名、以前のページでの入力の要約 |
以前のページでの入力を確認するようユーザーに求める要約ページ |
データベース表示 |
データベースから提示されたデータ |
以前にユーザーによって入力されたデータベース・エントリのリストを表示するページ |
WebLogic JSP内のセッションは、JSP 2.2仕様にしたがって動作します。次に、セッションの使用方法に関連した留意事項を示します。
セッションには小さなオブジェクトを格納します。たとえば、セッションはEJBの格納ではなく、EJB主キーの格納に使用する方がよいでしょう。大量のデータは、データベースに格納します。セッションには、データの単純な文字列参照のみを保持するようにします。
サーブレットまたはJSPの動的な再ロードとともにセッションを使用する場合、サーブレット・セッションに格納されるオブジェクトは、シリアライズ可能でなければなりません。シリアライゼーションが必要なのは、サーブレットが新しいクラス・ローダーで再ロードされるためです。再ロードにより、先に(サーブレットの古いバージョンから)ロードされたクラスと、新しいクラス・ローダーにロードされる(サーブレット・クラスの新しいバージョンに対応した)クラスとの間で互換性がなくなります。この互換性の欠如によって、サーブレットからClassCastException
エラーが返されます。
セッション・データがユーザー定義型でなければならない場合、データ・クラスはシリアライズできるようにする必要があります。さらに、セッションはシリアライズされた形のデータ・オブジェクトを格納する必要があります。このとき、シリアライゼーションはデータ・クラスのバージョン間で互換性を保つ必要があります。
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を使おうとします。Java Plug-inがまだブラウザにインストールされていない場合、nspluginurl
属性およびiepluginurl
属性で指定されているURLで、http://www.oracle.com/technetwork/java/index-jsp-141438.html
からJava Plug-inをダウンロードできます。一度プラグインが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コンパイラは非推奨になっています。EARファイル、WARファイル、およびEJBをコンパイルするには、WebLogicのappcコンパイラであるweblogic.appc
の使用をお薦めします。『Oracle WebLogic Server Enterprise JavaBeansバージョン2.1の開発』のappcリファレンスに関する項を参照してください。
WebLogic JSPコンパイラではコンパイルのパフォーマンスを向上させるため、ディスク上にまずjavaファイルを作成してからクラス・ファイルにコンパイルするのではなく、直接JSPをディスク上のクラス・ファイルに変換します。javaファイルはメモリー上にのみ置かれます。
生成されたjavaファイルを参照するには、メモリー内のjavaファイルをディスクにダンプする -keepgeneratedフラグをオンにします。
注意:
JSPのコンパイル中には、コマンド・ライン・フラグ(compilerclass)も記述子要素も呼び出されません。
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
フラグについて説明します。
次のオプションを任意で組み合わせて使用します。
表13-7 JSPコンパイラ・オプション
オプション | 説明 |
---|---|
-classpath |
希望する $ java weblogic.jspc -classpath java/classes.zip;/weblogic/classes.zip myFile.JSP |
-charsetMap |
JSP -charsetMap x-sjis=Shift_JIS,x-big5=Big5 最も一般的なマッピングは、JSPコンパイラに組み込まれています。このオプションは、希望の文字セット・マッピングが認識されない場合にのみ使用します。 |
-commentary |
JSPコンパイラにより、生成されたHTMLページにJSPからのコメントが含められます。このオプションを省略すると、コメントは生成されたHTMLページに表示されません。 |
-compileAll |
カレント・ディレクトリ、または |
-compileFlags |
1つまたは複数のコマンド・ライン・フラグをコンパイラに渡します。複数のフラグはスペースで区切り、引用符で囲みます。例: java weblogic.jspc -compileFlags "-g -v" myFile.jsp |
-compiler |
生成されたJavaソース・コードからクラス・ファイルをコンパイルする際に使用するJavaコンパイラを指定します。デフォルトのコンパイラとして |
-compilerclass |
Javaコンパイラを、ネイティブ実行ファイルとしてではなく、Javaクラスとして実行します。 |
-compressHtmlTemplate |
JSPテンプレート・ブロック内のHTMLを圧縮し、実行時のパフォーマンスを改善します。 JSPのHTMLテンプレート・ブロックに |
-d <dir> |
コンパイルされた出力(クラス・ファイル)の出力先ディレクトリを指定します。このオプションは、コンパイルされたクラスを、すでに |
-depend |
JSPの以前に生成されたクラス・ファイルのタイム・スタンプが、JSPソース・ファイルよりも新しい場合、JSPは再コンパイルされません。 |
-debug |
デバッグ・モードでコンパイルします。 |
-deprecation |
生成されたJavaソース・ファイルをクラス・ファイルにコンパイルしているときに、ソース・ファイル中に非推奨のメソッドが使用されていると警告します。 |
-docroot directory |
|
-encoding default|named character encoding |
有効な引数は、(a) JDKのデフォルト文字エンコーディングの使用を指定する |
-g |
クラス・ファイルにデバッグ情報も入れるよう、Javaコンパイラに指示します。 |
-help |
JSPコンパイラで使用可能なオプションをすべて表示します。 |
-J |
コンパイラに渡されるオプションのリストを取得します。 |
-k |
1つのコマンドで複数のJSPをコンパイルする場合、1つまたは複数のJSPがコンパイルに失敗しても、コンパイルを続行します。 |
-keepgenerated |
コンパイル処理の途中で作成されたJavaソース・コード・ファイルを削除せずに残します。通常、こうしたファイルはコンパイル後に削除されます。 |
-noTryBlocks |
JSPファイルに、多数のまたは深くネストしたカスタムJSPタグが含まれていて、コンパイル時に |
-nowarn |
Javaコンパイラからの警告メッセージが出力されないようにします。 |
-noPrintNulls |
JSPの式の"null"が"" (空の文字列)として示されます。 |
-O |
最適化を有効にして、生成されたJavaソース・ファイルをコンパイルします。このオプションは、 |
-optimizeJavaExpression |
Java式を最適化し、実行時のパフォーマンスを改善します。 |
-package packageName |
生成されたJava HTTPサーブレットのパッケージ名の前に追加するパッケージ名を設定します。デフォルトは |
-superclass classname |
生成されたサーブレットによって拡張されたスーパークラスのクラス名を設定します。スーパークラスの名前は、 |
-verbose |
|
-verboseJavac |
指定したJSPコンパイラによって生成されたメッセージを出力します。 |
-version |
JSPコンパイラのバージョンを出力します。 |
-webapp directory |
展開されたディレクトリ形式のWebアプリケーションが含まれるディレクトリの名前。JSPタグ・ライブラリやその他のJavaクラスなど、Webアプリケーション内のリソースへの参照がJSPに含まれる場合、JSPコンパイラはそのリソースをこのディレクトリで検索します。Webアプリケーションのリソースを要求するJSPをコンパイルする場合、このフラグを省略するとコンパイルに失敗します。 |
weblogic.xml
デプロイメント記述子の<jsp-descriptor>
要素のprecompile
パラメータをtrueに設定すると、Webアプリケーションをデプロイまたは再デプロイしたとき、またはWebLogic Serverを起動したときにJSPをプリコンパイルするようにWebLogic Serverを構成できます。サーバーを再起動するたびに、また追加でサーバーをターゲット指定したときに、JSPを再コンパイルしないようにするには、weblogic.jspcを使用してJSPをプリコンパイルし、プリコンパイルしたJSPをWEB-INF/classes
フォルダにコピーして、.war
ファイルにアーカイブします。ソース・ファイルをアーカイブ.war
ファイルとは別のディレクトリに格納すると、クラス・ファイルのいずれかとJSPとの依存関係によってエラーが発生するおそれがなくなります。
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>
仮想ホスティングを使用する場合は、作成するマッピングに対応する物理的なディレクトリを用意し、サーバーがファイルを検出できるようにする必要があります。