Oracle® Fusion Middleware Oracle Application Development FrameworkによるFusion Webアプリケーションの開発 12c (12.2.1.2.0) E82918-03 |
|
前 |
次 |
この章の内容は次のとおりです。
コマンド・コンポーネントは、アクティブ化されたときにアクションを実行するUICommand
コンポーネントで表されます。ADF Facesコマンド・コンポーネントは、コンポーネントがアクティブ化されると、ActionEvent
イベントを配信します。
基本的なページを作成してナビゲーション機能を追加すると、ページ間でパラメータを渡したり、宣言アクションをオーバーライドする機能を提供するなどの、より複雑な機能を追加できます。Oracle ADFには、このような複雑な機能を実際のコードをほとんど使用せずに追加できる機能が数多く用意されています。
この章で説明する実装メソッドのいくつかは、ページレベルの設計のためのものです。タスク・フローを使用することにより、同じ機能の多くを実行できます。「ADFタスク・フローのスタート・ガイド」を参照してください。
コマンド・コンポーネントを使用すると、パラメータの引渡し、宣言アクションのオーバーライド、なんらかのロジックの実行といったアクションを実行できます。「データ・コントロール」パネルでコマンド・コンポーネントをカスタム・メソッドにバインドできます。たとえば、deleteOrderItem()
というカスタム・メソッドがある場合、ボタンを作成してこのメソッドにバインドすると、ユーザーがこのボタンを押したときに注文項目を削除できます。
コマンド・コンポーネント内でsetPropertyListener
タグを使用して、イベント発生時に値を割り当てることもできます。たとえば、検索を開始して、マネージドBeanに保存されたパラメータ値に基づき、別のページ上に検索結果を表示するボタンを作成できます。setPropertyListener
プロパティを使用して、値をチェックするメソッドにこのパラメータ値を渡すことができます。
コマンド・コンポーネントにバインドされた宣言メソッドにコードを追加できます。たとえば、宣言的なCommit
ボタンを作成した後、マネージドBeanにコードを追加してから、追加処理用にCommit
操作をオーバーライドできます。
コマンド・コンポーネントの処理を開始する前に、その他のOracle ADF機能を理解しておくと役に立ちます。次に、関連する他の機能へのリンクを示します。
コマンド・コンポーネントとしてページに追加可能なカスタム・メソッドの作成の詳細は、「サービス・メソッドによるアプリケーション・モジュールのカスタマイズ」および「UIクライアントへのカスタム・サービス・メソッドの公開」を参照してください。
操作によるコマンド・コンポーネントの作成の詳細は、「操作を使用したコマンド・コンポーネント作成時の処理」を参照してください。
メソッド内でEL式を使用する場合は、「操作へバインドするために作成されるEL式」を参照してください。
コマンド・ボタンのactionListener
属性の詳細は、「実行時に行われる処理: アクション・イベントおよびアクション・リスナーの動作方法」を参照してください。
ADFバインディングの詳細は、「Fusion WebアプリケーションでのADFモデルの使用」を参照してください。
タスク・フローを使用している場合、タスク・フローのパラメータ渡しメカニズムを使用できます。詳細は、「タスク・フローのパラメータの使用」を参照してください。
タスク・フローのコール・メソッドの使用を検討している場合は、「メソッド・コール・アクティビティの使用」を参照してください。
マネージドBeanを使用する場合は、「Fusion WebアプリケーションでのマネージドBeanの使用」を参照してください。
「データ・コントロール」パネルには、アプリケーションの制御フロー内のどこからでもアプリケーション・ロジックを起動するカスタム・メソッドが含まれています。メソッドを実行するコマンド・ボタンと同様に、メソッドをドラッグしてドロップできます。
アプリケーションにカスタム・メソッドが含まれている場合、これらのメソッドは「データ・コントロール」パネルに表示されます。これらのメソッドは、コマンド・ボタンとしてドラッグ・アンド・ドロップできます。ユーザーがボタンをクリックすると、メソッドが実行されます。
カスタム・メソッドの作成の詳細は、「サービス・メソッドによるアプリケーション・モジュールのカスタマイズ」および「UIクライアントへのカスタム・サービス・メソッドの公開」を参照してください。
注意:
タスク・フローを使用している場合、タスク・フロー定義からメソッドを直接コールできます。詳細は、「メソッド・コール・アクティビティの使用」を参照してください。
たとえば、Oracle ADFのSummitサンプル・アプリケーションのItemsForOrder
ビュー・オブジェクトには、deleteOrderItem()
メソッドが含まれています。このメソッドは、ショッピング・カート内の項目を更新します。ユーザーがこのメソッドを実行できるようにするには、図33-1のように、「データ・コントロール」パネルからdeleteOrderItem()
メソッドをドラッグします。
図33-1 「データ・コントロール」パネルに表示されたメソッド
要求されるビジネス・ロジックを実行するために、多くのメソッドでは、そのパラメータ(1つ以上)に対する値を必要とします。つまり、メソッドにバインドされたボタンを作成する際に、EL式を作成して、パラメータの値の取得元を指定する必要があります。たとえば、populateInventoryForProduct(String productId)
メソッドを使用する場合は、メソッド・アクション・バインディングを構成して製品IDを取得し、メソッドがそのIDを使用して製品のインベントリを表示できるようにする必要があります。
「データ・コントロール」パネルからフォームにカスタム・メソッドをドラッグすることにより、カスタム・メソッドにバインドされたコマンド・コンポーネントを作成します。
始める前に:
カスタム・メソッドについて理解しておくと役立ちます。詳細は、「メソッドを実行するためのコマンド・コンポーネントの作成」を参照してください。
また、他のコマンド・コンポーネントを使用して追加できる機能について理解しておくと役立ちます。詳細は、「コマンド・コンポーネントの追加機能」を参照してください。
次のタスクを完了する必要があります。
「アプリケーション・モジュールの作成と変更」の説明に従って、データ・モデルで必要なビュー・オブジェクトおよびカスタム・メソッドのインスタンスを含むアプリケーション・モジュールを作成します。または、別のタイプのビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項の説明に従って、そのビジネス・サービスのデータ・コントロールを作成します。
「Webページの作成」の説明に従って、JSFページを作成します。
カスタム・メソッドにバインドされたコマンド・コンポーネントを作成するには:
メソッドをコマンド・ボタンとしてドロップすると、JDeveloperによって次の処理が行われます。
メソッドのメソッド・アクション・バインディングが定義されます。
メソッドがパラメータを取得する場合は、パラメータ値を保持するNamedData
要素が作成されます。
ADF Facesコマンド・コンポーネント用のコードがJSFページに挿入されます。
actionListener
を使用して、ボタンにメソッドをバインドします。
メソッド・コールからの戻り値を使用します。
JDeveloperはメソッドにアクション・バインディングを追加します。アクション・バインディングはRequiresUpdateModel
プロパティを使用して、アクションを実行する前にモデルを更新する必要があるかどうかを判別します。コマンド操作の場合、デフォルトではこのプロパティはtrue
に設定されています。つまり、ビュー・レイヤーでのすべての変更は、操作を実行する前にモデルに移動する必要があります。
パラメータを取得するメソッドをJSFページにドロップすると、メソッド・アクション・バインディングが作成されます。このバインディングにより、ユーザーがコマンド・コンポーネントをクリックしたときにメソッドが実行されるようになります。メソッドが実行するパラメータを要求する場合は、JDeveloperによって、各パラメータのNamedData
要素も作成されます。これらの要素は、メソッドのパラメータを表します。
たとえば、ADFタスク・フローのSummitサンプル・アプリケーションのpopulateInventoryForProduct(String)
メソッド・アクション・バインディングには、String
パラメータのNamedData
要素が含まれます。この要素は、アクション・バインディングの作成時に指定した値にバインドされます。次の例は、populateInventoryForProduct(String)
メソッドをドロップし、String
パラメータ(productId
)を適切な変数にバインドしたときに作成されるメソッド・アクション・バインディングを示しています。
<methodAction id="populateInventoryForProduct" RequiresUpdateModel="true" Action="invokeMethod" MethodName="populateInventoryForProduct" IsViewObjectMethod="true" DataControl="BackOfficeAppModuleDataControl" InstanceName="data.BackOfficeAppModuleDataControl.InventoryVO1"> <NamedData NDName="productId" NDType="java.lang.String"/> </methodAction>
JDeveloperはADF Facesコンポーネント用のコードをJSFページに追加します。このコードは、「EL式を使用したメソッドへのバインド」で説明しているように、その他のコマンド・ボタンのコードに似ています。ただし、ボタンは、組込み操作用のアクション・バインディングのexecute
メソッドではなく、ドロップしたメソッド用のメソッド・アクション・バインディングのexecute
メソッドにバインドされます。
操作を使用してコマンド・ボタンを作成するときと同様に、メソッドを使用してコマンド・ボタンを作成すると、actionListener
属性を使用して、ボタンがメソッドに自動的にバインドされます。ボタンは、EL式を使用して、指定されたメソッドのアクション・バインディングのexecute
プロパティにバインドされます。このEL式により、アプリケーション・モジュールに対してバインディングのメソッドが起動します。コマンド・ボタンのactionListener
属性の詳細は、「実行時に行われる処理: アクション・イベントおよびアクション・リスナーの動作方法」を参照してください。
ヒント:
アクション・バインディングのexecute
メソッドにボタンをバインドするかわりに、execute
メソッドをオーバーライドするバッキングBean内のメソッドにボタンをバインドできます。そうすることで、元のメソッドの実行前か実行後に、ロジックを追加できるようになります。詳細は、「宣言メソッドの上書き」を参照してください。
ナビゲーション操作のように、ボタンのdisabled
プロパティは、EL式を使用してボタンを表示するかどうかを決定します。次の例は、コマンド・ボタンのpopulateInventoryForProduct(String)
メソッドへのバインドに使用されるEL式を示しています。
<af:button actionListener="#{bindings.populateInventoryForProduct.execute}" text="populateInventoryForProduct" disabled="#{!bindings.populateInventoryForProduct.enabled}" id="b1"/>
ヒント:
コマンド・ボタン・コンポーネントをページにドロップすると、以前にドロップされた同種のコンポーネントの数に基づいて自動的にIDが付けられます。たとえば、最初の2つのボタンのb1
およびb2
がドロップされます。このIDをより説明的なものに変更する場合は、ページ内のすべてのEL式でこのIDへの参照を手動で更新する必要があります。
メソッド・コールからの戻り値を使用することもできます。次の例は、文字列値を戻すカスタム・メソッドを示しています。
/** * Custom method. */ public String getHelloString() { return ("Hello World"); }
次の例は、コマンド・ボタンおよびoutputText
コンポーネントのJSFページのコードを示しています。
<af:button actionListener="#{bindings.getHelloString.execute}" text="getHelloString" disabled="#{!bindings.getHelloString.enabled}" id="helloButtonId"/> <af:outputText value="#{bindings.return.inputValue}" id="helloOutputId"/>
ユーザーがコマンド・ボタンをクリックすると、カスタム・メソッドがコールされます。このメソッドは、outputText
コンポーネントの値として表示される文字列「Hello World」を戻します。
複雑なアプリケーション機能を決定するには、ページのアクションにパラメータを設定することが必要な場合があります。マネージドBeanを使用してパラメータを正常に渡すことができ、Beanのメソッドによってパラメータがチェックされます。
1つのページでのアクションに対して、アプリケーション機能を判別するためのパラメータを設定する必要が生じる場合があります。たとえば、あるページから別のページの結果表へ移動する検索ボタンを作成できます。ただし、結果表が表示されるのはパラメータ値がfalse
の場合のみです。
ページ間でこのパラメータを渡す場合やパラメータ値のチェックに使用するメソッドを含める場合には、マネージドBeanを使用できます。検索ページのレンダリング時にマネージドBeanがインスタンス化され、このBeanのメソッドによってこのパラメータがチェックされます。このパラメータがnull
の場合(ページが初めてレンダリングされる場合)は、値がtrue
に設定されます。
カスタム・メソッドの作成の詳細は、「サービス・メソッドによるアプリケーション・モジュールのカスタマイズ」および「UIクライアントへのカスタム・サービス・メソッドの公開」を参照してください。
注意:
タスク・フローを使用している場合、タスク・フローのパラメータ渡しメカニズムを使用できます。「タスク・フローのパラメータの使用」を参照してください。
type
プロパティがaction
に設定されたsetPropertyListener
コンポーネント(この検索を実行したコマンド・ボタンにネストされている)を使用してこのフラグがfalse
に設定されるため、検索の実行後に結果表が表示されるようになります。マネージドBeanの使用の詳細は、「Fusion WebアプリケーションでのマネージドBeanの使用」を参照してください。
setPropertyListener
コンポーネントを使用して、その他のオブジェクトの値を設定できます。このコンポーネントは、コマンド・コンポーネントの子である必要があります。
始める前に:
setPropertyListener
およびマネージドBeanを使用して値を設定する方法について理解しておくと役立ちます。詳細は、「コマンド・コンポーネントを使用したパラメータ値の設定」を参照してください。
また、他のコマンド・コンポーネントを使用して追加できる機能について理解しておくと役立ちます。詳細は、「コマンド・コンポーネントの追加機能」を参照してください。
次のタスクを完了する必要があります。
「アプリケーション・モジュールの作成と変更」の説明に従って、データ・モデルで必要なビュー・オブジェクトおよびカスタム・メソッドのインスタンスを含むアプリケーション・モジュールを作成します。または、別のタイプのビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項の説明に従って、そのビジネス・サービスのデータ・コントロールを作成します。
「Webページの作成」の説明に従って、JSFページを作成します。
setPropertyListenerコンポーネントを使用するには:
setPropertyListener
コンポーネントを使用すると、次のページに移動する前にコマンド・コンポーネントによって値が設定されます。渡す必要がある値のソースまたは実際の値をfrom
属性に設定すると、コンポーネントからその値へのアクセスが可能になります。to
属性をターゲットに設定すると、コマンド・コンポーネントによってターゲットに値が設定されるようになります。次の例は、false
値を取得し、その値をsearchResults
マネージドBeanのinitialSearch
フラグの値として設定するコマンド・コンポーネントのJSFページのコードを示しています。
<af:button actionListener="#{bindings.Execute.execute}"
text=Search>
<af:setPropertyListener from="#{false}"
to="#{searchResults.initialSearch}"/>
type="action"
/>
</af:button>
ユーザーがコマンド・コンポーネントをクリックすると、移動する前に、setPropertyListener
コンポーネントによってパラメータ値が設定されます。「setPropertyListenerを使用したパラメータ設定時の処理」の例に示すように、setPropertyListener
はfalse
値を取得し、その値をsearchResults
マネージドBeanのinitialSearch
属性の値として設定しています。これで、レンダリングするかどうかを決定するためにこの値を認識する必要があるコンポーネントは、EL式#{searchResults.initialSearch}
を使用してアクセスできます。
既存の宣言メソッドの機能をオーバーライドして、メソッド要件に固有の動作を定義できます。宣言メソッドの前後にロジックを追加するには、関連付けられたアクション・バインディングへのアクセスを提供するマネージドBeanに新しいメソッドとプロパティが必要です。
操作またはメソッドをコマンド・ボタンとしてドロップすると、操作またはメソッドのexecute
メソッドに、そのボタンが自動的にバインドされます。ただし、既存のロジックの前または後に、ロジックの追加が必要になる場合もあります。
注意:
タスク・フローを使用している場合、タスク・フローからカスタム・メソッドをコールできます。詳細は、「ADFタスク・フローのスタート・ガイド」を参照してください。
JDeveloperを使用すると、バインディング・コンテナにアクセスするマネージドBeanでメソッドおよびプロパティを新規作成することにより、宣言的操作にロジックを追加できます。デフォルトでは、この生成されたコードによって、操作またはメソッドが実行されます。その後、このコードの前か後にロジックを追加できます。元の操作またはメソッドのexecute
プロパティではなく、この新規メソッドにコマンド・コンポーネントが自動的にバインドされます。その後、ユーザーがボタンをクリックすると、新規メソッドが実行されます。
たとえば、Summit ADFタスク・フロー・サンプル・アプリケーションのCustomers.jsff
フラグメントでは、「新規」アイコンをクリックして、新規注文を作成できます。ただし、宣言的CreateInsert
操作には、追加処理が必要です。ボタンをクリックすると、注文の詳細を示す新規タブが表示される必要があります。この処理を提供するために、CustomersBackingBean
のマネージドBeanのcreateNewOrder
メソッドにロジックが追加されます。
宣言メソッドをオーバーライドするには、マネージドBeanにコマンド・コンポーネントがバインドされる新規メソッドを保持させる必要があります。ページにバッキングBeanが関連付けられている場合は、JDeveloperによって、バインディング・オブジェクトへのアクセスに必要なコードがバッキングBeanに追加されます。ページにバッキングBeanが関連付けられていない場合は、作成を促す指示が表示されます。
コマンド・コンポーネントを追加して、マネージドBeanを使用してその宣言メソッドをオーバーライドできます。
始める前に:
宣言メソッドのオーバーライド方法について理解しておくと役立ちます。詳細は、「宣言メソッドの上書き」を参照してください。
また、他のコマンド・コンポーネントを使用して追加できる機能について理解しておくと役立ちます。詳細は、「コマンド・コンポーネントの追加機能」を参照してください。
次のタスクを完了する必要があります。
「アプリケーション・モジュールの作成と変更」の説明に従って、データ・モデルで必要なビュー・オブジェクトおよびカスタム・メソッドのインスタンスを含むアプリケーション・モジュールを作成します。または、別のタイプのビジネス・サービスを使用している場合は、『Oracle ADFデータ・コントロールによるアプリケーションの開発』のデータ・コントロールを使用したビジネス・サービスの公開に関する項の説明に従って、そのビジネス・サービスのデータ・コントロールを作成します。
「Webページの作成」の説明に従って、JSFページを作成します。
注意:
現在、コマンド・コンポーネントのAction
属性の値としてEL式が設定されている場合は、JDeveloperによってEL式が上書きされないため、宣言メソッドをオーバーライドできません。次の手順を行う前に、この値を削除する必要があります。
宣言メソッドのオーバーライドの手順:
宣言メソッドをオーバーライドすると、JDeveloperにより、管理プロパティがバッキングBeanに追加され、この管理プロパティに値#{bindings}
(バインディング・コンテナへの参照)が設定されます。また、強く型付けされたBeanプロパティがBindingContainer
型のクラスに追加され、JSFランタイムにより、値として管理プロパティ式#{bindings}
が設定されます。また、JDeveloperはUIコマンド・アクション・メソッドにロジックを追加します。このロジックには、現在のバインディング・コンテナへのアクセスに使用されている、強く型付けされたgetBindings()
メソッドが含まれます。
このコードは、次の操作を実行します。
バインディング・コンテナにアクセスします。
関連付けられているメソッドのバインディングを検索し、実行します。
ナビゲーションに使用できるメソッドの戻り値を追加します。デフォルトでは、戻り値はnull
です。ボタンのAction
属性に結果文字列がすでに存在する場合は、その属性が戻り値として使用されます。このコードは、必要に応じて変更できます。
ActionListener
属性ではなく、Action
属性を使用して新しいメソッドにUIコマンド・コンポーネントがリバインドされます。次の例は、CreateInsert
操作が宣言的にページに追加される場合のコードを示しています。
<af:button actionListener="#{bindings.CreateInsert.execute}" text="CreateInsert" disabled="#{!bindings.CreateInsert.enabled}"/>
次の例は、ページのバッキングBeanのメソッドをオーバーライドした後のボタン・タブのコードを示しています。ここでは、action
属性は、バッキングBeanのメソッドにバインドされています。
<af:button text="New" action="#{backingBeanScope.CustomersBackingBean.createNewOrder}"/>
ヒント:
オーバーライド後のメソッドを使用するボタンをクリックすると、次のエラーが表示されます。
SEVERE: マネージドBean main_beanを作成できませんでした。参照されるオブジェクトのスコープ: '#{bindings}'が、参照するオブジェクトより小さいです。
これは、オーバーライド後のメソッドを含むマネージドBeanのスコープが、request
より大きい(つまり、session
またはapplication
である)ためです。メソッドで参照されるバインディング・コンテナ内のデータのスコープがrequest
であるため、このマネージドBeanのスコープは同じか、より小さいスコープに設定する必要があります。