パッケージ org.apache.struts.taglib.bean

"struts-bean" タグライブラリは、bean ( または bean プロパティ ) をレスポンス出力にレンダリングするだけでなく、 利用可能なさまざまなソースから新しい bean を ( 任意のスコープで ) 定義できる有用なJSPのカスタムタグです。

参照:
          説明

クラスの概要
CookieTag Define a scripting variable based on the value(s) of the specified cookie received with this request.
CookieTei Implementation of TagExtraInfo for the cookie tag, identifying the scripting object(s) to be made visible.
DefineTag Define a scripting variable based on the value(s) of the specified bean property.
DefineTei Implementation of TagExtraInfo for the define tag, identifying the scripting object(s) to be made visible.
HeaderTag Define a scripting variable based on the value(s) of the specified header received with this request.
HeaderTei Implementation of TagExtraInfo for the header tag, identifying the scripting object(s) to be made visible.
IncludeTag Define the contents of a specified intra-application request as a page scope attribute of type java.lang.String.
IncludeTei Implementation of TagExtraInfo for the include tag, identifying the scripting object(s) to be made visible.
MessageTag Custom tag that retrieves an internationalized messages string (with optional parametric replacement) from the ActionResources object stored as a context attribute by our associated ActionServlet implementation.
PageTag Define a scripting variable that exposes the requested page context item as a scripting variable and a page scope bean.
PageTei Implementation of TagExtraInfo for the page tag, identifying the scripting object(s) to be made visible.
ParameterTag Define a scripting variable based on the value(s) of the specified parameter received with this request.
ParameterTei Implementation of TagExtraInfo for the parameter tag, identifying the scripting object(s) to be made visible.
ResourceTag Define a scripting variable based on the contents of the specified web application resource.
ResourceTei Implementation of TagExtraInfo for the resource tag, identifying the scripting object(s) to be made visible.
SizeTag Define a scripting variable that will contain the number of elements found in a specified array, Collection, or Map.
SizeTei Implementation of TagExtraInfo for the size tag, identifying the scripting object(s) to be made visible.
StrutsTag Define a scripting variable that exposes the requested Struts internal configuraton object.
StrutsTei Implementation of TagExtraInfo for the struts tag, identifying the scripting object(s) to be made visible.
WriteTag Tag that retrieves the specified property of the specified bean, converts it to a String representation (if necessary), and writes it to the current output stream, optionally filtering characters that are sensitive in HTML.
 

パッケージ org.apache.struts.taglib.bean の説明

"struts-bean" タグライブラリは、bean ( または bean プロパティ ) をレスポンス出力にレンダリングするだけでなく、 利用可能なさまざまなソースから新しい bean を ( 任意のスコープで ) 定義できる有用なJSPのカスタムタグです。

[イントロダクション] [bean のプロパティ] [bean の生成] [bean の出力]

イントロダクション

JavaServer Pases(JSP) テクノロジの能力の多くは、JSPソースから自動的に生成されるサーブレットと、 アプリケーションの状態を表す JavaBeans とを相互に作用させることができるシンプルかつパワフルなメカニズムにあります。 標準的なJSPページでは、bean を生成する必要があるときには <jsp:useBean> タグが使われます。 同じようにそれらの bean を参照するのに、スクリプトレット中で使われる「スクリプティング変数」も使われています。

以下のセクションで議論されるように、"struts-bean" タグライブラリは <jsp:useBean> によって提供される基本的な機能に対して、かなりの強化した内容を提供します :

このタグライブラリで利用可能なタグや、各タグの妥当な要素についての詳細情報は bean タグリファレンスを参照してください。

bean プロパティ

共通のタグ属性
"struts-bean" タグライブラリ ( 加えて Struts フレームワークのほぼすべてのタグライブラリ ) に含まれるタグには、共通の属性がいくつか存在します。 そしてそれらは、それがどのタグの属性であるかを問わず、常に同じ意味をもっています。これら共通属性には以下のものがあります :

プロパティの参照

property タグを一般にサポートしている Struts のタグは、 さらにプロパティを取得、設定するために豊富なシンタックスを認識します。 simple, nested そして indexed の三種類の参照方法がサポートされています。

単純な参照 - 通常使われる <jsp:getProperty> および <jsp:setProperty> タグと等価な構文です。"foo" という名前のプロパティへの参照は、 標準 JavaBeans 仕様で定義された bean プロパティのための名前の変換方法を用い、 getFoo() または setFoo(value) メソッド ( いずれか適切な方 ) の呼び出しに変換されます。 Struts は Java イントロスペクションAPIを使用してプロパティの実際のゲッター、セッターを特定しているので、 bean は BeanInfo クラスを利用することでメソッド名をカスタマイズして提供することができます。 より詳しい情報は JavaBeans 仕様 http://java.sun.com/products/javabeans/ を参照してください。

ネスト参照 - ネスト参照はピリオド ( "." ) によって区切られたプロパティ名の階層を通じて プロパティにアクセスするために用いられます。 この参照方法は JavaScript 内でネストしたプロパティにアクセスする方法と類似しています。 例えば ( 下記で論じられている <bean:define> タグのような ) ゲッターにおける

    property="foo.bar.baz"

というプロパティ参照は、それと等価である次のような Java 表現に翻訳されます。

    getFoo().getBar().getBaz()

ネスト参照が ( input フォームが実行される時のように ) セッターにおいて使用された場合、 連鎖の最後のプロパティのセッターが呼ばれます。 上記のプロパティ参照と等価な Java 表現は以下のようになります。

    getFoo().getBar().setBaz(value)

インデックス参照 - プロパティが実際には配列であるときや、プロパティを持つ JavaBean がインデックスを使用したゲッター、セッターを提供しているとき、 そのプロパティの個々の要素にアクセスするために、添え字を利用することができます。 例えば ( 下記で論じられている <bean:define> タグのような ) ゲッターにおける

    property="foo[2]"

というプロパティ参照は、それと等価である次のような Java 表現に翻訳されます。

    getFoo(2);

一方、同じプロパティ参照でもセッターにおいては次のような呼び出しと等価になります。

    setFoo(2, value)

上記の変換例からわかるように、インデックス参照で用いられる添え字は、Java 言語がそうであるように、 zero relative ( 配列の最初の要素は foo[0] となる ) です。

複合参照 - ネスト参照およびインデックス参照は任意の方法で結合させることができます。 そのため、 foo.bar[0].baz[2] のような表現は正当です。 もちろん、これらの参照によってアクセスされている実際の bean が、 間違いなく適当な名前とタイプのプロパティを持つように注意しなければなりません。 さもなければ、JSP実行時例外がスローされます。

Strutsが、JavaリフレクションAPIを通して、一般的にプロパティにアクセスするのに用いられるメカニズムについてのより多くの詳細は、 JavaDocs の PropertyUtils を参照してください。


bean の生成

イントロダクション

新しい bean は、いろいろなテクニックによって4つの標準のJSPスコープ ( page, request, session および application ) のうちの1つに生成および導入が可能です。これ以下のサブセクションでは、 次のアプローチの使用方法を記述しています :

Action Class 中の Java コード

JSPページはサーブレットにコンパイルされるので、Struts コントローラサーブレットによって呼び出される Action クラスは、4つの標準のJSPスコープ ( page, request, session および application ) のうちの3つに、便利にアクセスします。 Action クラスに含まれるビジネスロジックがリクエスト またはセッションスコープに保存される結果を生成することは非常に一般的な慣習です。 そして、次のユーザインタフェースのページとしてレンダリングされるJSPページにフォワードして利用されます。

リクエストスコープ - bean を "cust" という名前でリクエストスコープに格納するには、 Action クラスで次のようなコードを実行します :

    Customer customer = ... create or acquire a customer reference ...;
    request.setAttribute("cust", customer);

セッションスコープ - bean を "user" という名前 ( おそらくログオン処理において ) でセッションスコープに格納するには、 Action クラスで次のようなコードを実行します :

    User user = ... look up valid user in the database ...;
    HttpSession session = request.getSession();
    session.setAttribute("user", user);

アプリケーションスコープ - 通常、アプリケーションスコープの bean は、 アプリケーションの起動サーブレットの init() メソッドにおいて初期化されます。 しかし、次のように Action クラスがそのような bean を生成することも、それが適切なのであれば、正当です :

    Foo foo = ... create a Foo ...;
    servlet.getServletContext().setAttribute("foo", foo);
スクリプトレット中の Java コード
Struts をベースにしたアプリケーションにおいて、スクリプトレット中に Java コードを記述することはあまり推奨されない習慣ですが ( 開発者が JSP 中にビジネスロジックとプレゼンテーションロジックをごちゃまぜに記述したい誘惑にかられてしまうので ) 、 スクリプトレット中のコードで新たな JavaBeans を動的に生成し、それらを4つのスコープのうちのいずれかに格納することも、正当な処理です。 下のコード例においてそれを示します :

ページスコープ - bean を "foo" という名前でページスコープに格納するには、 スクリプトレットで次のようなコードを実行しなければなりません :

<%
    Foo foo = ... create a foo ...;
    pageContext.setAttribute("foo", foo, PageContext.PAGE_SCOPE);
%>

リクエストスコープ - bean を "cust" という名前でリクエストスコープに格納するには、 スクリプトレットで次のようなコードを実行しなければなりません :

<%
    Customer customer = ... create or acquire a customer reference ...;
    pageContext.setAttribute("cust", customer, PageContext.REQUEST_SCOPE);
%>

セッションスコープ - bean を ( おそらく検証されたログイン結果として ) "user" という名前でセッションスコープに格納するには、 スクリプトレットで次のようなコードを実行しなければなりません :

<%
    User user = ... look up valid user in the database ...;
    pageContext.setAttribute("user", user, PageContext.SESSION_SCOPE);
%>

アプリケーションスコープ - 通常、アプリケーションスコープの bean は、 アプリケーションの起動サーブレットの init() メソッドにおいて初期化されます。 しかし、もしそれが適切なら、次のようにスクリプトレットでそのような bean を生成することもできます :

<%
    Foo foo = ... create a Foo ...;
    pageContext.setAttribute("foo", foo, PageContext.APPLICATION_SCOPE);
%>

注意 - 既存のデータの表示だけに関係するコードを実行する場合をのぞき、 上で述べられたような、Struts をベースにしたアプリケーションでJSP中にスクリプトレットを利用する例には強く反対します。 一般に、アプリケーションの処理ロジックは、JSPページ内に記述するのではなく、 Action クラス ( または Action クラスによって呼び出される bean や EJB ) 中にカプセル化されるべきです。

標準の <jsp:useBean> タグ

JavaServer Pages(JSP)が標準のタグとして提供する <jsp:useBean> は、 新しい bean を生成するか、既存の bean の参照をJSPページに導入するのに用いられます。 このメカニズムによって導入された bean ( または bean への参照 ) は、 このセクションに記述された Struts の生成テクニックによって生成されたどの bean とでも、 完全に相互運用が可能です。

他のJSPタグ ( <jsp:getProperty> <jsp:setProperty> など ) で bean を参照したいのであれば、その既存の bean への参照は <jsp:useBean> を用いて導入しなければなりません。 それらの bean を他の Struts のタグを用いて参照したいだけであれば、 <jsp:useBean> を使用する必要はありません。

<jsp:useBean> タグに関するより多くの情報は http://java.sun.com/products/jsp/download.html にある JavaServer Pages 仕様を参照してください。

Struts <bean:define> タグ

Strutsは、別の bean ( または別の bean のプロパティ値 ) をコピーすることで任意のスコープに新しい bean を生成することができる、 強力で汎用的なタグ ( <bean:define> ) を提供します。 このタグは "property" 属性をサポートしているので、 上記で議論された全てのプロパティ参照の機能が利用可能です。 このタグの利用には下に示すように様々な方法を用いることができます。 なお、"toScope" 属性を指定しない限り、定義された bean は全てページスコープにおいて生成されます。

String 定数の導入 - String 定数 ( または実行時の式の計算結果 ) を持つ新しい bean を生成することが可能です :

    <bean:define id="foo" value="This is a new String"/>
    <bean:define id="bar" value='<%= "Hello, " + user.getName() %>'/>
    <bean:define id="last" scope="session"
                 value='<%= request.getRequestURI() %>'/>

既存の bean のコピー - 既存の bean オブジェクトの新しい参照を生成することが可能です。 新しい参照の型には、その bean と一致する型の Java クラスまたはインターフェースを "type" 属性で指定することも、 また、デフォルトの java.lang.Object 型を用いることもできます。 ( これはスクリプトレット内に記述される変数にだけ影響します。一般に Struts ベースのアプリケーションでは意味がありません。)

    <bean:define id="foo" name="bar"/>
    <bean:define id="baz" name="bop" type="com.mycompany.MyBopClass"/>

既存の bean プロパティのコピー - プロパティ値のゲッターによって返される値で初期化された新しい bean を生成することが可能です。 "property" 属性の値は、前述の規則に従った、単純な、またはネストした、またはインデックス付けされたプロパティ参照です。 下記の最初の例で、リクエストスコープ bean のプロパティへのアクセスと、 ( デフォルトのページスコープを用いない ) セッションスコープでの新しい bean の生成について示します。

    <bean:define id="foo" name="bar" property="baz" scope="request"
     toScope="session"/>
    <bean:define id="bop" name="user" property="role[3].name"/>
その他の Struts コピータグ

Strutsは、既存の bean ( または bean プロパティ ) をこのページが動いている環境や処理中のリクエストからコピーする、 いろいろな bean 生成タグを提供します。 各々のタグのための属性の全てが下の例で示されているというわけではありません - 詳細はbean タグリファレンスを参照してください。 これらのタグによって生成される bean はそのページの残りの部分で使用するためにページスコープの中だけに存在します。

クッキーのコピー - 現行のリクエストに含まれた javax.servlet.http.Cookie を含む新しい bean を生成することが可能です。指定された名前のクッキーがリクエスト中に存在しない場合、 リクエスト時の例外がスローされるため、一般的にはこのタグを <logic:present cookie="xxx"> タグの内側にネストすることでそのクッキーが確実に存在することを保証します。 リクエスト中に同じ名前の複数のクッキーが存在する可能性があるときは "multiple" 属性を指定します ( これにより、結果として生じる bean は単一のクッキーでなくクッキーの配列になります ) 。

    <bean:cookie id="foo" name="cookiename"/>
    <bean:cookie id="all" name="JSESSIONID" multiple="true"/>

リクエストヘッダのコピー - 現行のリクエストに含まれている HTTP ヘッダの値を含む新しい bean を生成することが可能です。 指定された名前のヘッダがリクエスト中に存在しない場合、リクエスト時の例外がスローされるため、一般的にはこのタグを <logic:present header="xxx"> タグの内側にネストすることでそのヘッダが確実に存在することを保証します。 リクエスト中に同じ名前の複数のヘッダが存在する可能性があるときは "multiple" 属性を指定します ( これにより、結果として生じる bean は単一の String でなく String の配列になります ) 。

    <bean:header id="agent" name="User-Agent"/>
    <bean:header id="languages" name="Accept-Language" multiple="true"/>

動的に生成されたレスポンスのコピー - 実行中のアプリケーションに向けて内部的にリクエストを生成し、 そのリクエストに対して返されたレスポンスを ( String 型の ) bean に変換することが可能です。 このテクニックの使い道の一つとして、XML 形式のデータを動的に生成して bean に保存しておき、 あとで ( XSLT スタイルシートを適用するといった ) 処理をする、などが考えられます。 現行のリクエストがセッションの一部である場合、インクルードのために生成されたリクエストにもそのセッションの ID が付加されます ( したがって、同じセッションの一部であると認識されます ) 。

    <bean:include id="text" name="/generateXml?param1=a&param2=b"/>

JSP 定義済み変数のコピー - JSP 定義済み変数のひとつを bean として生成することが可能です ( 詳しくは JSP 仕様を参照 ) 。 スクリプトレットを利用せずに、カスタムタグ内で定義済み変数に対してプロパティのゲッターアクションを行う場合便利です。

    <bean:page id="app" property="application"/>
    <bean:page id="sess" property="session"/>

リクエストパラメータのコピー - 現行のリクエストに含まれているパラメータ値を含む新しい bean を生成することが可能です。 指定された名前のパラメータがリクエスト中に存在しない場合、リクエスト時の例外がスローされるため、一般的にはこのタグを <logic:present parameter="xxx"> タグの内側にネストすることでそのパラメータが確実に存在することを保証します。 リクエスト中に同じ名前の複数のパラメータが存在する可能性があるときは "multiple" 属性を指定します ( これにより、結果として生じる bean は単一の String でなく String の配列になります ) 。

    <bean:parameter id="name" name="name"/>
    <bean:header id="options" name="option" multiple="true"/>

Web アプリケーションリソースのコピー - Web アプリケーションリソースを String またはそのリソースを読み取るための java.io.InputStream として含む新しい bean を生成することが可能です。 リソースは ServletContext.getResource() または ServletContext.getResourceAsStream() を使用して、"/" で始まるコンテキスト相対パスでアクセスされるものです。

    <bean:resource id="deployment" name="/WEB-INF/web.xml"/>
    <bean:resource id="stream" name="/WEB-INF/web.xml"
                   input="true"/>

Struts 設定オブジェクトのコピー - 標準の Struts フレームワーク設定オブジェクトを含む新しい bean を生成することが可能です。これにより、必要に応じて設定オブジェクトのプロパティにアクセスすることができます。

    <bean:struts id="form" formBean="CustomerForm"/>
    <bean:struts id="fwd" forward="success"/>
    <bean:struts id="map" mapping="/saveCustomer"/>

Bean 出力

ここまでで議論された Struts の bean タグはどれも、JSPページから生成されているレスポンスページに対する出力を行いません。 それらは適切な Java オブジェクトを bean として視覚化してその操作をサポートするために実行されます。 出力は次のタグによってレスポンスに書き込まれ、最終の、リクエストを投げた相手にも見えるようになります。

国際化されたメッセージのレンダリング - メッセージキーを指定することで、それに対応するメッセージテキストを MessageResources オブジェクトから取得できます ( オプションでパラメータ置換オブジェクトも指定可能 ) 。 取得したメッセージテキストは現在作成中のレスポンスにコピーされます。 デフォルトではメッセージは、ユーザセッションに格納された最も新しいロケールを使って Struts コントローラサーブレット によって ( アプリケーションスコープの bean として ) 初期化されたリソースバンドルから検索されます。 これらのデフォルトの振舞いは Bean Tags Reference に記述されているように "bundle" と "locale" 属性に値をセットすることでオーバーライドすることができます。

    <bean:message key="label.Cancel"/>
    <bean:message key="message.hello" arg0='<%= user.getFullName() %>'/>

bean または bean プロパティのレンダリング - bean または bean プロパティの内容は String に変換されたのち、 現在生成中のレスポンスへコピーされます。このタグは、で記述された、 単純な、ネストされている、もしくはインデックスを付けられたプロパティ参照のための構文を理解することができます。 あらゆるスコープの bean を要求することができ、デフォルトでは要求された bean の場所を特定するために ( page, request, session, application ) と、範囲の狭いものから順にスコープ内を検索します。

    <bean:write name="username"/>
    <bean:write name="user" property="fullName"/>
    <bean:write name="customer" property="orders[2].partNumber"
                scope="session"/>

[訳注: これは岩崎浩文、おかだひでひさ が翻訳しました。日本語訳に対するコメントがあれば、report@jajakarta.orgに送って下さい。]



このドキュメントは、Ja-Jakartaにより訳されました。コメントがある場合は、report@jajakarta.orgまでお願いします。
Copyright (C) 2000-2002 - Apache Software Foundation