Źle wyświetla dane

0

Witam,
Napisałem prostą stronę, która dodaje książki do bazy a następnie je wyświetla w tabeli.
Problem polega w tym, że dane są dobrze pobierane z bazy (tzn. gdy są w arrayliscie wszystko jest OK), natomiast gdy chcę je wyświetlić na stronie to zawsze wyświetla mi tyle wierszy w tabeli ile jest w bazie, ale wszystkie wiersze są takie same jak wiersz ostatni w bazie. Nie wiem czemu tak się dzieje i nie potrafię znaleźć problemu. Dopiero się tego uczę, więc zapewne popełniłem jakiś błahy błąd.

Tutaj mój index.jsp który wyświetla dane:

...
<h1>Spis ksiazek dostepnych w bazie:</h1>
	<%
		BookDAO bookDAO = new BookDAO();
		request.setAttribute("books", bookDAO.loadBooks());
		
	%>
	<table border=1>
			<c:forEach var="book" items="${books}">
				<tr>
					<td>${book.name}</td> 
					<td>${book.year}</td>
					<td>${book.describe}</td>
				</tr>
			</c:forEach>
		
	</table>
	
</body>
</html>

Tutaj metoda loadBooks() z klasy BookDAO:

public ArrayList<BookData> loadBooks()
	{	
		ArrayList<BookData> arrayBooks = new ArrayList<BookData>();
		BookData book = new BookData();
			try{
				Class.forName(DBDRIVER).newInstance();
				conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
				state = conn.createStatement();
				rs = state.executeQuery("SELECT * from books");
				
				while(rs.next())
				{
					book.setName(rs.getString(2));
					book.setYear(Integer.parseInt(rs.getString(3)));
					book.setDescribe(rs.getString(4));
					
					arrayBooks.add(book);
				}
				
				state.close();
				conn.close();
				
			}catch (SQLException | InstantiationException | IllegalAccessException | ClassNotFoundException e)
			{
				e.printStackTrace();
			}
			
			return arrayBooks;
	}

Mój web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>BooksProject</display-name>
  
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
1

Jak dla mnie po prostu tablica z tymi książkami ma referencje do tego samego obiektu.

book = new BookData();

wsadź do pętli while - musisz tworzyć nowy obiekt - w tej chwili nadpisujesz.

1

Bo tworzysz tylko jeden obiekt typu BookData.

                
                        try{
                                Class.forName(DBDRIVER).newInstance();
                                conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
                                state = conn.createStatement();
                                rs = state.executeQuery("SELECT * from books");
 
                                while(rs.next())
                                {
                                        BookData book = new BookData();
                                        book.setName(rs.getString(2));
0

Faktycznie, poszło - wielkie dzięki.
Strasznie głupi błąd, a człowiek się naszuka.

1 użytkowników online, w tym zalogowanych: 0, gości: 1