4

モハラ 2.1.21

コメントに基づいて質問を更新しました。コンポーネントがサーバー セッション Bean にバインドされている状況が 2 つあります。(情報を含む追加のリンク: Binding attribute cause duplicate component ID found in the view and https://stackoverflow.com/a/12512672/2692917 )

バージョン 1:

シングル.xhtml:

 <h:outputText value=... binding="#{mysessionbean.out}" />

ジャワ:

 @SessionScoped @Named public class Mysessionbean {
    UIOutput out;
    //getter and setter ....
 }

バージョン 2:

template.xhtml:

 <h:outputText value=... binding="#{mysessionbean.out}"

view1.xhtml:

 <ui:composition template="template.xhtml" />

view2.xhtml:

 <ui:composition template="template.xhtml" />

ジャワ:

 @SessionScoped @Named public class Mysessionbean {
    UIOutput out;
    //getter and setter ....
 }

バージョン 1 で問題ありません。(少なくとも、これまでのところエラーは発生していません)。しかし、バージョン 2 では、あるページから別のページに移動すると、ID の重複エラーが発生します。なぜそれが起こるのですか?(リクエスト スコープの) コンポーネント (バージョン 1) をセッション スコープのバインディングで使用しても安全ですか? 考慮すべき別のユースケースはありますか?

編集: 機能要件1:

ビューで Primefaces データテーブルを使用したい。このデータテーブルからの情報が必要です。(選択された行または行インデックスなど)。したがって、データテーブルをバインドすると、この情報を取得するのに役立ちます。

機能要件 2:

複合コンポーネント内のコンポーネント バインディング。それらは、セッション スコープの Bean にバインドされます。(主に 1 つのページで使用されますが、別のページで使用するとどうなるでしょうか?

要件 3

「バージョン2」のような状況。プライムフェイス メニューとセッション スコープのバインディングを含むテンプレート。このために、EL-Binding を使用しました。

4

2 に答える 2

2

同様の問題に遭遇したので、解決策を共有したいと思います。

問題: ビューに (拡張され、大幅にカスタマイズされた) データテーブルがありました。

<x:dataTable binding="#{bean.someSomeDataTable}" />

別のページに移動して戻った後、データテーブルをまったく同じ状態にする必要がありました。以前は、データテーブルをバッキング Bean にバインドすることで解決していました。これは JSP では問題なく機能しました。Facelets ではそれができませんでした (重複 ID エラー)。そのため、バインディングを使用しましたが、データテーブル コンポーネントの状態のみを保存/復元しました。

public HtmlDataTable getSomeDataTable()
{
 HtmlDataTable htmlDataTable = new HtmlDataTable();
 if (tableState != null)
   htmlDataTable.restoreState(FacesContext.getCurrentInstance(), tableState);
 return htmlDataTable;
}

public void setSomeDataTable(HtmlDataTable table)
{
  tableState = table.saveState(FacesContext.getCurrentInstance());
}
于 2014-05-28T15:30:42.220 に答える