|
||||||||||
| 前のパッケージ 次のパッケージ | フレームあり フレームなし | |||||||||
参照:
説明
| クラスの概要 | |
| 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. |
"struts-bean" タグライブラリは、bean ( または bean プロパティ ) をレスポンス出力にレンダリングするだけでなく、
利用可能なさまざまなソースから新しい bean を ( 任意のスコープで ) 定義できる有用なJSPのカスタムタグです。
JavaServer Pases(JSP) テクノロジの能力の多くは、JSPソースから自動的に生成されるサーブレットと、
アプリケーションの状態を表す JavaBeans とを相互に作用させることができるシンプルかつパワフルなメカニズムにあります。
標準的なJSPページでは、bean を生成する必要があるときには <jsp:useBean> タグが使われます。
同じようにそれらの bean を参照するのに、スクリプトレット中で使われる「スクリプティング変数」も使われています。
以下のセクションで議論されるように、"struts-bean" タグライブラリは
<jsp:useBean> によって提供される基本的な機能に対して、かなりの強化した内容を提供します :
<jsp:getProperty> や <jsp:setProperty> で使用されるのと同じもの ) 、
入れ子の名前
( address.city というプロパティ名に対して、Java の表現で getAddress().getCity() によって引き出されるもの ) 、
そして配列名
( address[3] というプロパティ名に対して、bean の配列 "address" の4番目のアドレスが引き出されるもの )
があります。このタグライブラリで利用可能なタグや、各タグの妥当な要素についての詳細情報は bean タグリファレンスを参照してください。
scope 属性で定義されたスコープに、この bean を格納する際のキーとしても用いられます。 scope 属性が存在すればそこで定義されているスコープから、
そうでなければいくつかのスコープから標準の順序 ( page, request, session, application ) で、
既存の bean を検索するときに用いるキーです。 name 属性と ( オプションで ) scope 属性によって特定される
JSP bean の JavaBeans プロパティ名を定義します。この値はこのカスタムタグによって利用されます。
もしこの属性が指定されていない場合、 name で特定される bean 自体が、
このタグによって処理される対象の値として用いられます。
どのようにして property が参照されるかは下記を参照してください。 name 属性で指定された値をキーにしてこのスコープ内で bean を検索したり、
また、 id 属性で指定された値をキーにして、生成した bean をこのスコープに格納したりします。
もしこの属性が指定されていない場合、bean は通常、上に示した順序で検索されるか、 page スコープで生成されます。 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 は、いろいろなテクニックによって4つの標準のJSPスコープ ( page, request, session および application ) のうちの1つに生成および導入が可能です。これ以下のサブセクションでは、 次のアプローチの使用方法を記述しています :
<jsp:useBean> タグ <bean:define> タグ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);
ページスコープ - 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 仕様を参照してください。
<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は、既存の 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¶m2=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"/>
ここまでで議論された 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"/>
|
||||||||||
| 前のパッケージ 次のパッケージ | フレームあり フレームなし | |||||||||