2

それで、私はこの質問でAnthony / BalusCからのメソッドを実装しようとしました:JSFデータテーブルで選択された行インデックスを取得する方法は?しかし、役に立たない。@BalusCの「Usingdatatables」の記事(いつものように素晴らしい)も読みましたが、これはJSF1.2用に書かれており、2.0の記事では選択した行データの取得については実際には取り上げていません。ユーザーが[お気に入りに追加]ボタンをクリックすると、選択した行がバッキングBeanに渡されず、ナビゲーションケースがフォローされず、現在のページが更新されます。

私がここで間違っていることについて何か考えはありますか?

これが私のバッキングBeanです:

    @ManagedBean(name = "selectedBean")
@RequestScoped
public class SelectedBeerBean 
{
    private List<Beer> favoriteBeers;
    private Beer selectedBeer;
    private HtmlDataTable datatableBeers;

    public HtmlDataTable getDatatableBeers() {
        return datatableBeers;
    }

    public void setDatatableBeers(HtmlDataTable datatableBeers) {
        this.datatableBeers = datatableBeers;
    }

    public String addBeer()
    {
        selectedBeer = (Beer) datatableBeers.getRowData();

        return "selectedBeer";
    }

    public List<Beer> getFavoriteBeers() {
        return favoriteBeers;
    }

    public void setFavoriteBeers(List<Beer> favoriteBeers) {
        this.favoriteBeers = favoriteBeers;
    }

    public Beer getSelectedBeer() {
        return selectedBeer;
    }

    public void setSelectedBeer(Beer selectedBeer) {
        this.selectedBeer = selectedBeer;
    }

}

これが私のxhtmlページです:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Welcome to Draft Savvy, #{draftSavvyController.name}</title>        
    </h:head>
    <h:form>
    <h:body style="background-image: url(Background-Wood.png); ">
        <h3>You searched for "#{draftSavvyController.searchTerm}"</h3>
        <h4>Here are your beers</h4>

        <h:dataTable binding="#{selectedBean.datatableBeers}" value="#{draftSavvyController.beerList}" var="beer" border="1">
           <h:column>
               <f:facet name="header">
                   <h:outputText value="Logo"/>
               </f:facet>
                   <h:graphicImage url="#{beer.icon}"/>            
           </h:column>
           <h:column>
               <f:facet name="header">
                   <h:outputText value="Beer Name"/>
               </f:facet>
                   <h:outputText value="#{beer.name}"/>
           </h:column>        
           <h:column>
               <f:facet name="header">
                   <h:outputText value="Description"/>
               </f:facet>
                   <h:outputText value="#{beer.description}"/>
           </h:column>
           <h:column>
               <f:facet name="header">
                   <h:outputText value="Beer ID"/>
               </f:facet>
                   <h:outputLabel value="#{beer.id}" />
           </h:column>
           <h:column>
               <f:facet name="header">
                   <h:outputText value="Add To My Favorites"/>
               </f:facet>
               <h:commandButton value="Add Beer" action="#{selectedBean.addBeer}">
                   <f:setPropertyActionListener target="#{selectedBean.selectedBeer}" value="#{beer}" />
               </h:commandButton>            
           </h:column>
         </h:dataTable>

    </h:body>
    </h:form>
</html>
4

1 に答える 1

3

2.0の記事では、選択した行データの取得については実際には扱っていません。

します。よく見ていないかもしれませんが、選択した行データを取得する 2 つの方法を示しています。バッキング Bean のメソッドedit()とメソッドを見てください。最初の方法delete()はそれを実行し、2 番目の方法は新しい EL 2.2 機能を使用して直接アクション メソッドに渡すことで実行します。DataModel#getRowData()


ユーザーが [お気に入りに追加] ボタンをクリックすると、選択した行がバッキング Bean に渡されず、ナビゲーション ケースが追跡されず、現在のページが更新されます。

これは、テーブルを含むページが表示された最初のリクエスト時とまったく同じではないvalue場合に発生します。<h:dataTable>これは、Bean がリクエスト スコープである場合や、Bean がリクエスト パラメータvalue<h:dataTable>依存している場合に発生します。valueBean をビュー スコープに配置するか、Beanの (ポスト) コンストラクターでまったく同じように準備することで、問題が修正されます。ビュー スコープを使用する場合は、Beanのを削除する必要があります。binding<h:dataTable>


あなたの特定のケースでは、別のビューへのナビゲーションが含まれているため、おそらく別のより良い方法があります。具体的な機能要件は明確ではありません。確認ページのようなものですか?代わりに GET を使用してください。それとも、アクションが成功した後の単なるランディング ページですか? 代わりに、POST-Redirect-GET を使用してください。その他のヒントについては、「JSF 2.0 での通信 - GET 要求パラメーターの処理」も参照してください。

于 2012-08-13T09:54:10.107 に答える