如何在Spring表单中将数据绑定到列表?

8
我有一个带有支持对象的Spring表单。该表单如下所示-
<sf:form cssClass="form-horizontal" commandName="campaignModel" method="post">
<sf:input path="campaign.name" class="form-control" /> 
<sf:input path="landingPageModels.landingPage.url" class="form-control" />
</sf:form>

模型类(表单备份对象)-

CampaignModel.java

public class CampaignModel { 
private Campaign campaign = new CampaignImpl();
private List<LandingPageModel> landingPageModels = new Arraylist<LandingPageModel>;
public Campaign getCampaign() {
    return campaign;
}
public void setCampaign(Campaign campaign) {
    this.campaign = campaign;
}
public List<LandingPageModel> getLandingPageModels() {
    return landingPageModels;
}
public void setLandingPageModels(List<LandingPageModel> landingPageModels) {
    this.landingPageModels = landingPageModels;
}

LandingPageModel.java is -

public class LandingPageModel {
private LandingPage landingPage = new LandingPageImpl();
private List<LandingPageParameterImpl> landingPageParameters = new ArrayList<LandingPageParameterImpl>();

public LandingPage getLandingPage() {
    return landingPage;
}
public void setLandingPage(LandingPage landingPage) {
    this.landingPage = landingPage;
}
public List<LandingPageParameterImpl> getLandingPageParameters() {
    return landingPageParameters;
}
public void setLandingPageParameters(List<LandingPageParameterImpl> landingPageParameters) {
    this.landingPageParameters = landingPageParameters;
} 
}

LandingPage.java 是一个:

public class LandingPageImpl extends EntityImpl implements LandingPage {

private String url;

public String getUrl() {
    return url;
}

public void setUrl(String url) {
    this.url = url;
} }

我希望能够在landingPageModels列表中插入许多具有自己url属性的landingPage对象。这意味着我可以有多个类似于以下的具有url属性的输入标签 -

<sf:input path="landingPageModels.landingPage.url" class="form-control" />
<sf:input path="landingPageModels.landingPage.url" class="form-control" />
<sf:input path="landingPageModels.landingPage.url" class="form-control" />

但是执行此代码时,Spring 给出错误提示,称 landingPageModels 的 landingPage 属性没有 getter 和 setter 方法。如何解决这个问题,并且如何获取多个类似的值?

4个回答

6
为了将列表模型属性绑定到多个输入字段,您需要在渲染的表单中添加以下内容:
<input type="text" name="landingPageModels[0].landingPage.url" class="form-control" />
<input type="text" name="landingPageModels[1].landingPage.url" class="form-control" />
<input type="text" name="landingPageModels[2].landingPage.url" class="form-control" />

这是通过以下方式实现的:

<c:forEach items="${campaignModel.landingPageModels}" varStatus="s">
    <sf:input path="landingPageModels[${s.index}].landingPage.url" class="form-control" />
</c:forEach>

在我的情况下,我需要动态地给出索引...不是在for循环中...那么我们该怎么做呢? - Amit Das

0
<c:forEach items="${campaignModel.landingPageModels}" var="landingPage">
   <sf:input path="landingPage.url" class="form- control" />
</c:forEach>

以上的方法无法让您查看数据吗?要在控制器中获取它们,您可能需要在HTML中使用动态表格行概念,或者对于每个单独的LandingPage条目,通过单击添加按钮将其添加到表单bean对象中并呈现回来。

在我的情况下,Person命令对象具有List<Token>属性,为了绑定令牌列表,我们已经设计了如下所示的页面,单击“添加”按钮会触发控制器并添加每个令牌List<Token>,然后呈现回相同的视图并在列表视图中显示添加的令牌,这有助于为Person添加多个令牌。

enter image description here


那样做行不通,你必须使用varStatus来填充路径。它适用于显示,但不适用于提交时的绑定。 - M. Deinum
@M.Deinum,请问您能回答我的问题吗?我已经卡在这个问题上6天了,该怎么解决呢? - Amit Das
我不想使用for循环...如何在不使用for循环的情况下绑定列表元素中的数据? - Amit Das

0
你所遇到的错误是正确的,因为landingPageModels是一个列表。 你需要使用索引访问,像这样landingPageModels[0].landingPage.url。 如果你有动态数量的输入/网址,那么你可以使用<c:forEach>来创建动态输入变量名。

landingPageModels是一个列表,而不是landingPageModels.landingPage,那么我们怎么能写成这样 - landingPageModels.landingPage[0]? - Amit Das
那么它将是 landingPageModels[0].landingPage.url,并像@shaleindra建议的那样遍历索引。 - Kafkaesque
更正了表达方式。 - Shailendra

-2

我不知道如何使用Spring表单库输入来完成它,但如果您想使用简单的HTML输入进行绑定,那么可以像这样绑定列表

Simple.jsp

<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
</head>
<body>

    <form:form method="post" action="save.html" modelAttribute="contactForm">
        <table>
        <tr>
            <th>First Name</th>
            <th>Last Name</th>
        </tr>
            <tr>
               <td><input name="contacts[0].firstname" /></td>
                <td><input name="contacts[0].lastname" /></td>
             </tr>
             <tr>   
                <td><input name="contacts[1].firstname" /></td>
                <td><input name="contacts[1].lastname" /></td>
             </tr>   

    </table>    
    <br/>   
    <input type="submit" value="Save" />

    </form:form>
    </body>
    </html>

@控制器:

@RequestMapping(value = "/save", method = RequestMethod.POST)
    public ModelAndView save(@ModelAttribute("contactForm") ContactForm contactForm) {

        List<Contact> contacts = contactForm.getContacts();

        if(null != contacts && contacts.size() > 0) {
            ContactController.contacts = contacts;
            for (Contact contact : contacts) {
                System.out.printf("%s \t %s \n", contact.getFirstname(), contact.getLastname());
            }
        }

        return new ModelAndView("show_contact", "contactForm", contactForm);
    }

ContactForm.java

import java.util.List;

public class ContactForm {

    private List<Contact> contacts;

    public List<Contact> getContacts() {
        return contacts;
    }

    public void setContacts(List<Contact> contacts) {
        this.contacts = contacts;
    }
}

Contact.java

public class Contact {
    private String firstname;
    private String lastname;
    private String email;
    private String phone;

    public Contact() {

    }
 //getters and setters

}

那么我该如何在控制器中获取它们? - Amit Das
1
翻译:执行后,它给了我这个错误 - HTTP状态500 - 请求处理失败;嵌套异常是org.springframework.beans.InvalidPropertyException:bean类[com.mogae.AdTag.model.CampaignModel]的属性'landingPageModels [0]'无效:在属性路径'landingPageModels [0]'中超出边界索引;嵌套异常是java.lang.IndexOutOfBoundsException:索引:0,大小:0。 - Amit Das

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