[英]Iterate over ArrayList with JSP
我有这个Spring应用程序。 如何对jsp文件中的allBooks进行迭代,因为在我尝试的方式中它不起作用。 我不知道如何告诉jsp文件获取列表(allBooks)。
控制者
@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>
它不起作用,因为您传递了名为“ books”而不是“ allBooks”的对象
model.addAttribute("books", listOfBooks.listBooks());
改成
model.addAttribute("allBooks", listOfBooks.listBooks());
它会工作
编辑
因此,请先将这些书添加到您的收藏中,可能是空的
您必须在代码中的某个地方调用listOfBooks.addBooks()
(例如,如果您只是在练习它,则创建另一个控制器方法)
无论如何,您不能将这样的书存储在服务器上的阵列中,因为当您关闭服务器时,所有数据都将消失,您必须将数据持久保存到数据库中
编辑2
根据您的评论,我可以看到您不了解模型是如何工作的,让我为您解释一下:
当你写
model.addAttribute("books", listOfBooks.listBooks());
您向模型中添加了一系列的书(列表),并将其分配为“书”
模型只是一个包含键和值的地图,因此您只需添加具有List值的键“ books”
接下来
你写的观点
<c:forEach items="${allBooks}" var="book">
allBooks显然不存在于模型图中,当您将键手动分配给List时,对象ListOfBooksImpl中的变量名是什么都没有关系
编辑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";
}
}
请尝试一下。
<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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.