JSP 如何在Struts2中处理表单上的索引属性按钮

jmo0nnb3  于 2023-05-11  发布在  其他
关注(0)|答案(2)|浏览(149)

我需要实现一个表,其中每行都有用户希望作为一个整体提交的可编辑信息,但每行上的按钮可以立即删除该行。因为我关心的是整个表单,而表单不能嵌套,所以接收按钮按下的动作可能必须将其作为索引属性处理,所以这就是我构建它的方式。
我目前正在做的是通过一个长索引。
我的JSP呈现以下HTML:

<input type="submit" value="Remove" name="removeButtons[## numbers go here ##]" />

在我的action类中,我公开并使用属性如下:

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,在方括号内放置或不放置引号,将方括号更改为圆括号...似乎什么都不管用。
我已经知道如何使用编号索引来实现它,并且我能够通过向每行添加数字索引值来实现它,但是,我想知道如何使用MapString键来实现它。
或者,有没有更好的方法来实现我想做的事情(在一个表单上任意多个按钮)?

8wtpewkr

8wtpewkr1#

如果你想在索引中使用引号,你需要这个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']"
使用params拦截器的模式"\\w+((\\['\\w+((\\s\\w+)|(\\.\\w+))*'\\]))*"acceptParamNames参数来克服硬编码模式,就像在this答案中所做的那样。

xfb7svmp

xfb7svmp2#

Roman提供的语法是正确的,但有一个警告,可能是一个bug。
在进一步的调试中,我将getRemoveButtons更改为

public Map<String, String> getRemoveButtons() {
    log.debug("Call to 'RemoveButtons'");
    return removeButtons;
}

我在使用Long时得到了适当的日志消息,但当我转换为Map时,我尝试过的任何语法都无法调用此函数,直到我发现字符串中白色破坏了功能。即“GN00501.013”不起作用,但“GN00501.013”起作用。我会在Struts2邮件列表中询问这是设计的还是其他一些与Struts无关的无法克服的问题。

相关问题