Struts 2: aktualizacja listy obiektów z formularza za pomocą architektury opartej na modelu

Szukałem już i znalazłem kilka podejść tutaj, ale nie mogę ich zmusić do pracy nad moim projektem.

Chcę wyświetlić stronę edycji listy obiektów, które powinny zostać zaktualizowane jednocześnie. Aby to osiągnąć, używam podejścia opartego na architekturze opartej na modelu, ale nie mogę go poprawnie uruchomić. Zawsze mogę wyświetlać i iterować listę i jej wartości, ale nie mogę modyfikować jej wartości.

Oto co aktualnie robię:

W mojej bazie danych mam model „Teilzeitgrad”, który ma kilka prostych atrybutów z getterami i setterami.

public class Teilzeitgrad {

    private Date datumAb;
    private Date datumBis;
    private double betrag;

    // ... getters and setters

}

W mojej Action-Class implementuję interfejs ModelDriven z listą obiektów Teilzeitgrad

public class DienstabschnittViewJahrAction implements ModelDriven<List<Teilzeitgrad>>, Preparable
{
    List<Teilzeitgrad> teilzeitgrads;
    private String tzgTypKey;
    private Integer jahrIndex;

    public String execute() {
        return SUCCESS;
    }

    public List<Teilzeitgrad> getModel()
    {
        if(teilzeitgrads == null) {
            teilzeitgrads = getTeilzeitgradListByTypAndJahr(getTzgTypKey(), getJahrIndex());
        }
        return teilzeitgrads;
    }

    public List<Teilzeitgrad> getTeilzeitgrads()
    {
        return teilzeitgrads;
    }

    public void setTeilzeitgrads(List<Teilzeitgrad> teilzeitgrads)
    {
        this.teilzeitgrads = teilzeitgrads;
    }

    @Override
    public void prepare() throws Exception
    {
        // TODO Auto-generated method stub  
    }

    public String getTzgTypKey()
    {
        return tzgTypKey;
    }

    public void setTzgTypKey(String tzgTypKey)
    {
        this.tzgTypKey = tzgTypKey;
    }

    public Integer getJahrIndex()
    {
        return jahrIndex;
    }

    public void setJahrIndex(Integer jahrIndex)
    {
        this.jahrIndex = jahrIndex;
    }
}

Mapowanie akcji wstruts.xml jest zdefiniowany następująco:

<action name="*/auth/GroupAdmin/processEditDienstabschnittJahr" method="execute" class="org.hocon.ul.portal.action.DienstabschnittViewJahrAction">
    <result name="success" type="redirect">${referer}</result>
</action>

W moim pliku JSP wykonuję iterację obiektu modelu, wyświetlając jego wartości w polach tekstowych lub listach w następujący sposób:

<ul:form action="auth/GroupAdmin/processEditDienstabschnittJahr">
<s:iterator value="model" status="rowStatus">

<tr>
    <td style="text-align: center;">
        <s:date name="model.get(#rowStatus.index).datumAb" var="datumAb_DE" format="dd.MM.yyyy" />
        <s:textfield style="width:70px;" name="model.get(#rowStatus.index).datumAb" value="%{#datumAb_DE}" label="DatumAb"></s:textfield >
    </td>

    <td style="text-align:center;">
        <s:date name="model.get(#rowStatus.index).datumBis" var="datumBis_DE" format="dd.MM.yyyy" />
        <s:textfield style="width:70px;" name="model.get(#rowStatus.index).datumBis" value="%{#datumBis_DE}" label="DatumBis"></s:textfield >
    </td>

    <td class="currency">
        <s:set var="tzgBetrag">
            <fmt:formatNumber type="NUMBER" maxFractionDigits="0"><s:property value="%{getBetrag()*100}"></s:property></fmt:formatNumber>
        </s:set>
        <s:textfield style="width:30px;" maxlength="3" name="model.get(#rowStatus.index).betrag" value="%{#tzgBetrag}" label="Betrag"></s:textfield >
    </td>
</tr>

</s:iterator>
<s:submit style="width:24px; height:24px;" type="image" src="../../../res/24px/floppy-disk.png" value="Speichern"></s:submit>
</ul:form>

Znacznik ul pochodzi z niestandardowego taglib, który dodaje parametr url specyficzny dla klienta do ścieżki akcji.

Więc kiedy wyświetlam stronę, pokazuje wszystkie moje rekordy Teilzeitgrad z wierszem dla każdego wpisu. Ale kiedy przesyłam formularz, lista moich modeli nie jest wypełniana. SetersetTeilzeitgrads(List<Teilzeitgrad> teilzeitgrads) nie jest nawet w ogóle wywoływany. Próbowałem też uzyskać dostęp do listy w składni tablicowej:

<s:textfield style="width:70px;" name="teilzeitgrads[#rowStatus.index].datumAb" value="%{#datumAb_DE}" label="DatumAb"></s:textfield >

ale to też nie zadziałało.

Każda pomoc w rozwiązaniu tego przypadku jest doceniana! Z góry dziękuję!

Lenzo

questionAnswers(5)

yourAnswerToTheQuestion