使用 JSP 遍历 ArrayList

NoS*_*ion 1 java spring jsp

我有这个 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)

Osk*_*icz 5

它不起作用,因为您传递名为“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)