How to retrieve values of textboxes in JSF managed bean which are generated through a loop?

倖福魔咒の 提交于 2019-12-14 00:02:23

问题


I need to generate textboxes through a loop as follows.

<p:panel id="dataPanel"  closable="true" toggleOrientation="horizontal" toggleable="true" header="Data">
    <h:panelGrid id="dataPanelGrid" columns="3" cellpadding="5">

        <c:forEach var="row" items="#{zoneChargeManagedBean.list}">

            <p:outputLabel for="txtCharge" value="#{row[1]}"/>          

            <p:inputText id="txtCharge" value="#{row[2]}" converter="#{bigDecimalConverter}" onkeydown="return isNumberKey(event, this.value);" label="#{row[1]}" required="false" maxlength="45">
                <f:validator validatorId="negativeNumberValidator"/>
                <f:attribute name="isZeroAllowed" value="false"/>

                <f:validator validatorId="bigDecimalRangeValidator"/>
                <f:attribute name="minPrecision" value="1"/>
                <f:attribute name="maxPrecision" value="33"/>
                <f:attribute name="scale" value="2"/>
            </p:inputText>

            <p:message for="txtCharge" showSummary="false"/>

        </c:forEach>

        <p:commandButton id="btnSubmit" update="dataPanel messages" actionListener="#{zoneChargeManagedBean.insert}" icon="ui-icon-check" value="Save"/>
        <p:commandButton value="Reset" update="dataPanel" process="@this">
            <p:resetInput target="dataPanel" />
        </p:commandButton>
    </h:panelGrid>
</p:panel>

The value of the given textbox is a type of BigDecimal from the database.

When the given command button is pressed, the values held by these textboxes should be retrieved from the corresponding JSF managed bean so that they can either be inserted or updated in the database.

It would be even better, if it is possible to retrieve the values of all of these text fields at once in some kind of collection (like java.util.List), when the given button is pressed.


回答1:


<ui:repeate>, a render time tag works correctly but not <c:foreEach>, a view build time component (I can't clarify why) but in this particular case, I found <p:dataGrid> is more suitable. The XHTML has been modified accordingly as follows.

<p:panel id="dataPanel" rendered="#{zoneChargeManagedBean.renderedDataPanel}" closable="true" toggleOrientation="horizontal" toggleable="true" header="Data">
    <p:dataGrid columns="3" value="#{zoneChargeManagedBean.list}" var="row" paginator="true" paginatorAlwaysVisible="false" pageLinks="10" rows="15">
        <p:watermark for="txtCharge" value="Enter charge."/>
        <p:tooltip for="lblCharge" value="Some message."/>

        <p:column>
            <p:outputLabel id="lblCharge" for="txtCharge" value="#{row[1]}"/><br/>
            <p:inputText id="txtCharge" value="#{row[2]}" onkeydown="return isNumberKey(event, this.value);" converter="#{bigDecimalConverter}" label="#{row[1]}" required="false" maxlength="45">
                <f:validator validatorId="negativeNumberValidator"/>
                <f:attribute name="isZeroAllowed" value="false"/>

                <f:validator validatorId="bigDecimalRangeValidator"/>
                <f:attribute name="minPrecision" value="1"/>
                <f:attribute name="maxPrecision" value="33"/>
                <f:attribute name="scale" value="2"/>
            </p:inputText>
            <h:message for="txtCharge" showSummary="false" style="color: #F00;"/>
        </p:column>
    </p:dataGrid>

    <p:commandButton id="btnSubmit" update="dataPanel messages" actionListener="#{zoneChargeManagedBean.insert}" icon="ui-icon-check" value="Save"/>
    <p:commandButton value="Reset" update="dataPanel" process="@this">
        <p:resetInput target="dataPanel" />
    </p:commandButton>
</p:panel>

The managed bean:

@Controller
@Scope("view")
public final class ZoneChargeManagedBean implements Serializable
{
    @Autowired
    private final transient ZoneChargeService zoneChargeService=null;
    private ZoneTable selectedZone;     //Getter and setter
    private List<Object[]>list;         //Getter and setter
    private boolean renderedDataPanel;  //Getter and setter

    public ZoneChargeManagedBean() {}

    public void ajaxListener() {
        if(this.selectedZone!=null){
            list=zoneChargeService.getZoneChargeList(this.selectedZone.getZoneId());
            renderedDataPanel=true;
        }
        else {
            renderedDataPanel=false;
        }
    }

    public void insert() {
        //Just do whatever is needed based on the list with new values which is retrieved when <p:commandButton> as shown in the given XHTML is clicked.

        if(selectedZone!=null&&zoneChargeService.addOrUpdate(list, selectedZone)) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Message Summary", "Message"));
        }
        else {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL, "Message Summary", "Message"));
        }
    }
}

The service method as in the ajaxListener() method returns a list of type of an array of objects - List<Object[]>.

public List<Object[]>getZoneChargeList(Long id) {
    return entityManager.createQuery("select w.weightId, w.weight, zc.charge from Weight w left join w.zoneChargeSet zc with zc.zoneTable.zoneId=:id order by w.weight").setParameter("id", id).getResultList();
}

I can't use the corresponding JPA criteria query which is intended because the with operator which doesn't seem to be supported by the JPA criteria API.

This method is invoked when an item from <p:selectOneMenu> is selected which is not covered in this question.



来源:https://stackoverflow.com/questions/17848112/how-to-retrieve-values-of-textboxes-in-jsf-managed-bean-which-are-generated-thro

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!