0

我已经研究了一段时间。我已经阅读 了如何使用 Struts2 更新 JSP 上显示的列表的内容? 它非常接近我的需要,但我仍然无法解决我的问题。

我有一个 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。

如何指定文本字段中的数据应该更新我的 Set 的成员?

这可能吗?

更新

这是我最新的(简化的)尝试,主要基于我在类型转换文档中阅读的内容。

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

动作类:

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。

最终静态地图将成为一个问题。它应该是一个实例属性(或者,我想是 a ThreadLocal,但 IMO 你很难证明这一点)。

此时您应该不需要类型转换文件;这在很大程度上是一个遗留工件。你也应该看到一个关于找不到AssetId类的异常。

如果我在提交方法中记录资产映射,一旦处理完这些事情,我就会看到:

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