Struts 2将参数绑定到不使用索引的集合

时间:2015-08-31 20:25:04

标签: javascript java jsp struts2 ognl

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 个答案:

答案 0 :(得分:1)

好吧,因为

  1. 您正在使用Javascript操作页面
  2. 在添加/删除元素时检测/更新元素索引时遇到麻烦
  3. 最简单的解决方案是:

    1. 在操作它们时使用您喜欢的语法,例如myCollection[].myProperty
    2. 将它们转换为Struts 在预提交功能中所需的格式。
    3. 这样你在操作元素时就不必费心了,但最后只需要一次,当你可以通过名字或其他东西简单地循环它们时,通过指定正确的索引用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>

答案 1 :(得分:0)

您需要以某种方式识别某个属性属于哪个对象。索引是最简单的方法,因此您不能只删除它们。

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

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

E.g。

private List<String> myProperty;

可以在JSP w / o索引中引用:

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

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