0

私はしばらくこれを研究してきました。Struts2を使用してJSPに表示されたリストの内容を更新する方法を読みまし たか? それは私が必要とするものに非常に近いですが、私はまだ問題を解決することができません.

オブジェクトの java.util.Set があります。クラスは「Event」で、セットの名前は「events」です。ユーザーが Event オブジェクトの属性を変更できるフォームを JSP で表示したいのですが、一度に複数のオブジェクトを更新したいと考えています。これが私のJSPスニペットです:

<s:form theme="simple">
  <table>
    <s:iterator value="events" var="ev">
    <tr>
      <td> <s:textfield name="?????" value="%{#ev.price}" </td>
      <td> <s:textfield name="?????" value="%{#ev.amount}" </td>
     </tr>
     </s:iterator>
     <tr><td colspan="2">
       <s:submit value="Apply" action="EditEventsAction_save" ></s:submit>
     </td></tr>
  </table>
</s:form>

私の問題は、セットを更新するためにテックスフィールドの名前に何が必要かということです。

テキストフィールドのデータがセットのメンバーを更新するように指定するにはどうすればよいですか?

これは可能ですか?

アップデート

これは私の最新の (簡略化された) 試みであり、主に型変換ドキュメントで読んだ内容に基づいています。

フォームは正しく入力されていますが、テキストフィールドに入力された変更は送信時にキャプチャされません。

アクション クラス:

public class TestAction extends ActionSupport implements Preparable {

    private static HashMap<Integer, AssetId> assetMap = new HashMap<Integer, AssetId>();

    public String execute () {
        return SUCCESS;
    }   

    public void prepare() throws Exception {
        AssetId a1 = new AssetId(1, "Asset 1");
        AssetId a2 = new AssetId(2, "Asset 2");
        AssetId a3 = new AssetId(3, "Asset 3");
        assetMap.put(1, a1);
        assetMap.put(2, a2);
        assetMap.put(3, a3);
    }

    public String save () {
        return SUCCESS;
    }

    public static HashMap<Integer, AssetId> getAssetMap() {
        return assetMap;
    }

    public static void setAssetMap(HashMap<Integer, AssetId> assetMap) {
        TestAction.assetMap = assetMap;
    }
}

JSP:

<%@ taglib uri="/struts-tags" prefix="s" %>

<html>
  <body>      
    <s:form theme="simple">
      <table>
        <s:iterator value="assetMap" var="asset">
          <tr>
            <td><s:textfield name="assetMap[key].clientId"  /></td>
          </tr>
        </s:iterator>
        <tr><td colspan="2"><s:submit value="Apply!" action="TestAction_save" /></td></tr>
      </table>
    </s:form>
  </body>
</html>

AssetIdクラス:

public class AssetId implements java.io.Serializable {
    private int assetId;
    private String clientId;
    // And public getters/setters
}

TestAction-conversion.properties

Key_assetMap=java.lang.Integer
Element_assetMap=AssetId
CreateIfNull_assetMap=false
4

1 に答える 1

1

いくつかの問題があります。ログ ファイルにスタック トレースが表示されているはずです。

最も重要なのは、レンダリングされた HTML をチェックしていないことです。もしそうなら、評価されていないkeyままのレンダリングを見たことでしょう。ドキュメントにはOGNLエスケープが示されていますが、私のせいです(コメントは不完全でした)。

<s:textfield name="assetMap[%{key}].clientId" />

現在の反復オブジェクトのを評価しようとしているので、keyそれを OGNL エスケープ シーケンスでラップする必要があります。残りは評価したくありません。これは以下をレンダリングします:

<input type="text" name="assetMap[1].clientId" value="foo" id="map_save_assetMap_1__clientId"/>

レンダリングされた HTML を常に確認してください。

最終的には静的マップが問題になります。それはインスタンス プロパティである必要があります (または、私は と思いThreadLocalますが、IMO ではそれを正当化するのに苦労するでしょう)。

この時点では型変換ファイルは必要ありません。それは主にレガシーアーティファクトです。AssetIdクラスが見つからないという例外も表示されているはずです。

サブミット メソッドでアセット マップをログに記録すると、これらの処理が完了したら、次のように表示されます。

{1=foo.AssetId@502c06b2, 2=foo.AssetId@7a6bb93c, 3=foo.AssetId@364e50ee}
于 2012-06-22T00:34:46.793 に答える