forms - 支柱 2 : updating a list of objects from a form with model driven architecture

标签 forms model struts2 populate

我已经在这里搜索并找到了几种方法,但我无法让它们为我的项目工作。

我想显示一个对象列表的编辑页面,这些对象应该立即更新。我使用模型驱动的架构方法来实现这一点,但我无法让它正常运行。我总是可以显示和迭代列表及其值,但我不能修改它的值。

所以这就是我目前正在做的事情:

我的数据库中有一个模型“Teilzeitgrad”,它有一些带有 getter 和 setter 的简单属性。

public class Teilzeitgrad {

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

    // ... getters and setters

}

在我的 Action-Class 中,我使用 Teilzeitgrad-Objects 列表实现了 ModelDriven 接口(interface)
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 映射定义如下:
<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 记录,每个条目都有一行。但是当我提交表单时,我的模型列表没有填充。二传手setTeilzeitgrads(List<Teilzeitgrad> teilzeitgrads)甚至根本没有被调用。
我还尝试访问数组语法中的列表:
<s:textfield style="width:70px;" name="teilzeitgrads[#rowStatus.index].datumAb" value="%{#datumAb_DE}" label="DatumAb"></s:textfield >
但这也没有用。

解决此案的任何帮助都将不胜感激!提前致谢!

伦佐

最佳答案

好的 - 这是列表索引的一个非常基本的工作示例。主要的变化是将模型的创建从 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>

关于forms - 支柱 2 : updating a list of objects from a form with model driven architecture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13028113/

相关文章:

R - 包含大量虚拟变量的模型

forms - JQuery 表单验证不适用于新创建的元素

php - 如何用php将表单数据提交到特定数据库,我的参数有什么问题?

forms - 如何在 Yii 中用一个表单连接两个表

php - Controller 方法和模型方法之间的胖模型和瘦 Controller 设计混淆

java - 在 Struts 2 中使用 WebSocket API

java - 什么是 Java (Struts2) 中的 Masterpage 等价物

java - 使用 param 标签抑制空参数

forms - Spring MVC 表单 :checkbox not working

forms - 不显示表单默认值