我需要实现一个表,其中每一行都有可编辑的信息,用户希望整体提交这些信息,但每行上的按钮会立即删除该行。因为我关心整个表单并且表单不能嵌套,接收按钮的操作可能必须将其作为索引属性处理,以便我构建它的方式。
我目前正在做的是通过Long进行索引。
我的jsp呈现以下html:
<input type="submit" value="Remove" name="removeButtons[## numbers go here ##]" />
在我的动作课中,我正在暴露并使用这样的属性:
private Map<Long, String> removeButtons = new HashMap<Long, String>();
public Map<Long, String> getRemoveButtons() {
return removeButtons;
}
// Later when the action is called
for(Long button : removeButtons.keySet()) {
// this only ever returns nothing or the one button that was pressed
}
这对于数字指数非常适用。
我现在需要为另一个表再次执行此操作,但行使用String索引。将Long转换为String,将引号放在方括号内,将方括号更改为括号......似乎没有任何效果。
我已经知道如何使用编号索引,并且我能够通过向每行添加数字索引值来实现它,但是,我想知道如何使用它Map的String键。
或者,有没有更好的方法来实现我想要做的事情(单个表单上任意多个按钮)?
答案 0 :(得分:1)
如果要在索引中使用引号,则需要此getter。它允许String
使用Map
键,你应该在索引中使用引号让OGNL使用字符串值作为键并评估相应的getter。
private Map<String, String> removeButtons = new HashMap<>();
public Map<String, String> getRemoveButtons() {
return removeButtons;
}
例如
<s:hidden name="removeButtons['0']" />
^ ------ //the string key
<s:submit value="Remove" />
或使用字符串变量或操作的属性
<s:set var="idx" value="'0'"/>
^ ------ //the string key
<s:hidden name="removeButtons[%{#idx}]" />
<s:submit value="Remove" />
编辑:
谁知道您将使用非标准密钥来处理未通过默认接受模式的参数。您的参数名称为"removeButtons['GN 00501.013']"
。
使用"\\w+((\\['\\w+((\\s\\w+)|(\\.\\w+))*'\\]))*"
拦截器的acceptParamNames
模式params
参数来克服硬编码模式,就像在this回答中所做的那样。
答案 1 :(得分:0)
Roman提供的语法是正确的,但有一个警告,也许是一个错误。
在进一步调试中,我将getRemoveButtons更改为
public Map<String, String> getRemoveButtons() {
log.debug("Call to 'RemoveButtons'");
return removeButtons;
}
我在使用Long时得到了相应的日志消息,但是当我转换为Map时,我没有尝试过的语法会调用此函数,直到我发现字符串中的空格会破坏功能。即GN 00501.013&#39;不行,但是&#39; GN00501.013&#39;确实。如果这是设计或与Struts无关的其他一些无法克服的问题,我会查询Struts2邮件列表。