79420639

Date: 2025-02-07 11:10:07
Score: 4
Natty:
Report link

but.... our problem is a little bit more complicated as we want to use column definitions for a datatable. with c:set the value will not be displayed because it refers to the "var" attribute of the datatable. here a short sample

so first datatable doesn't display data and 2nd datatable displays the data but we can't implement a loop for each column inside datatable.

is there any other solution?

here a short sample

TestView.xhtml

import at.sozvers.kgkk.faces.ViewScoped;
import jakarta.annotation.PostConstruct;
import jakarta.inject.Named;

@ViewScoped
@Named("testView")
public class TestView implements Serializable
{
    private static final long serialVersionUID = 4290918565613185179L;

    private List<Product> products = new ArrayList<>();;

    @PostConstruct
    public void init()
    {
        if (products.isEmpty())
        {
            products.add(new Product(1000, "f230fh0g3", "Bamboo Watch"));
            products.add(new Product(1001, "nvklal433", "Black Watch"));
            products.add(new Product(1002, "zz21cz3c1", "Blue Band"));
        }
    }

    public List<Product> getProducts()
    {
        return products;
    }

    public void setProducts(List<Product> products)
    {
        this.products = products;
    }
}

test.xhtml

    <h:head>
    <title>PF TEST VIEW</title>
    </h:head>
    <h:body id="body">
    <!-- bean and dto definitions -->
    <ui:param name="bean" value="#{testView}" />
    <ui:param name="DTO_List" value="#{bean.products}" />
    <ui:param name="count_columns_max" value="3" />
    <ui:param name="updateViewSpecificComponents" value="#{datatableId}" />
    <h:form id="form">
    <!-- initialize all columns for 1st datatable -->
    <c:forEach begin="1" end="#{count_columns_max}" var="idx">
    <c:set var="#{'column'.concat(idx).concat('_label')}" value="" scope="view" />
    <c:set var="#{'column'.concat(idx).concat('_value')}" value="" scope="view" />
    </c:forEach>
    <!-- define view specific columns for 1st datatable -->
    <c:set var="column1_label" value="Id" scope="view" />
    <c:set var="column1_value" value="#{data.id}" scope="view" />
    <c:set var="column2_label" value="Code" scope="view" />
    <c:set var="column2_value" value="#{data.code}" scope="view" />
    <c:set var="column3_label" value="Name" scope="view" />
    <c:set var="column3_value" value="#{data.name}" scope="view" />
    <ui:param name="datatable_rowKey" value="#{data.id}" />
    <ui:param name="datatableId" value="dataTable1" />
    <h2>DATATABLE 1: with c:set vor value</h2>
    <p></p>
    <div>
    <p:dataTable id="#{datatableId}" value="#{DTO_List}" var="data" rowKey="#{datatable_rowKey}">
    <c:forEach begin="1" end="#{count_columns_max}" var="idx">
    <p:column headerText="#{viewScope['column' += idx += '_label']}">
    <h:outputText value="#{viewScope['column' += idx += '_value']}" />
    </p:column>
    </c:forEach>
    </p:dataTable>
    </div>
    <!-- initialize all columns for 2nd datatable -->
    <c:forEach begin="1" end="#{count_columns_max}" var="idx">
    <c:set var="#{'column'.concat(idx).concat('_label')}" value="" scope="view" />
    <ui:param name="#{'column'.concat(idx).concat('_value')}" value="" />
    </c:forEach>
    <!-- define view specific columns for 2nd datatable -->
    <c:set var="column1_label" value="Id" scope="view" />
    <ui:param name="column1_value" value="#{data.id}" />
    <c:set var="column2_label" value="Code" scope="view" />
    <ui:param name="column2_value" value="#{data.code}" />
    <c:set var="column3_label" value="Name" scope="view" />
    <ui:param name="column3_value" value="#{data.name}" />
    <ui:param name="datatable_rowKey" value="#{data.id}" />
    <ui:param name="datatableId" value="dataTable2" />
    <h2>DATATABLE 2: with ui:param for value</h2>
    <p></p>
    <div>
    <p:dataTable id="#{datatableId}" value="#{DTO_List}" var="data" rowKey="#{datatable_rowKey}">
    <p:column headerText="#{viewScope['column1_label']}">
    <h:outputText value="#{column1_value}" />
    </p:column>
    <p:column headerText="#{viewScope['column2_label']}">
    <h:outputText value="#{column2_value}" />
    </p:column>
    <p:column headerText="#{viewScope['column3_label']}">
    <h:outputText value="#{column3_value}" />
    </p:column>
    </p:dataTable>
    </div>
    </h:form>
    </h:body>
Reasons:
  • Blacklisted phrase (1): is there any
  • Long answer (-1):
  • Has code block (-0.5):
  • Ends in question mark (2):
  • Self-answer (0.5):
  • Looks like a comment (1):
  • Low reputation (1):
Posted by: Andrew Churchill