Struts 2:如何处理表单上的索引属性按钮

时间:2014-08-04 23:50:25

标签: java regex jsp struts2 ognl

我需要实现一个表,其中每一行都有可编辑的信息,用户希望整体提交这些信息,但每行上的按钮会立即删除该行。因为我关心整个表单并且表单不能嵌套,接收按钮的操作可能必须将其作为索引属性处理,以便我构建它的方式。

我目前正在做的是通过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键。

或者,有没有更好的方法来实现我想要做的事情(单个表单上任意多个按钮)?

2 个答案:

答案 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回答中所做的那样。

Testing demo

答案 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邮件列表。