1

私はデータテーブルを持っています。dataTable のデータは、ajax を介して埋められます。テーブルの行には、ボタンなどのフォーム要素が含まれています。datatTable のボタンは別のページを参照する必要がありますが、それらをクリックすると現在のページがリロードされます。

ここにいくつかのコード:

バッキング Bean:

@ManagedBean(name="bean")
@SessionScoped
public class Bean {

private List<String> data;

@PostConstruct
public void postConstruct() {
    data = new ArrayList<String>();

}

public void fillTable() {
    data.add("E1");
    data.add("E2");
    data.add("E3");
}

public String outcome(){
    return "/faces/test/edit.jsf";
}

public List<String> getData() {
    return data;
}

public void setData(List<String> data) {
    this.data = data;
}

}

ページ:

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org   /TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" 
  xmlns:h="http://java.sun.com/jsf/html" >
<h:body>
<h:form id="form">
<h:commandButton value="fillTable">
    <f:ajax listener="#{bean.fillTable()}" render="@form"/>
</h:commandButton>
<h:dataTable id="table" var="data" value="#{bean.data}">
    <h:column>
        <h:outputText value="#{data}" />
    </h:column>
    <h:column>
        <h:commandButton value="edit" action="#{bean.outcome}" />
    </h:column>
</h:dataTable>
</h:form>
</h:body>
</html>

これには、フォームが既に dom にあり、ボタンがページに遅延読み込みされていることが関係していることを知っています (誰かがより具体的であることができれば、私は非常に喜んでいます)。

ただし、バッキング Bean の Scope を SessionScope に変更すると機能します。ボタンは右のページにリダイレクトします。なんで?

4

1 に答える 1

4

ただし、バッキング Bean の Scope を SessionScope に変更すると機能します。ボタンは右のページにリダイレクトします

Bean はビュー スコープに配置されている必要があります。セッション スコープが広すぎるため、同じビューが同じセッションの複数のブラウザー ウィンドウ/タブで開かれている場合にのみ、非直感的な動作が発生する可能性があります。

説明は次のとおりです。フォームが送信されると、JSF は、関連付けられたアクション メソッドを呼び出すために、押されたコマンド ボタンを識別する必要があります。コマンドボタンはデータテーブルの横に配置されているため、JSF は最初にそのデータモデルを反復処理する必要があります。しかし、データモデルが変更されているか空の場合、JSF はコマンド ボタンを識別できません。したがって、アクションは呼び出されません。

Bean がリクエスト スコープ内にある場合、Bean はレスポンスの終わりまでに破棄され、ajax リクエストを含む新しいリクエストごとに再作成されます。Bean のすべてのプロパティは明らかにデフォルト値を再び取得するため、このdata場合のプロパティも同様です。

以下も参照してください。

于 2012-07-04T19:53:36.253 に答える