struts2形式绑定参数到集合而不使用索引

Struts 2 Form Bind Parameters To Collection Without Using Index

本文关键字:索引 集合 绑定 参数 struts2      更新时间:2023-09-26

Struts版本:2.3.16.3

是否有一种方法可以填充对象列表而不必指定索引?目前,我必须像这样引用集合:

<input name="myCollection[0].myProperty" value="some value" />

我真的很想做这样的事情:

<input name="myCollection[].myProperty" value="some value" />

我正在用JavaScript动态地添加和删除页面上的元素,并且使用JavaScript获得正确的索引是一种痛苦。而是让后端按照元素从表单中出现的顺序添加到集合的末尾。与PHP的处理方式类似。

参数拦截器的文档说它实际上只是一个输入名称绑定到的ognl表达式。我去了ognl文档里面说你可以这样引用数组

array["length"]

,即数组中的下一个元素。参数拦截器发出拒绝此参数名称的消息。我真的很想找到一种方法来实现这一点,即使这意味着扩展参数拦截器。

既然

  1. 你正在用Javascript操作页面
  2. 你在添加/删除元素时检测/更新元素索引有问题

最简单的解决方案是:

  1. 在操作它们时使用您喜欢的语法,例如myCollection[].myProperty
  2. 将它们转换成Struts 在预提交函数中所需的形式。

这样在操作元素的时候就不需要担心索引了,只需要一次,在最后,你可以简单地通过名称或其他方式循环它们,并通过分配正确的索引来使用javascript更改它们的名称。

jQuery的启动示例:

$(function() {
  $('#myform').submit(function() {
    $('[name^="myCollection[]"]').each(function(index) {
      var oldV = this.name;
      var newV = oldV.replace("myCollection[]", "myCollection[" + index + "]");
      console.log("was: " + oldV + " - now is: " + newV);
      this.name = newV;
    });
    return false;
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<form id="myform">
  Open Javascript Console, then press submit, then inspect input elements
  <br>
  <input name="myCollection[].myProperty" />
  <br>
  <input name="myCollection[].myProperty" />
  <br>
  <input name="myCollection[].myProperty" />
  <br>
  <input name="myCollection[].myProperty" />
  <br>
  <input name="myCollection[].myProperty" />
  <br>
  <button>submit</button>
</form>

您需要以某种方式确定某个属性属于哪个对象。索引是最简单的方法,所以不能直接删除它们。

有很多方法可以达到你想要的。看看Andrea对使用javascript的一种可能解决方案的回答。

您还可以将对象属性拉到简单列表中,然后将它们设置为对象。

private List<String> myProperty;

可以在没有索引的JSP中引用:

<input name="myProperty" value="first value" />
<input name="myProperty" value="second value" />

当然,如果你有许多属性,你需要在JSP中以某种方式同步它们,以使列表中属性的顺序和大小与每个属性保持一致。