【问题标题】:Struts 2 Form Bind Parameters To Collection Without Using IndexStruts 2 Form 将参数绑定到集合而不使用索引
【发布时间】:2015-11-25 23:15:38
【问题描述】:

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"]

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

【问题讨论】:

  • array["length"] 这将是数组中的下一个元素 - 这是不正确的。在您的操作类中创建字符串列表变量并在 jsp 中像 name="list" 那样引用它。
  • 为什么不指定参数名绑定的集合中的索引?
  • @RomanC 在处理从页面上动态删除元素的页面时会变得很痛苦。我通常使用表格数据执行此操作,用户可以从表格中添加/删除行。当他们删除该行时,您最终会在索引中出现一个间隙,从而在集合中的该位置生成一个空值。它要么需要用 JavaScript 解决,要么从控制器中的列表中删除空值,或者在处理列表时在控制器中放置一个 if null 继续。如果无法处理此问题,则通过修改参数拦截器似乎应该有一个更简单的解决方案。
  • 您不能简单地删除索引,因为这是确定某个属性属于哪个对象的唯一方法。
  • @AleksandrM 是的,你说得对,我不知道我为什么不这么想。它不知道何时跳转到下一个索引。您必须发送一些其他特殊参数来告诉它转到下一个索引。你的问题是我问题的直接答案。如果您想将其发布为答案,我会接受。

标签: javascript java jsp struts2 ognl


【解决方案1】:

好吧,因为

  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>

【讨论】:

  • 谢谢,我以前做过类似的事情。希望一起避免索引。
  • 如果可能的话,就不用担心了
  • 对于任何想添加索引的人来说,这都是一个有效的解决方案,但这不是我想要的信息。我已经在管理索引,我正在寻找一种方法来避免索引。
  • 好的,谢谢。如果你找到了办法,记得回来回答你自己的问题......祝你好运:)
【解决方案2】:

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

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

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

例如

private List<String> myProperty;

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 2010-10-06
    • 2012-11-09
    • 2012-06-01
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    相关资源
    最近更新 更多