如何在Spring MVC中将对象绑定到命令对象的列表集合中

4
我的命令对象有一个对象列表。我想将文本字段绑定到该列表中的对象的属性。在Spring MVC中是否可以实现?
命令对象类
public class SubDevisonDto {

private String devId;
private List subDevisions;

列表中提到的Subdevision对象类

public class SubDivison implements Serializable{

private String subDivisonName;
private String createdBy;
private String createdDate;
private String developerID;
private List users;

我希望文本框可以设置subDivisonName字段的值。

我已经像这样编写了Spring MVC标签。

<spring:bind path="subdivisondto.subDevisions[0].subDivisonName">
    <span class="formw">
        <input name="subDivisonName" type="text" style="width:350px;" />
    </span>
</spring:bind>

仅供测试目的,我将其设置为0。如果它有效,我可以将其变成一个变量。我的要求是,我应该让用户动态添加子分区对象。因此,最初在页面加载时,我只会显示一个文本框。我将为他提供一个按钮,如果他想添加更多,则可以添加。当他点击添加按钮时,我将动态生成文本框。之后,我必须使用列表提交表单。

这个JSP代码给了我一个错误。它说:

org.springframework.beans.NullValueInNestedPathException

有没有办法在JSP代码中实现这个?


http://eggsylife.co.uk/2009/11/30/spring-forms-dynamic-lists-and-ajax/ - NimChimpsky
这个链接看起来很有用。我会去看一下的。非常感谢。 - Nazneen
2个回答

2
我找到了我的问题的答案。但是,它并不是我所需的解决方案,因为我需要实现动态列表。但是我找到了这个问题的解决方案。
据我理解,第一次我们必须从后端发送数据来绑定输入元素。我没有找到一种不发送列表数据就可以绑定表单元素的方法。但是当我们发送数据并绑定元素时,我们可以从这些元素中获取输入。因此,我认为在这种情况下绑定元素需要首先发送数据。如果我的说法有误,请纠正我。因为这对我来说将是更好的解决方案。
我们需要使用惰性列表,jsp代码需要进行一些修改。
您的命令类对象应按下面所述创建。
import org.apache.commons.collections.list.LazyList;
import org.apache.commons.collections.FactoryUtils;



public class SubDevisonDto {

    private String devId;

    private List subDevisions = 
        LazyList.decorate(
          new ArrayList(),
          FactoryUtils.instantiateFactory(SubDivison.class));

JSP代码应该如下所示。
<c:forEach items="${subs.subDevisions}" var="obj" varStatus="gridRow"> 

绑定输入框元素的文本

<spring:bind path="subdivisondto.subDevisions[${gridRow.index}].subDivisonName">
      <span class="formw"><input name="<c:out value="${status.expression}"/>" type="text"  style="width:350px;" />

绑定一个输入元素复选框。此输入元素生成一个列表。
<spring:bind path="subs.subDevisions[${gridRow.index}].users">
              <c:forEach items="${obj.users}" var="dependenttwo" varStatus="dependentRowtwo">
                <li>
                  <input name="<c:out value="${status.expression}"/>" type="checkbox" class="users" value="<c:out value="${dependenttwo}"/>"/>
                  <c:out value="${dependenttwo}"/>
                </li>
                </c:forEach>
                </spring:bind>

`subs` is a map key name. the value for this key `subs` is a list of my DTO objects which named as `SubDevisonDto `

这段代码对我来说很好用。感谢提供的支持。

1

In dto :

private List<SubDivision> SubDivisions =  new AutoPopulatingList<SubDivision>(new SubDivisionFactory());

而工厂将会是这样的:

public class SubDivisionFactory implements AutoPopulatingList.ElementFactory<SubDivision> {

    public String createElement(int index) {
        SubDivision subDivision = new SubDivision();
        return subDivision;
    }
}

使用Spring的AutopopulatingList,你的JSP将保持不变,你可以迭代任意数量的列表。


我正在使用Spring 1.2.x版本。这个版本中没有AutopopulatingList。所以,看起来我不能使用这个解决方案。非常感谢您的支持。非常感激。我尝试了使用LazyList,并在JSP中进行了一些修改。但是还没有成功。仍然出现相同的错误。谢谢。 - Nazneen
@Nazneen,您需要自行实现或升级。 - NimChimpsky
是的。这似乎很难做到。非常感谢您的支持。我会努力寻找解决方案。 - Nazneen
我找到了我的问题的答案。但是,它并不是我需求的解决方案,因为我需要实现一个动态列表。不过,我已经找到了这个问题的解决方案。 - Nazneen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接