Servlet - Baza danych - strona JSP

0

Mam pewien problem, stanąłem w miejscu i nie mogę ruszyć dalej.
Servlet łączy się z bazą danych, pobiera dane z kolumny, o nazwie podanej w atrybucie żądania (formularz). Problem polega na tym, że potrafię wyświetlić dane z kolumny za pomocą servletu, nie potrafię natomist za pomocą strony JSP :(
Poniżej przedstawiam kod strony JSP i Servletu.

KOD SERVLETU

import java.sql.;
import java.io.
;
import java.util.;
import javax.servlet.
;
import javax.servlet.http.*;

public class WyborZBazy extends HttpServlet {

public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
Connection con = null;
PreparedStatement stmt = null;
ResultSet rs = null;
response.setContentType("text/html; charset=iso-8859-2");
PrintWriter out = response.getWriter();

          String atrybut = request.getParameter("atrybut");              	  
		  			  	  			  
		  try{
      
      Class.forName("com.mysql.jdbc.Driver");
      
       con = DriverManager.getConnection (
      "jdbc:mysql://localhost:3306/leki", "user", "passwd");	
      	  		  
	  stmt = con.prepareStatement("SELECT opis FROM tablica WHERE nazwa= (?)");
	  stmt.setString(1, atrybut);	  
		
     		  
      rs = stmt.executeQuery(); 
	  

// tu mam problem ??!! czy można podać jak niżej obiekt ResultSet, a jeżeli tak to jak go odczytać?

	  request.setAttribute("nazwa1", rs);
	 
	  RequestDispatcher view = request.getRequestDispatcher("/wynik.jsp");
	  view.forward(request, response);
    }
    catch (ClassNotFoundException e) {
      out.println("Nie można załadować sterownika bazy danych:" + e.getMessage());
    }
    catch (SQLException e) {
      out.println("SQLException: " + e.getMessage());
    }
    finally {
      // zamknięcie połączenia z bazą danych
      try {
        if (con!=null) con.close();
      }
      catch (SQLException ignored) {}
    }
       
}

}

KOD JSP

<%@ page import="java.util.*" %>

<html xmlns="http://www.w3.org/1999/xhtml" lang="pl" xml:lang="pl"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" /> <title>Program Obsługujący bazę danych</title> </head> <body>

Program Obsługujący bazę danych

 <%=  request.getAttribute("nazwa1")%>

 // ??????????????????????????????????

 </p>
 
</body> </html>

Bardzo proszę o podpowiedź męczę się z tym już trzeci dzień:(

pozdrawiam

0

Generalnie skoro używasz scriptletów (które są złe, be i w ogóle nie pr0) to mniej więcej tak samo jak to robisz w servlecice.

Gdybyś używał taglibów (co byłoby generalnie ładniejsze, bardziej MVC i w ogóle) to wtedy pętla foreach na wyeksponowanej kolekcji ładowanej do jakiegoś beana o scope na przykład page z bazy danych.

HTH

0

Aha, dopiero teraz przyjrzałem się Twojemu kodowi.

No ale jaki, jaki sens ma przekazywanie resultSet przez sesję?? To nie lepiej już sobie przekazać jakąś kolekcję, albo w ogóle spreparowany wynik w postaci odpowiedniego stringa htmlowego?? Dane obrabiaj w servlecie nie ma co śmiecić w kodzie jsp, które generalnie ma być warstwą prezentacji a nie operacji na bazie danych, obliczeń kwantowych by przekierowania strumienia elektronów.

HTH

0

ja bym to zrobił tak:

  1. wywal z servletu połączenie z bazą i stwórz do tego osobną klasę
  2. stwórz sobie na podstawie tabelki z bazy klasycznego JavaBeana ( z get'ami i set'ami ) i po pobraniu danych z bazy zamień tego dataSet'a na Liste tych obiektów
  3. w servlecie jako takim w sumie lepiej jeśli jest niewiele, jak np. tutaj:
public class listaKsiazek extends HttpServlet{
	public void doGet(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException{
		this.doPost(request,response);
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException{
		Baza baza=Baza.getInstance();//jakiś singleton
		List lista=baza.wczytajKsiazki();
		request.setAttribute("ksiazki",lista);
		RequestDispatcher view=request.getRequestDispatcher("/jsp/listaKsiazek.jsp");
		view.forward(request,response);
		
	}
}

czyli pobieram sobie listę obiektów (tutaj akurat ksiazek) i przekazuje do strony...

  1. na stronie proponuje wykorzystać EL + JSTL:
<%@page import="data.*"%>
<%@ page language="java" import="java.util.*" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page isELIgnored="false" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-2">
</head>
<h2>Lista Ksiazek</h2><br>
<table border="1">
<tr>
<td>Autor</td>
<td>Tytul</td>
<td>Usun</td>
<td>Edycja</td>
</tr>
<c:forEach var="ksiazka" items="${ksiazki}">
<tr>
<td>${ksiazka.autor }</td>
<td>${ksiazka.tytul }</td>
<td><form method="post" action="usunKsiazke">
<input type="hidden" name="id" value="${ksiazka.id }">
<input type="submit"value="Usun"></form></td>
<td><form method="get" action="edytujKsiazke">
<input type="hidden" name="id2" value="${ksiazka.id }">
<input type="submit"value="Edytuj">
</form></td>
</tr>
</c:forEach>
</table>
<br>
</html

pzdr.

0

Wielkie dzięki za podpowiedzi i za ten kod :)
Zabieram się do analizy.

pozdrawiam

0

Zastosowałem takie rozwiązanie i wszystko jest ok:

część kodu SERVLETU

stmt = con.prepareStatement("SELECT opis FROM tablica WHERE nazwa = (?)");
stmt.setString(1, nazwa);

      rs = stmt.executeQuery(); 
	  		   
	  while(rs.next()) { 
	    String opis = rs.getString("opis");
		request.setAttribute("opis", opis);
	 
	  RequestDispatcher view = request.getRequestDispatcher("/wynik.jsp");
	  view.forward(request, response);
	  }

część kodu JSP

Opis: <%= request.getAttribute("opis")%>

Wiem, że jest nieelegancko i nie prO ale stawiam pierwsze kroki w technologii i na początek stosuję najprostsze rozwiązania.

Jednak mam kolejne pytanie, w tej sytuacji, jeżeli w formularzu html nie wpiszę żadnych danych lub wpiszę nieprawidłowe dane, tzn. podam nazwę która nie widnieje w tabeli wyświetla mi się pusta strona. Czy baza w tej sytuacji zwraca wartość null ? Jak ugryżć taki problem pętlą if else ? jaki postawić warunek? Z góry dziękuję za podpowiedź :)

0

do pustych danych stosuj validacje w serwlecie przed wyslaniem do bazy
i co to jest "pętla if else"?!

pozdrawiam

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