-2

次のように、ループを介してテキストボックスを生成する必要があります。

<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>

指定されたテキストボックスの値はBigDecimal、データベースからのタイプです。

指定されたコマンド ボタンが押されると、これらのテキスト ボックスに保持されている値は、データベースに挿入または更新できるように、対応する JSF マネージド Bean から取得する必要があります。

java.util.List特定のボタンが押されたときに、何らかのコレクション ( など) でこれらすべてのテキスト フィールドの値を一度に取得できれば、さらに良いでしょう。

4

1 に答える 1

1

<ui:repeate>、レンダリング時間タグは正しく機能しますが<c:foreEach>、ビュービルド時間コンポーネントは機能しません(理由はわかりません)が、この特定のケースでは、<p:dataGrid>より適切であることがわかりました。それに応じて、XHTML は次のように変更されました。

<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>

マネージド 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"));
        }
    }
}

メソッドのようなサービス メソッドはajaxListener()、オブジェクトの配列のタイプのリストを返します - 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();
}

with演算子が JPA 基準 API でサポートされていないように見えるため、意図された対応する JPA 基準クエリを使用できません。

<p:selectOneMenu>このメソッドは、この質問でカバーされていないアイテムが選択されたときに呼び出されます。

于 2013-07-25T14:11:10.307 に答える