2015-11-14 4 views
0

У меня есть это приложение Spring. Как iteraete над allBooks в jsp-файле, потому что так, как я пытаюсь, это не сработало. Я не знаю, как сообщить файлу jsp, чтобы получить список (allBooks).Iterate over ArrayList с JSP

Контроллер

@Controller 
public class ListBooksController { 

    @Autowired 
    ListOfBooks listOfBooks; 

    @RequestMapping("/books") 
    public String books(Model model) { 
    listOfBooks.addBooks(); 
    model.addAttribute("books", listOfBooks.listBooks()); 
    return "books"; 
    } 

} 

ListOfBooksImpl

@Repository 
public class ListOfBooksImpl implements ListOfBooks { 

    protected List<Book> allBooks = new ArrayList<>(); 

    @Override 
    public void addBooks() { 
    Book tutun = new Book("Тютюн", "Димитър Талев", 50); 
    Book lotr = new Book("Lord Of The Rings", "Tolkin", 35); 
    allBooks.add(tutun); 
    allBooks.add(lotr); 
    } 

    @Override 
    public List<Book> listBooks() { 
    return allBooks; 
    } 
} 

Книга

public class Book { 

    private String bookName; 
    private String author; 
    private int price; 

    public Book(String bookName, String author, int price) { 
    this.bookName = bookName; 
    this.author = author; 
    this.price = price; 
    } 

    public String getBookName() { 
    return bookName; 
    } 

    public void setBookName(String bookName) { 
    this.bookName = bookName; 
    } 

    public String getAuthor() { 
    return author; 
    } 

    public void setAuthor(String author) { 
    this.author = author; 
    } 

    public int getPrice() { 
    return price; 
    } 

    public void setPrice(int price) { 
    this.price = price; 
    } 
} 

books.jsp

<body> 
<section> 
    <div class="jumbotron"> 
     <div class="container"> 
      <h1>Books</h1> 
      <p>All the available books in our store</p> 
     </div> 
    </div> 
</section> 
<section class="container"> 
    <div class="row"> 
     <c:forEach items="${allBooks}" var="book"> 
      <div class="col-sm-6 col-md-3" style="padding-bottom: 15px"> 
       <div class="thumbnail"> 
        <div class="caption"> 
         <h3>${book.name}</h3> 
         <p>${book.author}</p> 
         <p>$${book.price}</p> 
        </div> 
       </div> 
      </div> 
     </c:forEach> 
    </div> 
</section> 

ответ

3

Это не работает, потому что вы передаете объект под названием "книги" не "allBooks"

model.addAttribute("books", listOfBooks.listBooks()); 

изменение

model.addAttribute("allBooks", listOfBooks.listBooks()); 

и он будет работать

EDIT

поэтому добавьте книгу s в вашу коллекцию, вероятно, это пусто

Вы должны позвонить listOfBooks.addBooks() где-нибудь в вашем коде (например.g создать другой метод контроллера, если вы просто практикуете его)

В любом случае вы не можете хранить такие книги в массиве на сервере, потому что, когда вы отключите свой сервер, все данные исчезнут, вам нужно сохранить данные на дб

EDIT 2

в соответствии с вашими комментариями я могу видеть, что вы не понимаете, как это модель работы, позвольте мне объяснить вам:

, когда вы писали

model.addAttribute("books", listOfBooks.listBooks()); 

вы добавили множество книг (список) модели и назначен его как «книга»

модель просто карта, содержащую ключ и значение, так что вы просто добавили ключ «книгу» со значением Перечня

nextly

вы писали на ваш взгляд

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

allBooks, очевидно, не существует в модели карты, это не имеет значения, что является вар iable имя в объекте ListOfBooksImpl, когда вы вручную назначен ключ к списку, у вас есть ключ книги вместо

EDIT 3

Так что, если вы хотите добавить книги просто создать еще один метод контроллера и вызвать его первый

@Controller 
public class ListBooksController { 

    @Autowired 
    ListOfBooks listOfBooks; 

    @RequestMapping("/addBooks") 
    public String addBooks() { 
    listOfBooks.addBooks(); 
    return "books"; 
    } 

    @RequestMapping("/books") 
    public String books(Model model) { 
    model.addAttribute("books", listOfBooks.listBooks()); 
    return "books"; 
    } 

} 

или если вы хотите добавить книги только один раз

@Controller 
public class ListBooksController { 

    @Autowired 
    ListOfBooks listOfBooks; 

    @RequestMapping("/books") 
    public String books(Model model) { 
    if(listOfBooks.listBooks().isEmpty()) 
     listOfBooks.addBooks(); 
    model.addAttribute("books", listOfBooks.listBooks()); 
    return "books"; 
    } 

} 
+0

я пытался, но он не работает – NoSuchUserException

+0

@NoSuchUserException я обновил пост –

+0

После того как я добавил addBooks() к интерфейсу он работает, но каждый раз, когда я обновить страницу автоматически добавить те же две записи в список , Я полагаю, что это неправильное место для вызова этого метода. – NoSuchUserException

0

Попробуйте пожалуйста.

<c:forEach items="${books}" var="book"> 
     <div class="col-sm-6 col-md-3" style="padding-bottom: 15px"> 
      <div class="thumbnail"> 
       <div class="caption"> 
        <h3>${book.bookName}</h3> 
        <p>${book.author}</p> 
        <p>${book.price}</p> 
       </div> 
      </div> 
     </div> 
</c:forEach> 
+0

Это не решение. Вы используете другую переменную, и в этом случае она вообще не работает. – NoSuchUserException