是否可以从JSTL forEach循环中的列表访问特定元素/对象?

时间:2018-03-29 11:03:54

标签: java jsp spring-boot jstl

Screenshot of list

上面屏幕截图中的表格代码

    <table>
    <tr>
        <th class="tg-address">Title</th>

        <th class="tg-houseprice">Price</th>

        <th  class="tg-crimerating">Author</th>

        <th  class="tg-schools">Category</th>

        <th  class="tg-university">Book Cover</th>

        <th  class="tg-bars">Amount in Stock</th>

        <th  class="tg-bars"> </th>
    </tr>

    <c:forEach var="o" items="${booksList}">
        <tr>
            <td width="3.5%" height="50"><c:out value="${o.title}"/></td>

            <td width="3.5%" height="50"><c:out value="${o.price}"/></td>

            <td width="3.5%" height="50"><c:out value="${o.author}"/></td>

            <td width="3.5%" height="50"><c:out value="${o.category}"/></td>

            <td width="3.5%" height="50"><c:out value="${o.image}"/></td>

            <td width="3.5%" height="50"><c:out value="${o.quantity}"/></td>

            <td width="3.5%" height="50"><a href="shoppingCart">Add Book to Shopping Cart</a></td>

         </tr>
    </c:forEach>

将列表打印到JSP页面的控制器方法

    @RequestMapping(value = "viewallbooks", method = RequestMethod.GET)
public String bookList(@Valid Book book, Model model) {
    List<Book> booksList = new ArrayList<>();
    booksList = bookRepository.findAll();

    model.addAttribute("booksList", booksList);

    return "bookListPage";
}

我通过将其值传递到List并将此列表传递到JSP页面c:forEach上的bookListPage循环来打印MySQL表的内容。如果您查看表格和/或屏幕截图,您会注意到我可以选择将图书添加到购物车(用户对象类中的图书对象列表),这会将相关图书添加到当前登录用户图书清单。

屏幕截图中的表格由不同的图书对象列表组成(即目前库存中只有3本图书),我的问题是如何在按下相应的{{1链接。

我在点击找到当前登录用户的链接后调用此Controller方法,并将我正在尝试传递的书添加到他们的列表中。但是我似乎无法解决这个问题。

Add Book to Shopping Cart

1 个答案:

答案 0 :(得分:2)

也许您缺少将jsp代码封装在form标记内,例如:

<form action="#" th:action="@{shoppingCart}" th:object="${o}" method="post">
  <td width="3.5%" height="50">
    <a href="shoppingCart">Add Book to Shopping Cart</a>
  </td>
</form>

我认为,由于您传递的是对象,因此必须使用post方法。但这只有在您想要创建/修改图书时才有意义。由于您只想检索选择要添加到购物车中的哪本书,我建议您按照lucumt建议并仅传递ID,然后检索该书。像这样:

<td width="3.5%" height="50">
  <a href="<c:url value='/shoppingcart/${o.id}' />">
    Add Book to Shopping Cart
  </a>
</td>

最后你的控制器方法应该是这样的:

@RequestMapping(value = " /shoppingcart/{bookId}", method=RequestMethod.GET)
public String shoppingCart(@PathVariable("bookId")int bookId, Model model) {

  // This gets the currently logged in user
  Authentication loggedInUser = SecurityContextHolder.getContext().getAuthentication();
  String username = loggedInUser.getName(); // Authentication for 
  User user = userRepository.findByUsername(username);

  //Retrieve book
  Book book = bookService.findBookById(bookId);

  // This will add the book to the user's booklist
  user.saveBookToShoppingCart(book);

  return "shoppingcart";
}