BEA ホーム | 製品 | dev2dev | support | askBEA |
![]() |
![]() |
|
![]() |
e-docs > WebLogic Server > WebLogic JSP プログラマーズ ガイド > WebLogic JSP リファレンス |
WebLogic JSP プログラマーズ ガイド
|
以下の節では、JavaServer Pages (JSP) の作成に関するリファレンス情報を提供します。
以下の表では、JSP ページで使用できる基本的なタグについて説明します。短縮形のタグには、それぞれ対応する XML タグがあります。
Java ソース コード スクリプトレットを、HTML 内に埋め込む。Java コードが実行され、その出力が、残りの HTML と一緒にページに順に挿入される。 詳細については、スクリプトレットを参照。 |
||
ディレクティブには、アプリケーション サーバへのメッセージが含まれる。 また、attr="value" という形式の名前/値のペアも含まれる。このペアは、アプリケーション サーバに対する追加の命令を提供する。 WebLogic JSP のディレクティブを参照。 |
||
ページ内のほかの宣言、スクリプトレット、あるいは式によって参照されることがある変数またはメソッドを宣言する。 宣言を参照。 |
||
ページ要求時に評価され、String に変換され、そして、JSP 応答の出力ストリームにインライン化されて送られる Java 式を定義する。 式を参照。 |
||
Bean をここでインスタンス化する場合は、ここに JSP 本文を入れる </jsp:useBean> |
JSP の高度な機能へのアクセスを提供し、XML 構文だけを使用する。これらのアクションは、JSP 1.1 仕様に定義されているようにサポートされている。 アクションを参照。 |
JSP では、スクリプトレットや式内の暗黙的オブジェクトのための予約語が用意されています。この暗黙的オブジェクトとは、JSP ページに有用なメソッドや情報を提供する Java オブジェクトです。WebLogic JSP は、JSP 1.1 仕様に定義されている暗黙的オブジェクトをすべて実装しています。JSP API については、Sun Microsystems の JSP ホームページにある Javadoc で説明されています。
注意: これらの暗黙的オブジェクトは、スクリプトレットや式の内部でのみ使用できます。宣言で定義されるメソッドからこれらのキーワードを使用すると、未定義の変数を参照することになるため、変換時にコンパイル エラーが発生します。
ByteArrayOutputStream ostr = new ByteArrayOutputStream();
exception.printStackTrace(new PrintWriter(ostr));
out.print(ostr);
基盤となる HTTP サーブレット フレームワークの詳細については、関連する開発者ガイド、『WebLogic HTTP サーブレット プログラマーズ ガイド』を参照してください。
関数を実行したり、JSP ページを特定の方法で解釈したりするよう WebLogic JSP に指示するには、ディレクティブを使用します。ディレクティブは、JSP ページのどこに挿入してもかまいません。通常、ディレクティブの位置は無関係で (include ディレクティブを除く)、複数のディレクティブ タグを使用できます。ディレクティブは、ディレクティブ タイプとその 1 つまたは複数の属性で構成されます。
構文は、次に示すように、短縮形と XML の 2 種類の構文を使用できます。
dir_type はディレクティブのタイプ、dir_attr はそのディレクティブ タイプの 1 つまたは複数のディレクティブ属性のリストで置き換えます。
ディレクティブには、page、taglib、include の 3 種類があります。
文字エンコーディング セットを指定するには、そのページの先頭で次のディレクティブを使用します。
<%@ page contentType="text/html; charset=custom-encoding” %>
custom-encoding は、標準の HTTP スタイルの文字セット名で置き換えますiana.org。
contentType ディレクティブで指定した文字セットは、JSPおよびその JSP に含まれるすべての JSP で使用される文字セットを指定します。
Web アプリケーションの WebLogic 固有のデプロイメント記述子で、デフォルトの文字エンコーディングを指定できます。詳細については、「jsp-descriptor 要素」を参照してください。
taglib ディレクトリを使用して、JSP ページが、タグ ライブラリに定義されているカスタム JSP タグ拡張を使用することを宣言します。カスタム JSP タグの記述方法と使い方の詳細については、『JSP Tag Extensions プログラマーズ ガイド』を参照してください。
宣言を使用して、生成された JSP サーブレット内のクラス スコープ レベルの変数とメソッドを定義します。JSP タグの間に記述された宣言は、JSP ページのほかの宣言やスクリプトレットからアクセスできます。次に例を示します。
<%!
int i=0;
String foo= "Hello";
private void bar() {
// ...ここに Java コード...
}
%>
クラス スコープのオブジェクトは、サーブレットの同一のインスタンス内で実行中の複数のスレッド間で共有されます。共有違反を防ぐには、クラス スコープのオブジェクトを同期させます。スレッドセーフなコードの記述に自信がない場合は、次のディレクティブを使用して、サーブレットを非スレッドセーフとして宣言することができます。
<%@ page isThreadSafe="false" %>
デフォルトでは、この属性は true に設定されています。 false に設定した場合、生成されたサーブレットは javax.servlet.SingleThreadModel インタフェースを実装します。これにより、同一のサーブレット インスタンス内で複数のスレッドが実行されることはありません。 isThreadSafe を false に設定すると、メモリ消費量が増えるので、パフォーマンスが低下することがあります。
JSP スクリプトレットは、JSP サーブレットの HTTP 応答の Java 本文を構成します。次に示すように、短縮形または XML の scriptlet タグを使用して、JSP ページ内にスクリプトレットを包含します。
ユーザによって入力されたデータを出力するたびに、入力された HTML 特殊文字を削除することをお勧めします。 これらの文字を削除しないと、Web サイトがクロスサイト スクリプト攻撃を受ける可能性があります。 詳細については、JSP におけるユーザ入力データのセキュリティを参照してください。
JSP ファイルの中に式を含めるには、次のタグを使用します。
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 仕様に準拠するには、オブジェクトに次のものが必要です。
<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 属性なしで type 属性を使用する場合、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 名によって参照できます。スクリプトレット タグや式評価タグ内で、その JavaBean オブジェクトを使うことができます。<jsp:setProperty> タグを用いてその setXxx() メソッドを呼び出すこともできます。<jsp:getProperty> タグを用いて getXxx() メソッドを呼び出すこともできます。
scope 属性を使用して、JavaBean オブジェクトの可用性とライフスパンを指定します。スコープは以下のいずれかです。
JavaBean の使い方については、JSP 1.1 仕様を参照してください。
どのような種類の認証を使用している場合でも、<jsp:forward> タグでリクエストが転送されるときには、ユーザを再認証する必要がありません (デフォルト設定)。この動作を変更して、転送されたリクエストの認証を実行するには、<check-auth-on-forward/> 要素を WebLogic 固有のデプロイメント記述子 (weblogic.xml) の <container-descriptor> 要素に追加します。次に例を示します。
<container-descriptor>
<check-auth-on-forward/>
</container-descriptor>
WebLogic 固有のデプロイメント記述子の編集方法については、「WebLogic 固有のデプロイメント記述子 (weblogic.xml) の記述」を参照してください。
<jsp:include> タグを使用すると、JSP に別のリソースを含めることができます。このタグは、次の 2 種類の属性を取ります。
<jsp:include> タグが JSP ページの別のタグの中に存在し、含めるリソースをそのタグで処理したい場合は、flush="false" に設定すると便利です。
式とスクリプトレットを使用すると、JSP ではユーザからデータを受け取ったり、ユーザが入力したデータを返したりすることができます。 たとえば リスト3-1 のサンプル JSP では、文字列の入力をユーザに要求し、その文字列を userInput というパラメータに割り当て、<%= request.getParameter("userInput")%> 式を使用してそのデータをブラウザに返します。
コード リスト 3-1 ユーザが入力した内容を返す式の使い方
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<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:
<%= request.getParameter("userInput")%>
</body>
</html>
ユーザによる入力データを返す機能により、クロスサイト スクリプトと呼ばれるセキュリティの脆弱性がもたらされます。これは、ユーザのセキュリティ認可を盗用するために利用される可能性があります。 クロスサイト スクリプトの詳細については、http://www.cert.org/tech_tips/malicious_code_mitigation.html の「Understanding Malicious Content Mitigation for Web Developers」(CERT のセキュリティ勧告) を参照してください。
セキュリティの脆弱性をなくすには、ユーザが入力したデータを返す前に、そのデータをスキャンして表 3-2 に示した HTML 特殊文字を探します。 該当する文字が見つかれば、それらを HTML のエンティティまたは文字参照と置き換えます。 文字を置換することによって、ブラウザがユーザの入力によるデータを HTML として実行することが回避されます。
WebLogic Server ユーティリティ メソッドの使用
WebLogic Server では、ユーザ供給データの特殊文字を置換する weblogic.servlet.security.Utils.encodeXSS() メソッドが提供されます。 このメソッドを使用するには、ユーザ供給データを入力として提供します。 次に例を示します。
<%= weblogic.servlet.security.Utils.encodeXSS(
request.getParameter("userInput"))%>
アプリケーション全体を保護するには、ユーザ供給データを返すたびに encodeXSS() メソッドを使用する必要があります。 直前の例は encodeXSS() メソッドの使用が明らかに必要な場所であり、表 3-3 はメソッドを使用するかどうか検討すべき場所を示しています。
WebLogic JSP 内のセッションは、JSP 1.1 仕様に従って動作します。次に、セッションの使い方に関連する留意事項を挙げます。
JSP を使用すると、適切なクライアント ブラウザ タグを含む HTML を生成することによって、Web ページに Java Plug-in を簡単に組み込むことができます。Java Plug-in では、クライアントの Web ブラウザにより実装された JVM の代わりに、Sun Microsystems から提供されている Java Runtime Environment (JRE) を使用することができます。この機能により、アプレットと特定の種類の Web ブラウザとの間の非互換性の問題が回避できます。 Java Plug-in は、Sun のサイト (http://java.sun.com/products/plugin/) から入手できます。
Internet Explorer と Netscape では使用している構文が異なるため、<jsp:plugin> アクションから生成されるサーブレット コードは、動的にブラウザ クライアントの種類を調べて、適切な <OBJECT> タグか、<EMBED> タグをその HTML ページに送ります。
<jsp:plugin> タグは、<APPLET> タグの属性と似た多くの属性、および使用する Java Plug-in のバージョンを設定するその他の属性を使用します。アプレットがサーバと通信する場合、アプレット コードを実行する JVM は WebLogic Server を実行する JVM と互換性がなければなりません。
次のサンプルでは、plugin アクションを使用してアプレットをデプロイします。
<jsp:plugin type="applet" code="examples.applets.PhoneBook1"
codebase="/classes/" height="800" width="500"
jreversion="1.1"
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 属性が URL を指定し、そこで、Sun の Web サイトからその Java Pug-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 が、プラグイン構文の代わりに送られます。
SecurityConfigMBean の WebAppFilesCaseInsensitive 属性では、win32 以外のすべてのプラットフォームにおいて、Java Server Pages (JSP) のファイル ルックアップで大文字/小文字を区別するかどうかを指定します。標準の win32 ファイル システムにおけるファイル ルックアップでは、常に大文字/小文字は区別されません。
win 32 以外の大文字/小文字を区別しないファイル システム (UNIX の NT Samba マウントや、大文字/小文字を区別しないモードでインストールされた Mac OS など) で、大文字/小文字を区別しないルックアップを指定すると (この属性を <code>false</code> に設定する)、JSP はそのソース コードを返さなくなります。
たとえば、JSP が Samba マウントから提供されていて、大文字/小文字を区別しないルックアップを指定した場合、WebLogic Server はリクエスト内のすべてのファイル名拡張子を小文字に変換してから JSP をルックアップします。
JSP サーブレットは自動的に WebLogic JSP コンパイラを呼び出して JSP ページを処理するので、通常は直接コンパイラを呼び出す必要はありません。しかし、デバッグする場合など、状況によっては、コンパイラを直接呼び出した方が便利です。この節はコンパイラのリファレンスです。
WebLogic JSP コンパイラでは、JSP ファイルを解析して .java ファイルに変換し、生成された .java ファイルを標準の Java コンパイラを使用して Java クラスにコンパイルします。
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 アプリケーション の場所を指定する必要があります。-webapp フラグは JSP コンパイラ オプションの次のリストで説明します。
以下のオプションを任意に組み合わせて使用することができます。
$ java weblogic.jspc
-classpath java/classes.zip;/weblogic/classes.zip
myFile.JSP
weblogic.xml デプロイメント記述子の <jsp-descriptor> 要素の precompile パラメータを true に設定することで、Web アプリケーションをデプロイまたは再デプロイしたとき、あるいは WebLogic Server を起動したときに、JSP をプリコンパイルするよう、WebLogic Server をコンフィグレーションできます。 サーバの再起動時や対象のサーバの追加時に JSP を再コンパイルしないようにするには、weblogic.jspc を使用して JSP をプリコンパイルしてから、WEB-INF/classes フォルダに配置し、.war ファイルにアーカイブします。
web.xml デプロイメント記述子の詳細については、『Web アプリケーションのアセンブルとコンフィグレーション』を参照してください。
Windows NT のコマンド長制限は、WebLogic JSP の新しい compilerclass オプションを使用して克服できます。 このオプションは、weblogic.xml ファイルでコンフィグレーションできます。
インメモリの compilerclass オプションは、Sun で使用されるコンパイラ クラスを使用して内部的に Java ファイルをコンパイルします。 この方法は新しいプロセスを作成する必要がないので、新しいプロセスを別に使用して各 Java ファイルをコンパイルするよりも効率的です。
compilerclass は、weblogic.xml に以下の行を追加することで使用できます。
<jsp-descriptor>
<jsp-param>
<param-name>compilerclass</jsp-param>
<param-value>com.sun.tools.javac.Main</param-value>
</jsp-param>
</jsp-descriptor>
![]() |
![]() |
![]() |
![]() |
||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |