我已经搜索并在这里找到了几种方法,但我不能让他们为我的项目工作.
我想显示一个对象列表的编辑页面,这些页面应该一次更新.我使用模型驱动的体系结构方法来实现这一点,但我无法使其正常运行.我总是可以显示和迭代列表及其值,但我不能修改它的值.
所以这就是我目前正在做的事情:
我的数据库中有一个Model’Teilzeitgrad’,它有一些带getter和setter的简单属性.
public class Teilzeitgrad { private Date datumAb; private Date datumBis; private double betrag; // ... getters and setters }
在我的Action-Class中,我使用Teilzeitgrad-Objects列表实现了ModelDriven接口
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; } }
struts.xml中的操作映射定义如下:
<action name="*/auth/GroupAdmin/processEditDienstabschnittJahr" method="execute" class="org.hocon.ul.portal.action.DienstabschnittViewJahrAction"> <result name="success" type="redirect">${referer}</result> </action>
在我的JSP文件中,我正在迭代模型对象,在文本字段或列表中显示其值,如下所示:
<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>
ul-tag来自自定义taglib,它将特定于客户的url参数添加到操作路径.
因此,当我显示页面时,它会显示我的所有Teilzeitgrad记录,每个条目都有一行.但是当我提交表单时,我的模型列表没有填充.甚至根本没有调用setter setTeilzeitgrads(List< Teilzeitgrad> teilzeitgrads).
我还尝试访问array-Syntax中的列表:
< s:textfield style =“width:70px;” name =“teilzeitgrads [#rowStatus.index] .datumAb”value =“%{#datumAb_DE}”label =“DatumAb”>< / s:textfield>
但这也行不通.
解决这个案子的任何帮助都是折旧的!提前致谢!
Lenzo
解决方法
好的 – 这是列表索引的一个非常基本的工作示例.主要的变化是将模型的创建从getModel()移动到prepare().这是因为为设置列表所需的每个值都会调用getModel() – 因此,每次覆盖以前的更改时,最终都会重新创建模型.
package com.blackBox.x.actions; import java.util.ArrayList; import java.util.List; import com.blackBox.x.actions.ListDemo.ValuePair; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; import com.opensymphony.xwork2.Preparable; public class ListDemo extends ActionSupport implements ModelDriven<List<ValuePair>>,Preparable { private List<ValuePair> values; @Override public List<ValuePair> getModel() { return values; } public String execute() { for (ValuePair value: values) { System.out.println(value.getValue1() + ":" + value.getValue2()); } return SUCCESS; } public void prepare() { values = new ArrayList<ValuePair>(); values.add(new ValuePair("chalk","cheese")); values.add(new ValuePair("orange","apple")); } public class ValuePair { private String value1; private String value2; public ValuePair(String value1,String value2) { this.value1 = value1; this.value2 = value2; } public String getValue1() { return value1; } public void setValue1(String value1) { this.value1 = value1; } public String getValue2() { return value2; } public void setValue2(String value2) { this.value2 = value2; } } }
和相应的jsp
<%@ taglib prefix="s" uri="/struts-tags" %> <html> <head> </head> <body> <s:form action="list-demo" theme="simple"> <table> <s:iterator value="model" status="rowStatus"> <tr> <td><s:textfield name="model[%{#rowStatus.index}].value1" value="%{model[#rowStatus.index].value1}"/></td> <td><s:textfield name="model[%{#rowStatus.index}].value2" value="%{model[#rowStatus.index].value2}"/></td> </tr> </s:iterator> </table> <s:submit/> </s:form> </body> </html>