S_a_k_Uの日記みたいなDB

~サクゥーと呼ばないで~

Oracle ADFのpartialSubmit="true"でimmediate="true"なボタンのアクションによる入力フィールドの値の書き換え

ADFのバージョンは…JDeveloperが11gでした。
outputTextタグな表示フィールドは普通にManagedBeanの値を書き換えればWeb画面上の値も書き換わるのに、inputTextタグやらselectOneRadioタグやらなどの入力フィールドの値が書き換わってくれない。
画面のシチュエーションとしては、IDを入力してボタンをクリックすると、IDの情報がフォームの入力フィールドにデフォルト表示されるような動作。



ADFの開発ガイドの方法

ADFの開発ガイドには、アクションの処理の中でPartialTargetに対象となるUIコンポーネントを追加すればいいように書いてるけど、これってJSFのタグにあるpartialTarget属性と一緒じゃね?ってことでやってみたけど、やっぱり入力フィールドの値が書き換わってくれない。
Oracle Fusion Middleware Oracle Application Development FrameworkのためのWebユーザー・インタフェース開発者ガイド 11gリリース1(11.1.1) > 5 部分ページ・コンテンツのリフレッシュ

AdfFacesContext.getCurrentInstance().addPartialTarget(formHandler);

どこかの怪しい情報

いくつかの方法があるけど、UIコンポーネントのオブジェクトをUIコンポーネントツリーから削除したら、UIコンポーネントを再生成する時にManagedBeanの値を設定するので書き換わるよ!
ってのがあって、値を書き換えたい入力フィールドのUIコンポーネントを削除するとうまくいった!
しかし、複数のボタンのアクションで入力フィールドの値を書き換えてたら、動作しなくなるという問題が。
やっぱなんかやり方としておかしいよね。。。
というか、最初はあの情報しか見当たらなかったのに、なぜ今検索であのページに辿り着けんのじゃ???


resetValueメソッドとresetStampStateメソッド

いろいろ探し回って、通常の入力フィールドはUIコンポーネントのresetValueメソッド、dataTableタグに包含される場合は、TableのUIコンポーネントのresetStampStateメソッドをアクションの呼び出せば書き換えてくれるようになった。
結果的には、ADFが…というより、依存してるApache MyFaces Trinidadでの動作ということなのかな???
SlideShare > 18 Invaluable Lessons About ADF-JSF Interaction
Binaries : { "author" : "Jobinesh Purushothaman", "content" : "popular programming languages and tools" } > Why does programmatic refresh fail for child table when the parent table has immediate=true?
Apache MyFaces Trinidad API 2.2.1-SNAPSHOT API > org.apache.myfaces.trinidad.component.UIXEditableValue#resetValue()
Apache MyFaces Trinidad API 2.2.1-SNAPSHOT API > org.apache.myfaces.trinidad.component.UIXCollectionv#resetStampState()


12cではtargetタグ?

12cではtargetタグを使えば、すんなり書き換えてくれるのかな???
TrinidadにはtargetタグないっぽいからADFの独自実装ってことか。
Oracle® Fusion Middleware Oracle ADF FacesによるWebユーザー・インタフェースの開発 12c (12.1.2) > 8 部分ページ・コンテンツの再レンダリング