我已经搜索并在这里找到了几种方法,但我不能让他们为我的项目工作.
我想显示一个对象列表的编辑页面,这些页面应该一次更新.我使用模型驱动的体系结构方法来实现这一点,但我无法使其正常运行.我总是可以显示和迭代列表及其值,但我不能修改它的值.
所以这就是我目前正在做的事情:
我的数据库中有一个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>