2016-07-19 5 views
0

Ich habe einen Controller, der zur DB geht und eine Liste von Büchern bekommt. Ich möchte @ModelAttribute verwenden, um einzelne Bücher in separater Form anzuzeigen, damit ich für jeden Artikel schnelle Änderungen vornehmen kann.Spring-MVC @modelAttribute Wie man eine Objektliste sendet, um sie in einem separaten Formular anzuzeigen und ein Objekt nach dem anderen zu aktualisieren

-Controller

@RequestMapping("/") 
public String pagIndex(Model model){ 
    System.out.println("loading index page"); 
    // Get list of books 
    List<Book> books = bookDao.getBookList(); 
    // List of object to Model 
    model.addAttribute("books", books); 

    return "index"; 
} 

Ansicht

<h3>Book Inventory</h3> 
<table> 
    <tr> 
     <td>ID</td> 
     <td>Book Name</td> 
     <td>ISPN</td> 
     <td>Price</td> 
     <td></br><td> 
     <td>Object</td> 

    </tr> 
    <!-- Each book in separate form for easy update --> 
    <c:forEach var="book" items="${books}"> 
    <tr> 
     <sf:form class="editeForm" action="${pageContext.request.contextPath}/edititem" modelAttribute="book" method="POST"> 

      <td>${book.id} <input type="hidden" path="id" name="id"></td> 
      <td><sf:input type="text" path="name" name="name" /></td> 
      <td><sf:input type="text" path="ispn" name="ispn" /></td> 
      <td><sf:input type="text" path="price" name="price" /></td> 
      <td></br><td> 
      <td>${book}</td> 
      <td><input type="submit" value="save edite"><input type="submit" name="delete" value="delete"></td> 

     </sf:form> 
    </tr> 
    </c:forEach> 
</table> 

Wenn i gesetzt modelAttribute = "Buch" Stack-Trace ist

Caused by: java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'book' available as request attribute 
at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:144) 

modelAttribute = "$ {book}" Stack-Trace ist

java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'Book bean [id=1, name=Java: A Beginner's Guide, ispn=978-0071809252, price=18' available as request attribute 

Update: Wenn ich plain JSTL verwenden funktioniert es aber trotzdem, um ModelAttriburte zu verwenden?

<h3>Book Inventory</h3> 
<table> 
    <tr> 
     <td>ID</td> 
     <td>Book Name</td> 
     <td>ISPN</td> 
     <td>Price</td> 
     <td></br><td> 
     <td>Object</td> 

    </tr> 
    <!-- Each book in separate form for easy update --> 
    <c:forEach var="book" items="${books}"> 
    <tr> 
     <form class="editeForm" action="${pageContext.request.contextPath}/edititem" method="POST"> 

      <td>${book.id} <input type="hidden" name="id" value="${book.id}"/></td> 
      <td><input type="text" name="name" value="${book.name} /></td> 
      <td><input type="text" name="ispn" value="${book.ispn} /></td> 
      <td><input type="text" name="price" value="${book.price} /></td> 
      <td></br><td> 
      <td>${book}</td> 
      <td><input type="submit" value="save edite"><input type="submit" name="delete" value="delete"></td> 

     </form> 
    </tr> 
    </c:forEach> 
</table> 
+0

Ich sehe, dass Sie ein Formular absenden. Haben Sie eine 'POST'-Methode für Ihren Index? – bmarkham

+0

Das Problem besteht darin, das Formular nicht zu senden, sondern mithilfe von Spring modelAttribute anzuzeigen. –

Antwort

1

Wenn Sie schreiben:

<c:forEach var="book" items="${books}"> 

die book Variable in der Tat für jede Iteration erstellt wird, aber es ist nur eine Seite scoped Variable und nicht eine Anfrage Attribut. Und wie der Fehler sagt, erwartet Spring ModelAttribute eine Anfrage Attribut. Da ich weiß, dass keine triviale Art, die book Variable dynamisch zu machen, ein echtes Frühlingsmodellattribut ist, ist mein Rat, bei einfachem JSTL zu bleiben.

Als JSTLView standardmäßig nur das Modell legt Attribute als Anfrage mit ihrem Namen Attribute, Sie ein wenig scriptlet zu betrügen Frühling zu versuchen verwenden:

<c:forEach var="book" items="${books}"> 
    <% 
     Object obj = pageContext.findAttribute("book"); 
     request.setAttribute("book", obj); 
    %> 
    ... 

Aber ich fordere Sie wirklich nicht zu tun dass, weil es auf Spring-Implementierungsdetails beruht, die sich sogar in einer Nebenversion ändern können

+0

DANKE !!!!! ... page scoped Variable und Anfrage Attribut .... habe es ... danke –

0

Sie verwenden <c:forEach var="result" items="${books}" varStatus="status"> und ${result.id}. Check-in Controller, durch Zufall? deine Bücher.

+0

wie ist das anders als was ich habe? Wenn ich ModelAttribute loswerde, kann ich Wert mit JSTL anzeigen, aber ich versuche nicht, $ {book.id}, $ {book.name}, $ {book.price} ... usw. einzugeben. Ich versuche, modelAttribute zu verwenden um das Modell zu bekommen .... danke dir –

+0

deinen Code. Liste books = bookDao.getBookList(); Überprüfen Sie das Debugging. Liste übernehmen? – Byeon0gam

+0

Warum prüfen Sie das Objekt nicht? Sie Fehler: BindingResult. – Byeon0gam