0

<rich:datatable>aの内容を表示するためにa を使用していますList<Map<String, String>

以下のコードでは、spotlightPtBindingsが でList<Map<String, String>spotlightbindingがそれぞれの を表していMap<String, String>ます。最初の列では、各行に対して 1 つのselectBooleanCheckBoxを示しています。selectBooleanCheckBoxがチェックされている場合Map<String, String>、キー「URI」に対応する値をパラメーターとしてメソッドに送信したいと思います: inserirBean.onSelectedCheckBox(uri)。そのため、この値をui:paramに入れます名前:うり。ここでの問題は、値uriinserirBean.onSelectedCheckBox(uri)で出力しようとすると、空のように出力が得られません。以下に残りのコードを示します。

InsereDocumento.xhtml

<rich:dataTable value="#{inserirBean.spotlightPtBindings}" var="spotlightbinding">

        <rich:column>
                 <f:facet name="header">*</f:facet>
                 <ui:param name="uri" value="#{spotlightbinding['URI']}"/>

                 <h:selectBooleanCheckbox value="#{selectionBean.selected}" />

                    <c:if test="#{selectionBean.selected}">
                        #{inserirBean.onSelectedCheckBox(uri)}"
                    </c:if>

             </rich:column> 

        <c:forEach items="#{inserirBean.variableNamesPt}" var="vname">
             <rich:column>
                 <f:facet name="header">#{vname}</f:facet>
                  #{spotlightbinding[vname]}
             </rich:column> 
         </c:forEach>  


     </rich:dataTable> <br />

SelectionBean

package managedBeans;

import java.io.Serializable;

import javax.faces.bean.ManagedBean;

@ManagedBean
public class CheckBoxSelectionBean implements Serializable {
    private transient boolean selected = false;
    private static final long serialVersionUID = 1L;

    public CheckBoxSelectionBean() {
        // TODO Auto-generated constructor stub
    }

     public boolean isSelected() {
            return selected;
        }

        public void setSelected(boolean selected) {
            this.selected = selected;
        }

}

InserirBean -List<Map<String, String>>名前付きのspotlightPtBindingList<String> variableNamesPtがどのように設定されたかは複雑なプロセスであるため、ここでは示していませんが、それらのコンテンツが画面に表示されるため、確実に設定されていることがわかります。

@ManagedBean
public class InsereDocumentoBean implements Serializable {

    private static final long serialVersionUID = 1L;

        private List<String> variableNamesPt = new ArrayList<String>();
        private List<Map<String, String>> spotlightPtBindings = new ArrayList<Map<String, String>>();


         public List<String> getVariableNamesPt() {
        return variableNamesPt;
    }

    public List<Map<String, String>> getSpotlightPtBindings() {
        return this.spotlightPtBindings;
    }

          public void onSelectedCheckBox(String uri) {
        System.out.println("URI: " + uri);
    }
}

問題は何ですか?ありがとうございました!私は JSF に不慣れで、あなたの助けが必要です!

4

1 に答える 1

1

JSF では、レンダリングは 2 段階のプロセスです。ビューのビルド時間ビューのレンダリング時間があります。それらは同じファイルにありますが、一部のタグはビューのビルド時に有効になり、一部はレンダリング時に有効になります。

のような JSTL タグ<c:forEach><c:if>およびすべてのタグ ハンドラ( を含む<ui:param>こちらを参照) は、ビューのビルド時に評価され、「最終的な」xml ツリーにコンテンツが追加され、JSF によってレンダリングされます。

JSF HTML タグや派生物<rich:dataTable>はビューのレンダリング時に評価されるため、データテーブルは後でvar評価され、に割り当てられたときにバインドされません。<ui:param>spotlightbindinguri

代わりに、関数を呼び出す ajax リスナーを割り当てることをお勧めします。

<h:selectBooleanCheckbox value="#{selectionBean.selected}">
    <f:ajax listener="#{inserirBean.onSelectedCheckBox(spotlightbinding['URI'])}" />
</h:selectBooleanCheckbox>

値が変更されるたびにリスナーが呼び出されることに注意してください。

于 2013-10-28T21:36:37.640 に答える