我有这个 Spring 应用程序。如何遍历 jsp 文件中的所有书籍,因为我尝试的方式不起作用。我不知道如何告诉 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";
}
}
Run Code Online (Sandbox Code Playgroud)
书目清单
@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;
}
}
Run Code Online (Sandbox Code Playgroud)
书
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;
}
}
Run Code Online (Sandbox Code Playgroud)
书籍.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>
Run Code Online (Sandbox Code Playgroud)
它不起作用,因为您传递名为“books”而不是“allBooks”的对象
model.addAttribute("books", listOfBooks.listBooks());
Run Code Online (Sandbox Code Playgroud)
改成
model.addAttribute("allBooks", listOfBooks.listBooks());
Run Code Online (Sandbox Code Playgroud)
它会起作用
编辑
所以先把书添加到你的收藏中,可能是空的
您必须listOfBooks.addBooks()在代码中的某处调用(例如,如果您只是在练习,则创建另一个控制器方法)
无论如何,您不能将这样的书籍存储在服务器上的数组中,因为当您关闭服务器时,所有数据都将消失,您必须将数据保存到数据库中
编辑 2
根据您的评论,我可以看到您不了解模型是如何工作的,让我为您解释一下:
当你写
model.addAttribute("books", listOfBooks.listBooks());
Run Code Online (Sandbox Code Playgroud)
您在模型中添加了一系列书籍(列表)并将其分配为“书籍”
模型只是一个包含键和值的映射,因此您只需添加一个值为 List 的键“books”
接下来
你在你的观点中写道
<c:forEach items="${allBooks}" var="book">
Run Code Online (Sandbox Code Playgroud)
allBooks 显然不存在于模型映射中,当您手动将键分配给 List 时,对象 ListOfBooksImpl 中的变量名称是什么并不重要,而是有一个 books 键
编辑 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";
}
}
Run Code Online (Sandbox Code Playgroud)
或者如果您只想添加书籍一次
@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";
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1271 次 |
| 最近记录: |