使用h:selectBooleanCheckbox和c:if获取<rich:datatable>的行值 - JSF </rich:datatable>

时间:2013-10-28 20:20:14

标签: jsf

我正在使用<rich:datatable>来显示List<Map<String, String>

的内容

在下面的代码中, spotlightPtBindings List<Map<String, String> spotlightbinding 代表每个Map<String, String>。在第一列中,我为eah行显示了一个 selectBooleanCheckBox 。当选中 selectBooleanCheckBox 时,我想将对应于键“URI”的Map<String, String>的值作为参数发送到方法: inserirBean.onSelectedCheckBox(uri) ),这就是为什么我把这个值放在名称的 ui:param 中: uri 。这里的问题是,当我尝试打印 inserirBean.onSelectedCheckBox(uri)中收到的值 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>>如何命名 spotlightPtBinding 以及List<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的新手,需要你的帮助!

1 个答案:

答案 0 :(得分:1)

在JSF渲染过程中有两个步骤:视图构建时间视图渲染时间。 虽然它们位于同一个文件中,但某些标记在视图构建时生效,有些在渲染时生效。

<c:forEach><c:if>所有标记处理程序(包括<ui:param>,见here)等JSTL标记在视图构建时进行评估,他们将内容添加到“最终”的xml树中,然后由JSF呈现。

JSF HTML标记和衍生工具(如<rich:dataTable>)在视图渲染时进行评估,因此数据表的var将在之后进行评估,然后<ui:param>将导致spotlightbinding 1}}在分配给uri时不受约束。

相反,我建议您指定一个ajax监听器来调用该函数:

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

请注意,只要值更改,就会调用侦听器。