2012-10-15 55 views
1

我正在使用Spring 3.1。以弹簧形式显示ArrayList

我想在JSP中的弹簧形式显示对象的ArrayList。最后,我需要为每个对象设置一个复选框,以便用户可以选择一行,然后按下按钮以执行一些后端操作。但我无法使用Spring表单显示数据。我一直收到一个异常:

org.springframework.beans.NotReadablePropertyExcep tion:bean类[java.util.ArrayList]的无效属性'datafeed [0]:Bean属性'datafeeds [0]'不可读或有一个无效的getter方法:......“

这里是缩小代码:

<form:form method="post" commandName="datafeeds"> 
    <table> 
    <thead> 
     <tr> 
      <th>Name</th> 
      <th>State</th> 
     </tr> 
    <tbody> 
     <c:forEach items="${datafeeds}" var="datafeed" varStatus="vs"> 
      <tr> 
       <td><form:label path="datafeeds[${vs.index}].name/></td> 
       <td><form:label path="datafeeds[${vs.index}].state/></td> 
      </tr> 
     </c:forEach> 
    </tbody> 
    </table> 
</form> 

则控制器:

@Controller 
public class DataFeedController 
{ 
    @Autowired 
    SomeService service; 

    @RequestMapping(value="/datafeed") 
    public String showDataFeed(Model m) { 
     List<DataFeed> datafeeds = service.list(); 
     m.addAttribute("datafeeds", datafeeds); 
     return "datafeed"; 
    } 
} 

具体来说,我想我的问题,我s如何将commandName,forEach循环中的变量和Controller中的数据一起工作?任何人都可以使用上面的代码显示我吗?

回答

3

datafeedsArrayList。您使用datafeeds.get(index)访问元素,而不是[index]。使用方括号只适用于数组。这样做:

<c:forEach items="${datafeeds}" var="datafeed" varStatus="vs"> 
    <tr> 
     <td><form:label path="${datafeed.name}"/></td> 
     <td><form:label path="${datafeed.state}"/></td> 
    </tr> 
</c:forEach> 
+0

得到了进一步,但仍然得到一个例外。这一次,我碰到一个“bean类[java.util.ArrayList中]的无效属性‘MYNAME’:Bean属性‘MYNAME’不可读.....”在哪里“MYNAME”是$ {} datafeed.name实际值来自DB。 – wxkevin

+0

为了最终在这里的其他人的利益,这个答案是错误的。表单标签不能访问datafeed bean。 – TedTrippin

0

我能够使用this教程工作。基本上,你必须做出一个窗体类,其中包含您的数据Feed的列表:

public class DataFeedForm { 
    private List<DataFeed> dataFeeds; 

    public List<DataFeed> getDataFeeds() { 
     return dataFeeds; 
    } 

    public void setDataFeeds(List<DataFeed> dataFeeds) { 
     this.dataFeeds = dataFeeds; 
    } 
} 

而且这种形式的对象(充满数据传送专线)传递给您的观点:

@Controller 
public class DataFeedController 
{ 
    @Autowired 
    SomeService service; 

    @RequestMapping(value="/datafeed") 
    public String showDataFeed(Model m) { 
     List<DataFeed> datafeeds = service.list(); 
     DataFeedForm form = new DataFeedForm(); 
     form.setDataFeeds(datafeeds); 
     m.addAttribute("datafeedsForm", form); 
     return "datafeed"; 
    } 
} 

而且在目前的表单数据像这样的看法:

<form:form method="post" modelAttribute="datafeedsForm" commandName="datafeeds"> 
    <table> 
    <thead> 
     <tr> 
      <th>Name</th> 
      <th>State</th> 
     </tr> 
    <tbody> 
     <c:forEach items="${datafeedsForm.datafeeds}" var="datafeed" varStatus="vs"> 
      <tr> 
       <td><form:label path="datafeeds[${vs.index}].name"/></td> 
       <td><form:label path="datafeeds[${vs.index}].state"/></td> 
      </tr> 
     </c:forEach> 
    </tbody> 
    </table> 
</form>