JSF Datatable JSF2.0中的动态列

时间:2011-12-13 08:48:35

标签: jsf dynamic jsf-2 datatable

我需要你的帮助。我使用JSF 2.0,我有一个数据表组件。数据表中的一列是动作列,我需要创建一个包含不同类型的actionsource组件的工具栏,例如命令按钮,链接等。动作源的类型在运行时确定,动作源的数量也在运行。我如何在JSF 2.0中实现它

           <p:dataTable value="#{listBranchBean1.rowDataModel}" var="rowItem"
              id="myId" paginator="true"
              paginatorTemplate="{FirstPageLink}{PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}{RowsPerPageDropdown} "
              rowsPerPageTemplate="10,5,2" previousPageLinkLabel="&lt;"
              nextPageLinkLabel="&gt;" widgetVar="branchTable"
              selection="#{listBranchBean1.selectedBranchesPrime}"
              resizableColumns="true"
              sortBy="#{rowItem.columnsValueMap['branchId'].value}">
              <f:facet name="header">
                 <p:outputPanel>
                    <h:outputText value="Search all fields:" />
                    <p:inputText id="globalFilter" onkeyup="branchTable.filter()"
                       style="width:150px" />
                 </p:outputPanel>
              </f:facet>
              <p:column selectionMode="multiple" style="text-align:left">
                 <f:facet name="header">
                    <h:outputText value="Select" />
                 </f:facet>
                 <h:outputText value="#{rowItem.uniqueId}" />
              </p:column>
              <p:column
                 rendered="#{listBranchBean1.columnsMap['objectId'].hidden==false}"
                 sortBy="#{rowItem.columnsValueMap['objectId'].value}"
                 filterBy="#{rowItem.columnsValueMap['objectId'].value}">
                 <f:facet name="header">
                    <h:outputText
                       value="#{listBranchBean1.columnsMap['objectId'].displayLabel}" />
                 </f:facet>
                 <h:outputText
                    value="#{rowItem.columnsValueMap['objectId'].value}" />
              </p:column>
              <p:column
                 rendered="#{listBranchBean1.columnsMap['actions'].hidden==false}">
                 <f:facet name="header">
                    <h:outputText
                       value="#{listBranchBean1.columnsMap['actions'].displayLabel}" />
                 </f:facet>
                 <p:toolbar>
                    <p:toolbarGroup>
                       <ui:repeat var="action"
                          value="#{rowItem.columnsValueMap['actions'].value}">
                          <p:commandButton title="#{action}" type="button">
                          </p:commandButton>
                       </ui:repeat>
                    </p:toolbarGroup>

                 </p:toolbar>
              </p:column>
           </p:dataTable>

我想用

之类的内容替换最后一列
                 <p:toolbar binding="#{listBranchBean1.getActions(rowItem)}">
                 </p:toolbar>

感谢您的帮助

Prajeesh Nair

2 个答案:

答案 0 :(得分:2)

JSF中的构建时和渲染时间之间存在差异。像<ui:repeat>这样的构建时标签能够动态创建新组件,但它们只能使用构建时可用的数据。

但是,使用Java也可以以编程方式更改组件树,但这也不可能随时发生。执行此操作的安全时刻是preRenderViewEvent,这比构建时刻(restore view阶段)要晚一些,并且您应该拥有当时所需的所有数据。 / p>

在此事件的事件处理程序中,您可以引用绑定到辅助bean的工具栏,并以编程方式向其添加列。

有关示例,请参阅:

请注意,如果您的支持bean是@ViewScoped,则最好不要使用绑定,而是使用手动查找。这是由于JSF中的视图范围和绑定组件存在一些错误。

答案 1 :(得分:0)

下面的代码将根据所选国家

创建动态列
public void loadDynamicList() throws Exception {
int i=0;
 dynamicList = new ArrayList<List<String>>();
dynamicList.add(Arrays.asList(new String[] { "ID1" }));
existingCountryList = new ArrayList<Country>();
String countryCode="US";
existingCountryList.add(getCountryService().getCountryByCode(countryCode));
Country country=getCountryService().getCountryByCode(countryCode);
countryLanguageSet=country.getCountryLanguage();
i=country.getCountryLanguage().size();
dynamicHeaders = new String[i] ;
int j=0;
   for (CountryLanguage count: countryLanguageSet) {
    System.out.println(count.getLanguage().getLanguageName());
    dynamicHeaders[j]=count.getLanguage().getLanguageName();
    j++;
}
 }
public void populateDynamicDataTable() {
debugLogger.debug("populateDynamicDataTable:Enter");
// Create <h:dataTable value="#{myBean.dynamicList}" var="dynamicItem">.
HtmlDataTable dynamicDataTable = new HtmlDataTable();
dynamicDataTable.setValueExpression("value", createValueExpression("#{relationBean.dynamicList}", List.class));
dynamicDataTable.setVar("dynamicItem");

// Iterate over columns.
for (int i = 0; i < dynamicHeaders.length; i++) {
    // Create <h:column>.
    HtmlColumn column = new HtmlColumn();
    dynamicDataTable.getChildren().add(column);
    // Create <h:outputText value="dynamicHeaders[i]"> for <f:facet name="header"> of column.
    HtmlOutputText header = new HtmlOutputText();
    header.setValue(dynamicHeaders[i]);
    column.setHeader(header);
     HtmlInputText input=new HtmlInputText();
    column.getChildren().add(input);
}
   dynamicDataTableGroup = new HtmlPanelGroup();
dynamicDataTableGroup.getChildren().add(dynamicDataTable);
debugLogger.debug("populateDynamicDataTable:Exit");
}

public HtmlPanelGroup getDynamicDataTableGroup() throws Exception {
// This will be called once in the first RESTORE VIEW phase.
if (dynamicDataTableGroup == null) {
    loadDynamicList(); // Preload dynamic list.
    populateDynamicDataTable(); // Populate editable datatable.
}

return dynamicDataTableGroup;
}


public List<List<String>> getDynamicList() {
return dynamicList;
}
public void setDynamicList(List<List<String>> dynamicList) {
this.dynamicList = dynamicList;
}

public void setDynamicDataTableGroup(HtmlPanelGroup dynamicDataTableGroup) {
this.dynamicDataTableGroup = dynamicDataTableGroup;
}

public ValueExpression createValueExpression(String valueExpression, Class<?> valueType) {
FacesContext facesContext = FacesContext.getCurrentInstance();
return facesContext.getApplication().getExpressionFactory().createValueExpression(
    facesContext.getELContext(), valueExpression, valueType);
}