Struts 2: atualizando uma lista de objetos de um formulário com arquitetura orientada a modelos
Eu já pesquisei e encontrei várias abordagens aqui, mas não consigo trabalhar no meu projeto.
Eu quero mostrar uma página de edição para uma lista de objetos, que devem ser todos atualizados de uma só vez. Eu uso a abordagem de arquitetura baseada em modelo para conseguir isso, mas não consigo executá-la corretamente. Eu sempre posso exibir e iterar a lista e seus valores, mas não posso modificar seus valores.
Então, aqui está o que eu estou fazendo atualmente:
Eu tenho um modelo 'Teilzeitgrad' no meu banco de dados, que tem alguns atributos simples com getters e setters.
public class Teilzeitgrad {
private Date datumAb;
private Date datumBis;
private double betrag;
// ... getters and setters
}
Na minha classe de ação eu implementar a interface ModelDriven com uma lista de objetos 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;
}
}
O mapeamento de ação emstruts.xml
é definido da seguinte forma:
<action name="*/auth/GroupAdmin/processEditDienstabschnittJahr" method="execute" class="org.hocon.ul.portal.action.DienstabschnittViewJahrAction">
<result name="success" type="redirect">${referer}</result>
</action>
No meu arquivo JSP estou iterando o objeto de modelo, exibindo seus valores em campos de texto ou listas da seguinte forma:
<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>
A tag ul é de um taglib personalizado, que adiciona um parâmetro de URL específico do cliente ao caminho de ação.
Então, quando eu exibir a página, ele mostra todos os meus registros do Teilzeitgrad com uma linha para cada entrada. Mas quando eu envio o formulário, a lista dos meus modelos não é preenchida. O settersetTeilzeitgrads(List<Teilzeitgrad> teilzeitgrads)
nem sequer é chamado. Eu também tentei acessar a lista na sintaxe de array:
<s:textfield style="width:70px;" name="teilzeitgrads[#rowStatus.index].datumAb" value="%{#datumAb_DE}" label="DatumAb"></s:textfield >
mas isso também não funcionou.
Qualquer ajuda para resolver este caso é apreciada! Desde já, obrigado!
Lenzo