5

私はすでにここでいくつかのアプローチを検索して見つけましたが、私のプロジェクトでそれらを機能させることができません。

オブジェクトのリストの編集ページを表示したいのですが、すべて一度に更新する必要があります。これを実現するためにモデル駆動型アーキテクチャのアプローチを使用していますが、正しく実行できません。リストとその値はいつでも表示および反復できますが、その値を変更することはできません。

これが私が現在行っていることです:

データベースにモデル「Teilzeitgrad」があります。これには、ゲッターとセッターのいくつかの単純な属性があります。

public class Teilzeitgrad {

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

    // ... getters and setters

}

私のアクションクラスでは、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レコードが各エントリの行とともに表示されます。しかし、フォームを送信すると、モデルのリストが表示されません。セッターsetTeilzeitgrads(List<Teilzeitgrad> teilzeitgrads)はまったく呼ばれていません。また、array-syntaxのリストにアクセスしようとしました。

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

しかし、これも機能しませんでした。

このケースを解決するための助けはありがたいです!前もって感謝します!

レンツォ

4

5 に答える 5

2

わかりました-これはリストインデックスの非常に基本的な実用的な例です。主な変更点は、モデルの作成を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>
于 2012-10-23T13:26:51.953 に答える
0

あなたはに値をmodel提出しています、あなたはあなたのリストにそれらを提出しなければなりませんteilzeitgrads

たとえば、http://www.dzone.com/tutorials/java/struts-2/struts-2-example/struts-2-model-driven-action-example-1.htmlを参照してください

更新
はどうですか name="teilzeitgrads[%{#rowStatus.index}].datumBis"

于 2012-10-23T11:24:46.887 に答える
0

このようなアプローチを試しましたか?

<s:iterator var="teilzeitgrad" value="teilzeitgrads" status="listStatus">
   <s:set name="paramName">teilzeitgrads[${ listStatus.index }].datumAb</s:set>
   <s:textfield name="%{#paramName}" value="%{#teilzeitgrad.datumAb}"/>
</s:iterator>
于 2012-10-23T11:42:53.910 に答える
0

構成が正しいと仮定すると、問題はおそらくインデックス作成の方法が原因です。使用するテキストフィールドの名前属性を変更してみてください

model[%{#rowStatus.index}].datumBis

OGNLにアクセス方法を整理させます。(FirefoxでFirebugを使用して、フォームを送信したときに実際に何が送信されているかを確認します)

于 2012-10-23T11:49:44.150 に答える
0

この問題にご協力いただきありがとうございます。あなたのヒントは最も役に立ちました。私はついにそれを立ち上げて、すべてを最初から書き直して実行しました。次のアクションクラスを使用して、モデルを編集できるようになりました。

public class TeilzeitgradEditAction implements ModelDriven<List<Teilzeitgrad>> {

List<Teilzeitgrad> teilzeitgrads;
private String tzgTypKey;
private Integer jahr;

public String execute() {
    return SUCCESS;
}

@Override
public List<Teilzeitgrad> getModel()
{
    if(teilzeitgrads == null) {
        teilzeitgrads = getTeilzeitgradListByTypAndJahr(tzgTypKey, jahr);
    }

    return teilzeitgrads;
}

public List<Teilzeitgrad> getTeilzeitgrads()
{
    return teilzeitgrads;
}

public void setTeilzeitgrads(List<Teilzeitgrad> teilzeitgrads)
{
    this.teilzeitgrads = teilzeitgrads;
}

    // getters and setters for local attributes
}

そしてこのJSPコード:

<ul:form action="auth/GroupAdmin/processEditDienstabschnittJahr">
<s:iterator var="teilzeitgrad" value="teilzeitgrads" status="listStatus">
<tr>
    <td>
        <s:date name="%{#teilzeitgrad.datumAb}" var="datumAb_DE" format="dd.MM.yyyy" />
        <s:textfield name="teilzeitgrads[%{#listStatus.index}].datumAb" value="%{#datumAb_DE}"/>
    </td>
</tr>
</s:iterator>
<s:submit style="width:24px; height:24px;" type="image" src="../../../res/24px/floppy-disk.png" value="Speichern"></s:submit>

協力してくれてありがとうございます!

乾杯、レンツォ

于 2012-10-23T13:22:37.690 に答える