无法使用 servlet 将数据从 mysql 传递到 jsp/html 表



我正在尝试在 eclipse 中使用 tomcat 8 服务器创建 Java Web 应用程序。我创建了 servlet,它将请求转发到 jsp 页面,并使用来自两个表的数据初始化此页面内的表。我一直在互联网上关注几个关于如何使用 MySQL DB 的 recoreds 填充 html 表的示例,但失败了。我正在使用 MainServlet 的 doGet 方法将数据从我的本地数据库获取到列表中,并将其设置为请求中的属性。但是当我启动servlet时,jsp表中没有记录。Servlet 连接到数据库并从中接收记录(我已经调试了应用程序(。那么我的代码有什么问题呢?我是html和css,servlet和jsp技术的新手。也许问题出在我正在使用的 css 框架(Materialize CSS(上。这是我的 MainServlet.java 代码:

package redirect;
import java.io.IOException;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.Connection;
import util.Book;

@WebServlet(name="Libbook",urlPatterns={"/libbook"})
public class MainServlet extends HttpServlet 
{
    private static final long serialVersionUID = 1L;
    private static String url = "jdbc:mysql://localhost:3306/Test";
    private static String  user = "user",password = "password";

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    {
        List<Book> books = new ArrayList<>();
        Connection connection = null;
        try 
        {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(url,user,password);
            Statement statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery(
                    "SELECT IDBook,Title,AddDate,ISBN,Name,Sirname "
                    + "FROM Book INNER JOIN Author "
                    + "ON Book.IDAuthor = Author.IDAuthor;");
            while (resultSet.next()) 
            {
                Book b = new Book();
                b.setId(resultSet.getInt(1));
                b.setTitle(resultSet.getString(2));
                b.setIsbn(resultSet.getLong(4));
                b.setDate(resultSet.getDate(3).toString());
                b.setName(resultSet.getString(5));
                b.setSirname(resultSet.getString(6));
                books.add(b);
            }
        }
        catch (SQLException | ClassNotFoundException e) 
        {
            e.printStackTrace();
        }
        finally {
            try {if(connection != null)connection.close();}catch (SQLException e) {e.printStackTrace();}
        }
        request.setAttribute("books", books);
        request.getRequestDispatcher("pages/libbook.jsp").forward(request, response);
    }
}

图书馆.jsp页:

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset=UTF-8"/>
<title>LibBook</title>
<link href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.98.2/css/materialize.min.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<style type="text/css">
    .logo{
          color: #444;
          text-transform: uppercase;
          letter-spacing: 0.3em;
          font-size: 2em;
        }
    .logo img{
        width: 5%;
        margin: 0.5%;
        vertical-align: middle;
        margin-right: 0.5em;
    }
</style>
</head>
<body>
    <nav class="white">
        <div class="navbar-wrapper container">
            <a id="logo-container" href="#" class="logo">
                LIBBOOK
                <img src="assets/book.svg" alt="LibBooklogo">
            </a>
            <ul class="right">
                <li><a class="waves-effect waves-light btn" href="pages/new_author.jsp"><i class="material-icons left">perm_identity</i>NEW AUTHOR</a></li> 
                <li><a class="waves-effect waves-light btn" href="pages/new_book.jsp"><i class="material-icons left">class</i>NEW BOOK</a></li> 
            </ul>
        </div>
    </nav>
    <div class="container">
        <div class="row">
            <div class="card-panel">
                <form action="test">
                    <div class="input-field">
                        <input placeholder="Type here (title,author) and press enter.." id="search_bar" type="text">
                        <label for="search_bar">Search</label>
                    </div>
                </form>
            </div>
        </div>
        <div class="row">
            <div class="card-panel">
                 <table>
                    <thead>
                      <tr>
                          <th>ISBN</th>
                          <th>Title</th>
                          <th>Author</th>
                          <th>Info/Edit</th>
                          <th>Remove</th>
                      </tr>
                    </thead>
                    <c:forEach var="book" items="${books}">
                          <tr>
                            <td><c:out value="${book.isbn}"/></td>
                            <td><c:out value="${book.title}"/></td>
                            <td><c:out value="${book.name}"/></td>
                            <td>
                                <a href=""><i class="material-icons">mode_edit</i></a>
                             </td>
                             <td>
                                <a href=""><i class="material-icons">delete</i></a>
                             </td>
                          </tr>
                    </c:forEach>
                 </table>
            </div>
        </div>
    </div>
     <script
        src="https://code.jquery.com/jquery-3.2.1.min.js"
        integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
        crossorigin="anonymous">
      </script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.98.2/js/materialize.min.js"></script>
</body>
</html>

图书类:

package util;
import java.io.Serializable;
public class Book implements Serializable
{
    private Integer id;
    private String title;
    private String date;
    private Long isbn;
    private String name;
    private String sirname;
    public Book(){
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getDate() {
        return date;
    }
    public void setDate(String date) {
        this.date = date;
    }
    public Long getIsbn() {
        return isbn;
    }
    public void setIsbn(Long isbn) {
        this.isbn = isbn;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSirname() {
        return sirname;
    }
    public void setSirname(String sirname) {
        this.sirname = sirname;
    }

}

找到解决方案。问题出在 jsp 文件中,我没有包含与 c 标签相关的导入:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>

并且没有将 jstl-1.2.jar 库添加到我的项目中

Java 在

Bean 类中查找 getter 方法来读取数据。当你bean class(Book(时,getter方法名称像getISBN((,getTitle((,getAName((等。你应该在 jsp 中使用代码,例如

<td><c:out value="${book.iSBN}"/></td>
<td><c:out value="${book.title}"/></td>
<td><c:out value="${book.aName}"/></td>

最新更新