有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

javascript Struts 2将参数绑定到集合,而不使用索引

Struts版本:2.3.16.3

有没有一种方法可以在不指定索引的情况下填充对象列表?目前,我必须参考收藏,如下所示:

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

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

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

我正在使用JavaScript动态地添加和删除页面上的元素,使用JavaScript正确地建立索引是一件痛苦的事情。而是让后端按照元素在表单中出现的顺序添加到集合的末尾。类似于PHP处理它的方式

parameters interceptor的文档说,输入名称绑定到的实际上只是一个ognl表达式。我去了ognl docs,它说你可以像这样引用数组:

array["length"]

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


共 (2) 个答案

  1. # 1 楼答案

    嗯,自从

    1. 您正在使用Javascript操作页面
    2. 添加/删除元素时,检测/更新元素索引时遇到问题

    最简单的解决方案是:

    1. 在操作它们时使用您喜欢的语法,例如myCollection[].myProperty,和
    2. 在预提交功能中将它们转换为Struts所需的格式

    这样,在操作元素时,您就不必为索引操心了,只需在最后一次,您可以简单地按名称或其他方式循环它们,并通过指定正确的索引使用javascript更改它们的名称

    jQuery的一个启动示例:

    &13; 第13部分,;
    $(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>
    和#13;
    和#13;
  • # 2 楼答案

    您需要以某种方式确定某些属性属于哪个对象。索引是实现这一点的最简单方法,所以您不能仅仅删除它们

    有很多方法可以实现你想要的。请看Andrea的答案,了解使用javascript的一种可能的解决方案

    还可以将对象属性拉入简单列表,然后将其设置为“对象”

    例如

    private List<String> myProperty;
    

    可以在不带索引的JSP中引用:

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

    当然,若您有许多属性,您需要以某种方式在JSP中对它们进行同步,这样列表中的属性的顺序和大小对于每个属性都是一致的