【问题标题】:how to bind data to list in spring form如何以春季形式将数据绑定到列表
【发布时间】:2015-10-08 12:20:53
【问题描述】:

我有一个带有支持对象的弹簧形式。表格是这样的-

<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 是 -

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 列表中插入许多landingPage 对象(具有自己的url 属性)。这意味着我可以有多个输入标签具有这样的 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 方法。如何解决它以及如何取多个值?

【问题讨论】:

    标签: java spring spring-mvc


    【解决方案1】:

    为了将列表模型属性绑定到多个输入字段,您需要呈现形式:

    <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 循环中...那我们该怎么做呢?
    【解决方案2】:

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

    【讨论】:

    • landingPageModels是一个列表而不是landingPageModels.landingPage,那我们怎么能这样写——landingPageModels.landingPage[0]?
    • 那么它将是 landingPageModels[0].landingPage.url 并遍历像 @shaleindra 建议的索引。
    • 更正了表达式。
    【解决方案3】:
    <c:forEach items="${campaignModel.landingPageModels}" var="landingPage">
       <sf:input path="landingPage.url" class="form- control" />
    </c:forEach>
    

    以上内容不适合您查看数据吗?要将它们放入控制器中,您可能必须在 HTML 中使用动态表格行概念,或者通过单击添加按钮并为每个单独的 LandingPage 条目添加到表单 bean 对象并返回。

    在我的情况下,Person 命令对象具有List&lt;Token&gt; 属性,为了绑定我们设计页面的令牌列表,如下面的屏幕截图所示,单击添加按钮点击控制器并添加每个令牌List&lt;Token&gt;并渲染回同一视图并在列表视图中显示添加的令牌,便于为Person添加多个令牌。

    【讨论】:

    • 那行不通,您将不得不使用 varStatus 来填充路径。它适用于显示不用于绑定回提交。
    • @M.Deinum 你能回答我的问题,我该如何解决这个问题。我从 6 天起就陷入了困境。
    • 我不想使用 for 循环......如何在没有 for 循环的情况下绑定列表元素中的数据?
    【解决方案4】:

    我不知道如何使用 spring form lib 输入,但如果你想使用简单的 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
    
    }
    

    【讨论】:

    • 那我怎样才能让它们进入控制器?
    • 在这样做之后它给了我这个错误 - HTTP 状态 500 - 请求处理失败;嵌套异常是 org.springframework.beans.InvalidPropertyException:bean 类 [com.mogae.AdTag.model.CampaignModel] 的无效属性“landingPageModels[0]”:属性路径“landingPageModels[0]”中的越界索引;嵌套异常是 java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    猜你喜欢
    • 2014-10-31
    • 2013-10-01
    • 1970-01-01
    • 2015-10-05
    • 2016-02-18
    • 2018-07-31
    • 2016-01-30
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多