1

リクエスト スコープ Bean からデータを取得する dataTable 内に配置されたときに、ah:commandLink のアクション メソッドが呼び出されないというよく知られた「問題」に対処しようとしています。プロジェクトの制約により、JSF 2.0 と RichFaces 3.x (部分的にサポートされています) の使用に制限されているため、Tomahawk のソリューション (preserveDataModel) に頼ることはできません。

検索と試行錯誤に 1 日を費やした後:

  • dataTable がフィードする「データモデル」をセッションに保存する必要があることを読みました。Bean全体をセッションスコープにすることなく、どうすればそれを行うことができますか? データを保持する静的変数を試しましたが、機能しません。
  • a4j:keepAlive を自分の Bean (必要に応じて Serializable を実装する) で使用しようとしましたが、機能しませんでした。
  • Bean を ViewScoped にすることも機能しません。

これに関するヘルプをいただければ幸いです。

編集:

これが私がやろうとしていることです:

このページには、データベースから取得した多数のオプションを表示するコンボがあります。ユーザーがいずれかを選択すると、選択したオプションに関連する情報が dataTable に入力されます。最初の列のデータは、コマンド リンクとして表示されます。ユーザーがリンクをクリックすると、指定されたメソッドが呼び出されますが、呼び出されません。

mypage.xhtml

<h:form>
<!-- Placed a <a4j:keepAlive beanName="myBean"> in this line, but didn't work -->
<h:selectOneMenu value="#{myBean.selectedOption}">
    <f:selectItems value="#{myBean.optionsList}" var="option"
                   itemLabel="#{option.labelProperty}" itemValue="#{option.valueProperty}"/>
    <a4j:support event="onchange" action="#{myBean.getDataBasedOnSelectedOption}"
        reRender="table_panel" ajaxSingle="true"/>
</h:selectOneMenu>

<a4j:outputPanel id="table_panel" >
    <rich:dataTable id="table" value="#{myBean.data}" var="dataRow"
             rendered="#{not empty myBean.selectedOption}">
        <f:facet name="header">
            <rich:columnGroup>
                <rich:column>Some column header</rich:column>
            </rich:columnGroup>
        </f:facet>

        <rich:column>
                <a4j:commandLink  action="#{myBean.linkClickedAction}"
                    value="#{dataRow.someProperty}"/>
        </rich:column>
</a4j:outputPanel>

MyBean.java

@ManagedBean(name="myBean")
@RequestScoped //Tried with @ViewScoped but didn't work

private List<MyPOJO1> optionsList;
private List<MyPOJO2> data; //Made this variable static, but didn't work
private String selectedOption;

@PostConstruct
public void init()
{
    optionsList = getOptionsListFromDatabase();
}

public String getDataBasedOnSelectedOption()
{
    data = getRelevantDataFromDatabase(selectedOption);

    return null;
}

//This method doesn't get called
public String linkClickedAction()
{
    System.out.println("I'm here!");

    return null;
}

public List<MyPOJO1> getOptionsList()
{
   return optionsList;
}

public void getSelectedOption()
{
    return selectedOption;
}

public void setSelectedOption(String selectedOption)
{
    this.selectedOption = selectedOption;
}
4

1 に答える 1

0

a4j:keepAliveまたは機能しない場合@ViewScopedは、データモデルのデータ読み込みロジックが間違っている可能性が高くなります。アクション メソッド、コンストラクター、または@PostConstructBean で実行するのではなく、いくつかのパラメーターに基づいてゲッター内にロードしている可能性があります。つまり、getter は、JSF ライフサイクルの要求値の適用フェーズ中にも呼び出され、コマンドリンクが押された行を判別します。これにより、JSF は、どのアクションを呼び出す必要があるかを判別できます。ゲッターが期待される行でデータモデルを返さない場合、アクションは単に呼び出されません。

それに応じて修正します。ゲッターは Bean プロパティのみを返すか、せいぜい遅延読み込みのみを行う必要があります。

于 2010-12-04T12:26:48.027 に答える