Struts2 - 如何更新表单中的集合

时间:2012-06-20 17:25:02

标签: jsp struts2

我一直在研究这个问题。我读了 How to update a the contents of a list displayed on JSP using Struts2? 它非常接近我所需要的,但我仍然无法解决我的问题。

我有一个java.util.Set对象。该类是“事件”,该集的名称是“事件”。我想在JSP中提供一个表单,允许用户修改Event对象的属性,但我想一次更新多个。这是我的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>

我的问题是(我认为)需要以texfield的名义去更新我的Set。

如何指定textfield中的数据应该更新我的Set的成员?

这可能吗?

更新

这是我最近的(简化)尝试,主要基于我在type conversion docs中阅读的内容。

表单已正确填充,但在提交时未捕获在文本字段中输入的更改。

动作类:

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

1 个答案:

答案 0 :(得分: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}