Struts 2:使用模型驱动架构更新表单中的对象列表 [英] Struts 2: updating a list of objects from a form with model driven architecture

查看:185
本文介绍了Struts 2:使用模型驱动架构更新表单中的对象列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



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



所以这里是我现在正在做的:



我在我的数据库中有一个Model'Teilzeitgrad',它有一些简单的getters和setter属性。

  public class Teilzeitgrad {

private date datumAb;
私人日期datumBis;
私人双重betrag;

// ...获得者和设置者

}

在我的Action-Class中,我实现了带有一个Teilzeitgrad对象列表的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()抛出异常
{
// TODO自动生成的方法存根
}

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中的动作映射

 < action name =* / auth / GroupAdmin / processEditDienstabschnittJahrmethod =executeclass =org.hocon.ul.portal.action.DienstabschnittViewJahrAction> 
< result name =successtype =redirect> $ {referer}< / result>
< / action>

在我的JSP文件中,我迭代模型对象,在文本字段或列表中显示其值,如下所示:

 < ul:form action =auth / GroupAdmin / processEditDienstabschnittJahr> 

< tr>
< td style =text-align:center;>
< / td>

< td style =text-align:center;>
< / td>

< td class =currency>
< s:set var =tzgBetrag>
< fmt:formatNumber type =NUMBERmaxFractionDigits =0>< s:property value =%{getBetrag()* 100}< / s:property>< FMT:formatNumber>
< / s:set>
< / td>
< / tr>

< / s:iterator>
< s:submit style =width:24px; height:24px; type =imagesrc =../../../ res / 24px / floppy-disk.pngvalue =Speichern>< / s:submit>
< / ul:表格>

ul-tag来自自定义taglib,它将客户特定的url参数添加到操作路径。

所以,当我显示页面时,它会显示我所有的Teilzeitgrad记录,每个记录都有一行。但是当我提交表单时,我的模型列表未被填充。 setter setTeilzeitgrads(List teilzeitgrads)根本就没有被调用。
我也尝试访问数组语法中的列表:



< s:textfield style =width:70px; name =teilzeitgrads [#rowStatus.index] .datumAbvalue =%{#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>值;

@Override
public List< ValuePair> getModel(){

返回值;



public String execute(){

(ValuePair value:values){
System.out.println(value .getValue1()+:+ value.getValue2());
}

返回SUCCESS;


$ b $ public void prepare(){
values = new ArrayList< ValuePair>();
values.add(new ValuePair(chalk,cheese));
values.add(new ValuePair(orange,apple));
}


公共类ValuePair {

私有字符串值1;
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;



code
$ b $ p $和相应的jsp

$ b

p>

 <%@ taglib prefix =suri =/ struts-tags%> 
< html>
< head>


< / head>
< body>


< table>
< tr>
< td>< s:textfield name =model [%{#rowStatus.index}] .value1value =%{model [#rowStatus.index] .value1}/>< / TD>
< td>< s:textfield name =model [%{#rowStatus.index}] .value2value =%{model [#rowStatus.index] .value2}/>< / TD>
< / tr>
< / s:iterator>
< / table>
< s:submit />
< / s:form>
< / body>
< / html>


I already searched and found several approaches here, but I can't get them working for my project.

I want to show an edit page for a list of objects, which should all be updated at once. I use the model driven architecture approach to achieve this, but I can't get it running properly. I can always display and iterate the list and its values, but I can't modify its values.

So here is what I'm currently doing:

I have a Model 'Teilzeitgrad' in my database, which has some simple attributes with getters and setters.

public class Teilzeitgrad {

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

    // ... getters and setters

}

In my Action-Class I implement the ModelDriven Interface with a List of Teilzeitgrad-Objects

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;
    }
}

The action mapping in struts.xml is defined as follows:

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

In my JSP File I'm iterating the model object, displaying its values in textfields or lists as follows:

<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>

The ul-tag is from a custom taglib, which adds a customer specific url parameter to action path.

So when I display the page it shows all my Teilzeitgrad-records with a row for each entry. But when I submit the form, the list of my models is not populated. The setter setTeilzeitgrads(List<Teilzeitgrad> teilzeitgrads) is not even called at all. I also tried to access the list in array-syntax:

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

but this did also not work.

Any help solving this case is apreciated! Thanks in advance!

Lenzo

解决方案

Ok - here is a very basic working example of list indexing. The main change is to move the creation of the model from getModel() to prepare(). This is because getModel() is called for every value you need to set the list - so you end up re-creating your model each time overwriting the previous change.

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;
    }
}
}

and the corresponding 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>

这篇关于Struts 2:使用模型驱动架构更新表单中的对象列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆