【问题标题】:Passing resultSet from servlet to JSP file. Attribute of ArrayList type is always null将结果集从 servlet 传递到 JSP 文件。 ArrayList 类型的属性始终为空
【发布时间】:2017-09-30 12:47:59
【问题描述】:

我是创建动态 Web 项目的新手,我不确定我是否正确掌握了整个事情的想法。

我正在尝试创建一个简单的网络应用程序,用于从 mySQL 数据库中浏览书籍,它只包含一个表:Books(id_book, ti​​tle, author, isbn, description)。

我已经准备好了 Driver 类,用于从数据库中检索数据并将其从 ResultSet 转换为 ArrayList<.book>、BookSelect servlet,这是应该的将创建的列表传递给 JSP 文件,最后是 bookselectJSP 文件,我希望将结果显示在网站上。

司机:

public class Driver {

private ResultSet resultSet;
public ArrayList<Book> resultList;
private Connection myCon;
private Statement myStatement;

public Driver() {
    try {
        this.resultList = new ArrayList<Book>();
        myCon = DriverManager.getConnection("jdbc:mysql://localhost:3306/firstbase","root","myPassword");
        myStatement = myCon.createStatement();
        resultSet = myStatement.executeQuery("select * from books");
        while(resultSet.next()){
            resultList.add(new Book(Integer.parseInt(resultSet.getString(1)),resultSet.getString(2),resultSet.getString(3),resultSet.getString(4),resultSet.getString(5)));
        }

        resultSet.close();
        myStatement.close();
        myCon.close();

    } catch (SQLException e) {
        e.printStackTrace();
    }
}

public ArrayList<Book> getResultList(){
    resultList.forEach(e -> System.out.println("here->" + e + "<-" ));
    return resultList;
}

public ResultSet getResultSet(){
    return this.resultSet;
}

图书选择

    protected void service(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    RequestDispatcher rd = getServletContext().getRequestDispatcher("/bookselectJSP.jsp");
    Driver myDriver = new Driver();
    //myDriver.getResultList().add(new Book(1, "aa", "aa", "aa", "aa"));
    request.setAttribute("resultList", myDriver.getResultList());
    rd.forward(request, response);

}

bookselectJSP:(现在我只是想用标签显示一行)

<h1 id="titleBar">List of your books</h1>

<% 
 ArrayList<Book> rows = (ArrayList<Book>) request.getAttribute("resultList");
%>

<label><%=rows.get(0).toString()%></label>

整个问题是,当我在 Driver 类中添加 main 方法并运行它时,一切似乎都运行良好。我得到数据,将其转换为 ArrayList,然后我可以从该列表中打印结果。 但是一旦我尝试从 servlet 类访问它,它总是为空。

错误信息: This is an error message

奇怪的是,当我在 servlet 的列表中添加一些东西(servlet 服务方法中的注释代码)时,它正在被传递。 从现在开始我完全不知道如何进行,我完全迷路了,请帮助。

************************************解决********** ******************************

问题是tomcat找不到合适的驱动程序,我觉得它很奇怪,因为我不仅把它放在WEB-INF/lib中,而且放在$CATALINA_HOME/lib中,所有配置都正确。 无论如何,在开始连接之前添加以下行有帮助:

DriverManager.registerDriver(new com.mysql.jdbc.Driver ());

据我所知,这不应该是必要的,但你知道吗,事实证明 - 它是:)


【问题讨论】:

    标签: java mysql jsp servlets arraylist


    【解决方案1】:

    我建议你为这样的 Book 创建一个 bean 类。

    Class BookBean{
    private int bookId;
    private String title;
    //and so on for all the properties
    //add getters and setters
    }
    

    现在在您的 Driver 类中将 ResultSet 转换为 ArrayList,如下所示

    ResultSet re=daoclass.getdata();//used to get result set from DB
    List<BookBean> booklist=new ArrayList<BookBean>
    while(re.next()){
    int id=re.getInt("book_id");
    String name=re.getString("name");
    //extract all the parameters as above
    BookBean bb=new BookBean();
    bb.setId(id);
    bb.setName(name);
    //assign all the parameters to the bean
    
    booklist.add(bb);//adding bean to the list
    
    }
    

    现在在您的 Servlet 中将此列表转发到 jsp,如下所示

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    {
    request.setAttribute("booklist",booklist);
    //forward the request to jsp using Request Dispatcher
    }
    

    现在在您的 JSP 中,您可以使用 JSTL foreach 属性访问每本书的数据,如下所示

    <c:forEach var="blist" items="${booklist}">
        <p>${blist.id}</p>
        <p>${blist.name}</p>        
    </c:forEach>
    

    如有疑问请留言

    【讨论】:

    • 感谢您的回复 Migrated Pigeon,我非常感谢您的努力,尽管问题最终与驱动程序有关,而不是代码本身 :) 我已经在编辑中留下了解释发布。
    • 没问题,需要加载驱动类创建与数据库的连接,不需要调用DriverManager.registerDriver(),调用class.forName(驱动类)注册即可司机。
    猜你喜欢
    • 2014-03-16
    • 1970-01-01
    • 2011-05-20
    • 2013-11-15
    • 2012-10-22
    • 2017-03-18
    • 1970-01-01
    • 2021-07-06
    • 2017-05-21
    相关资源
    最近更新 更多