2

私は現在、JSF 1.2プロジェクト(IBMの実装と「会社のレイヤー」)に取り組んでいます。

問題

これが状況です(アイテムの数はほんの一例です)、単純なCRUD

  1. リストアイテム
  2. アイテムのリストがあります
  3. 詳細を表示するには、項目2をクリックします
  4. [変更]をクリックすると、変更ページにアイテム2の値が表示されます
  5. [戻る]ボタンを押してリストに戻りますimmediate="true"(変更を送信したくないため)
  6. 項目4の詳細
  7. アイテム4の変更>アイテム2の値が表示されます

しかし

  • 「戻る」ボタンの「即時」属性をに設定するとfalse、項目4の値はOKです。
  • inputTextコンポーネントの「無効」属性をに設定するとtrue、項目4の値はOKになります。
  • <h:outputText value="#{item4.myValue}/>(UIInput)の代わりに<h:inputText value="#{item4.myValue}/>(UIOutput )を使用する場合

また、デバッグモードで表示したいBeanが「アイテム4」であることを確認しました。

私が見つけたもの

Googleで調査した結果、この問題はJSFのライフサイクルに起因していることがわかりましたが、見つかったドキュメントとソリューションはJSFの特定の実装に関するものです。したがって、値には「submittedValue」ではなく「localValue」が入力されているためだと思います(@see EditableValueHolderインターフェイスは理解に役立ちます)。これらのページにはいくつかの解決策があります。

結果

それは機能しません(私はここにいないでしょう、私は誓います^^)。「更新」ソリューションは効果がありません。「消去入力」が怖いです。すべての入力フィールドを参照する必要があることを認めることはできません!setSubmittedValue()さらに、IBMJSFのUIInputでメソッドが見つかりませんでした。「クリア」方式は効果がありません。1つの要素と、このコードを使用した完全なコンポーネントツリーを試してみました

public void cleanAllChildren(List<UIComponentBase> list){
 for(UIComponentBase c : list){
  this.cleanAllChildren(c.getChildren());
  c.getChildren().clear();
 }
}

しかし、成功しませんでした。だからここにいます。 私は何か見落としてますか?私が見なかった素晴らしいトリッキーな解決策はありますか?私はJSFのライフサイクルにあまり詳しくありません。

4

1 に答える 1

2

リクエストスコープのデータを持つBeanを、セッションスコープではなくリクエストスコープに配置します。

おそらく、セッション内にDB呼び出しを「保存」するためのリスト全体と、同じセッション内の後続の要求で値を保持するためのすべての作業があります。そのために、別のセッションスコープのBeanを使用できますDataManager。次に、選択したアイテムを表すリクエストスコープのBeanが必要ですDataItem。管理プロパティインジェクションを使用して、両方のBeanを理解できます。

于 2009-12-24T15:51:36.410 に答える