1

I am using Spring 3.1.

I am trying to display an ArrayList of objects in a Spring Form within a JSP. Eventually I need to have a checkbox for each object so that the user may select a row and then press a button for some back-end action. But I can't get the data to display using a Spring form. I keep receiving an exception:

org.springframework.beans.NotReadablePropertyExcep tion: Invalid property 'datafeed[0]' of bean class [java.util.ArrayList]: Bean property 'datafeeds[0]' is not readable or has an invalid getter method: .... "

Here is the scaled down code:

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

Then the Controller:

@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";
   }
}

Specifically I guess my question is how does commandName, the variables in the forEach loop and the data from the Controller all work together? Can anybody show me using the above code?

4

2 回答 2

3

datafeeds是一个ArrayList。您使用 访问元素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>
于 2012-10-15T12:00:31.283 回答
0

我能够使用本教程使其工作。基本上,您必须创建一个表单类,其中包含您的数据馈送列表:

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>
于 2015-05-02T11:45:46.970 回答