我一直在研究这个问题。我读了 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
答案 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}