# Servlet und JSP.



## cashmoney (20. Jan 2009)

Hallo.. ich hoffe Ihr könnt mir weiterhelfen... ich habe gestern schon was gepostet aber dann durch ein Fehler in der posting, wieder das Thema gelöscht....

und zwar:

habe ich ein JSP Code erstellt, der aus der Datenbank die Daten herholt, und die dann in HTML  ausgibt..( Ist eine Art Suche was ich erstellt habe)

mein Ziel:  die Daten aus der Datenbank über Servlet herholen und die dann über JSP (HTML) ausgibt.....

Frage Wie kann ich das soweit umsetzten, dass sich die beiden verbinden von Servlet zu JSP die Daten überrägt und dann ausgibt??

Das mit Servlet habe ich soweit hinbekommen(falls noch nichts fehlt) mit der Datenbankzugriff:




```
[code]

<html>
<body bgcolor="AZURE">
<title>Suchergebnis</title>
<center>
<h4>Zu Ihrer Suchanfrage konnten folgende Bücher gefunden werden</h4>
<div>
<table border="3" cellspacing="0" cellpadding="0" bgcolor="WHITE"
	style="width: 70%; height: 10%;" align="center">

	<tr bgcolor="POWDERBLUE">
		<td>
		<center>[b]Nr.[/b]</center>
		</td>
		<td>
		<center>[b]Titel[/b]</center>
		</td>
		<td>
		<center>[b]Author[/b]</center>
		</td>


	}
%>
```


----------



## SlaterB (20. Jan 2009)

in jedem Fall solltest du in der JSP nichts zu ResultSet haben,
das ResultSet musst du im Servlet auslesen und schließen,
an das JSP überträgst du ein Array/ eine Liste/ Bean-Objekte oder ähnliches

die Daten kannst du im Request als Attribut speichern, siehe allgemeine Tutorials zum Thema 'Daten zwischen Servlet + JSP austauschen'


----------



## HLX (20. Jan 2009)

Posting ist gelöscht worden. Folgendes hatte ich bereits gestern dazu geschrieben:

1. Eine Klasse von HttpServlet ableiten 
2. Die Methode 'doPost(HttpServletRequest, HttpServletResponse)' überschreiben und hier den Java-Code aus deiner JSP einfügen 
3. Das Ergebnis deiner Datenbankabfrage als Request-Attribut ablegen und auf die JSP-Seite verweisen: 
(EDIT: wie SlaterB geschrieben hat, nicht das ResultSet selbst hier ablegen)

```
request.setAttribute("meinErgebnis", ErgebnisObjekt); 
RequestDispatcher rd = request.getRequestDispatcher("Buchsuche.jsp"); 
rd.forward(request,response);
```


4. Das Servlet in der web.xml bekannt machen: 

```
Code: 
     <servlet> 
        <servlet-name>meinServlet</servlet-name> 
        <servlet-class>meinPackage.MeineServletKlasse</servlet-class> 
    </servlet> 
    <servlet-mapping> 
        <servlet-name>meinServlet</servlet-name> 
        <url-pattern>/meinServletAufruf</url-pattern> 
    </servlet-mapping>
```
5. Die Formular-Action in der JSP anpassen: 

```
<form action='<%= request.getContextPath()+"/meinServletAufruf" %>' ...>
```
5. In der JSP die Ergebnisse aus dem Request-Attribut holen 

```
<% Object ergebnis = request.getAttribute("meinErgebnis") %>
```


----------



## cashmoney (20. Jan 2009)

Vielen Dank,,,, werde ich mir gleich genauer anschauen!

Da wir schon dabei sind, versuche ich grad das ganze über Servlet zum laufen zu bringen.... ich habs ja soweit fertig nur erkennt nicht die übergabe zum HTML wo liegt hier das Problem ?


hocke schon seit ner Std dran und komme hier nicht weiter ich weis das hier ein Fehler ist aber WELCHEN??..habe die ganze Zeit rumgecodet und komme nicht weiter ...


```
.
.
..
.
.
..
..
..
.
..

.
.
.
					
					"<tr>"+
					"<td>"+
					"<center>"+rst.getString("Titel")+"</center>\n"+
					"</td>"+
					"<td>"+
					"<center>"+rst.getString("Author")+"</center>\n"+
					"</td>"+
					"</tr>"+
					"</table>"+
					"</center>"+
					"</BODY>"+
					"</HTML>"+

					"<HTML>\n"+
					"<HEAD><TITLE>Search</TITLE></HEAD>\n"+
					"<BODY BGCOLOR=\"LIGHTSTEELBLUE\">"+
					
					"<center>\n"+
					"<form action=\"VerbindungBS.java\" method=\"post\" name=\"entry\"onSubmit=\"return validate(this)\"><input type=\"hidden\"value=\"list\" name=\"action\">\n"+
			"<table>\n"+
			"<tr>\n"+
			"<td>\n"+
			"<table bgcolor=\"POWDERBLUE\">"+
			"<tr>\n"+
			"<td colspan=\"2\" align=\"center\">"+
			"<h2><blink>Bibliothek</blink></h2>\n"+
			"</td>\n"+
			"</tr>\n"+
			"<tr>"+
			"<td colspan=\"2\">&</td>\n"+
			"</tr>"+
			"<tr>"+
			"<td>Buchtitel:</td>\n"+
			"<td><input name=\"titel\" type=\"text\" size=\"50\"></td>\n"+
			"</tr>"+
			"<tr>"+
			"<td>Author:</td>\n"+
			"<td><input name=\"author\" type=\"text\" size=\"50\"></td>\n"+
			"</tr>"+
			"<tr>"+
			"<td>Schlagwort:</td>\n"+
			"<td><input name=\"schlagwort\" type=\"text\" size=\"50\"></td>\n"+
			"</tr>"+
			"<tr>"+
			"<td colspan=\"2\" align=\"center\"><input type=\"submit\"value=\"..::: s u c h e n :::..\" size=\"30\"></td>\n"+
			"</tr>"+
			"</td>"+
			"</tr>"+
			"</form>"+
			"</center>"+
			"</BODY></HTML>");
			
		} catch (SQLException e) {
			System.out.println(e);
			
			
			
		} else {

			"<html>"+
			"<head>"+
			"<title>Eingabe</title>"+
			"<script>"+
// HTML ausgabe
			function validate(objForm) {
				if (objForm.authorPara.value.length == 0) {
					objForm.authorPara.focus();
				}
				if (objForm.buchPara.value.length == 0) {
					objForm.buchPara.focus();
				}
				if (objForm.schlagwortPara.value.length == 0) {
					objForm.schlagwort.focus();
				}
				return true;
			}
			
			"</script>"+
			"</head>"+
						
	}
}
```


----------



## SlaterB (20. Jan 2009)

was ist die Frage/ Fehlermeldung?
du kannst doch nicht einen unkompilierbaren Codeausschnitt posten und nur sagen 'da ist irgendein Fehler'..

-------

> } catch (SQLException e) { 
>         System.out.println(e); 
>      } else { 

ist keine gültige Java-Syntax


----------



## cashmoney (20. Jan 2009)

Ja die Frage ist: wie setze ich das jetzt richtig um? bringt mich grad extrem durcheinander =(

Irgendwie kann ich den Bericht der Fehlermeldung nicht kopieren 

Es zeigt erst den HTTP Status 500 und dann wenn mans wieder laden will kommt ein HTTP STATUS 404


----------



## SlaterB (20. Jan 2009)

was sagt denn ein normaler Java-Compiler dazu, oder eine Entwicklungsumgebung wie Eclipse?

ohne Fehlermeldung keine Fehlerbekämpfung,
zumindest nicht von mir aber vielleichts siehts ja wer anders aus dem Kopf


----------



## cashmoney (20. Jan 2009)

Also über Eclipse zeigt er ab "else" fehler:

ich denke wie du schon sagtest da es keine java sintax ist im unteren bereich! liegt es vielleicht daran ? was wäre die richtige codierung ? weil im unteren bereich auch mit javascript codiert habe, dürfte doch kein problem sein oder ?

will nur noch das er die Tabelle mit der suchfunktion anzeigt und die daten ausgibt das wars =(


----------



## HLX (20. Jan 2009)

Ab "else" folgt ja auch unsinniger Code:

```
"<html>"...
```
Du musst deine Strings einer Methode übergeben - vorzugsweise der Ausgabemethode deines PrintWriters.


----------



## cashmoney (20. Jan 2009)

kannst du mir bitte evtl ma ansatzsweise zeigen wie du es genau meinst... 
danke dir schon im Voraus


----------



## HLX (20. Jan 2009)

statt

```
} else { 
      "<html>"
      ...
```

schreibst du

```
} else { 
      out.print("<html>")
      ...
```

Das, was du auf der HTML-Seite ausgeben möchtest, musst du deinem PrintWriter übergeben. Auch dass, was später in deinem Code ab "function.validate()" kommt.

Ich fürchte du brauchst Lehrmaterial. Hier das Servlet-Kapitel in einem JSP-Tutorial:
www.jsptutorial.org/content/appendix_II


----------



## cashmoney (20. Jan 2009)

so siehts im mom aus:

läuft noch nicht mal ein Teil:

ich habe unten den Javascript kommentiert da ich nicht genau weis wie ich das jetzt genau ändern soll... .


jedenfalls zeigt er mir keine Fehler mehr an, wenn ich versuchen will es im Browser zu öffnen...es kommt nur en white Window


----------



## SlaterB (20. Jan 2009)

am Ende evtl.
out.flush();
out.close();

kann aber auch ganz schlimm sein, falls noch wer anders da was reinschreiben will


----------



## cashmoney (20. Jan 2009)

danke SlaterB.. habe ich hinzugefügt....

@ HLX

ich habe doch oben schon den out.println erstellt... somit sollten doch alle HTML codes im inneren des out.println erkennen oder liege ich da falsch?

habe den Code oben wieder aktualisiert.....


----------



## HLX (20. Jan 2009)

In beiden Code-Ausschnitten von dir befinden sich die problematischen Teile des HTML-Output nicht im Inneren der Print-Methode des Printwriters. 

Beim einen Beispiel schließt du die Print-Methode in Zeile 112 um einen try-catch-Block zu beenden. Da musst du natürlich für weitere HTML-Ausdrücke die Print-Methode erneut aufrufen. Im letzten Beispiel wird die Print-Methode in Zeile 81 unsachgemäß beendet.

Wie du siehst, ist es nicht besonders schön die GUI im Servlet zu implementieren. Du solltest meinem 1. Rat folgen und per RequestDispatcher auf eine JSP-Seite verweisen, in der du das Ergebnis darstellst.


----------



## cashmoney (21. Jan 2009)

@HLX.. ja kann ich vollkommen nachvollziehen..aber meine Aufgabe ist nur aus reiner Übung, wie ich das komplett in Servlet übersetze damit es ebenso funktioniert wie es in JSP komplett funktioniert hat... ich werde später dann hauptsächlich nur mit Servlet und XML/XSLT arbeiten!

Jedenfalls habe ich nun mal rumcodiert und hier das Resultat..... Es Zeigt mir im mom nur unten bei der Schleife ein Fehler und wie bekomme ich das mit der else funktion das der Javascript auch funktioniert... kann mir nicht jemand genau zeigen wie ich es umsetzen kann..komme im mom echt nicht mit diesen Problem zurecht...=(


----------



## HLX (21. Jan 2009)

Alles was vom Browser gerendert wird, muss an die Printmethode des PrintWriters übergeben werden. Auch das JavaScript. 

Nachfolgend habe ich *diesen* Fehler korrigiert. Keine Garantie dass es jetzt fehlerfrei ist:

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

    Connection con = null;
    ResultSet rst = null;
    PreparedStatement pstmt = null;

    final String LOAD_BY_ALL = "SELECT * FROM Buecher WHERE Author LIKE ? AND Titel LIKE ? AND Schlagwort LIKE ?";
    final String LOAD_BY_AUTHOR = "SELECT * FROM Buecher WHERE Author LIKE ?";
    final String LOAD_BY_TITEL = "SELECT * FROM Buecher WHERE Titel  LIKE ?";
    final String LOAD_BY_SCHLAGWORT = "SELECT * FROM Schlagwort, Buecher WHERE Schlagwort.Tags LIKE ? AND Buecher.Tag_ID = Schlagwort.Schlagwort_ID";
    final String LOAD_BY_NIX = "SELECT * FROM Buecher";

    try {
        //DRIVER LOAD 
        Class.forName("com.mysql.jdbc.Driver");
        //Connect to DB 
        con = DriverManager.getConnection("jdbc:mysql://x/x", "x", "x");
        PrintWriter out = response.getWriter();
        response.setContentType("text/html");
        String docType = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
	+ "Transitional//EN\">\n";
        if (request.getParameter("action") != null) {

                String authorPara = request.getParameter("author");
                String buchPara = request.getParameter("titel");
                String schlagwortPara = request.getParameter("schlagwort");
                String sqlStmt;
                if (authorPara != null && authorPara.length() > 0 && buchPara != null
                	&& buchPara.length() > 0 && schlagwortPara != null
		&& schlagwortPara.length() > 0) {
	    	    pstmt = con.prepareStatement(LOAD_BY_ALL);
		    pstmt.setString(1, "%" + authorPara + "%");
		    pstmt.setString(2, "%" + buchPara + "%");
		    pstmt.setString(3, "%" + schlagwortPara + "%");
                }
                else if (authorPara != null && authorPara.length() > 0) {
                    pstmt = con.prepareStatement(LOAD_BY_AUTHOR);
                    pstmt.setString(1, "%" + authorPara + "%");
                }
                else if (buchPara != null && buchPara.length() > 0) {
                    pstmt = con.prepareStatement(LOAD_BY_TITEL);
                    pstmt.setString(1, "%" + buchPara + "%");
                }
                else if (schlagwortPara != null && schlagwortPara.length() > 0) {
                    pstmt = con.prepareStatement(LOAD_BY_SCHLAGWORT);
                    pstmt.setString(1, "%" + schlagwortPara + "%");
                }
                else {
                    pstmt = con.prepareStatement(LOAD_BY_NIX);
                }

                rst = pstmt.executeQuery();
	//______________________________ 
                out.println(docType
                    + "<HTML>\n"
                    + "<BODY bgcolor=\"AZURE\">
                    + "<title>Suchergebnis</title>
                    + "<center>"
                    + "<h4>Zu Ihrer Suchanfrage konnten folgende Bücher gefunden werden</h4>"
                    + "<div>"
                    + "<table border=\"3\" cellspacing=\"0\" cellpadding=\"0\" "
                    + "bgcolor=\"WHITE\"style=\"width: 70%; height: 10%;\" align=\"center\">\n"
                    + "<tr bgcolor=\"POWDERBLUE\">" + "<td>"
                    + "<center>[b]Nr.[/b]</center>" + "</td>" + "<td>"
                    + "<center>[b]Titel[/b]</center>" + "</td>" + "<td>"
                    + "<center>[b]Author[/b]</center>" + "</td>" + "</tr>" + "<tr>"
                    + "<td>" + "<center>" + rst.getString("Titel") + "</center>\n"
                    + "</td>" + "<td>" + "<center>" + rst.getString("Author")
                    + "</center>\n" + "</td>" + "</tr>" + "</table>" + "</center>"
                    + "</BODY>" + "</HTML>");
                con.close();
                rst.close();
                pstmt.close();
            }
            else {
                out.println(docType + "<HTML>\n" + "<head>"
                + "<script>+function validate(objForm) {"
                + "if (objForm.authorPara.value.length == 0) {"
                + "objForm.authorPara.focus();" + "}"
                + "if (objForm.buchPara.value.length == 0) {" + "objForm.buchPara.focus();"
                + "}" + "if (objForm.schlagwortPara.value.length == 0) {"
                + "objForm.schlagwort.focus();" + "}" + "return true;" + "</script>"
                + "<TITLE>Search</TITLE>\n"
                + "</head>" + "</HTML>"
                + "<BODY BGCOLOR=\"LIGHTSTEELBLUE\">"
                +"<center>\n"
                + "<form action=\"VerbindungBS.java\" method=\"post\" name=\"entry\" "
                + "onSubmit=\"return validate(this)\"><input type=\"hidden\"value=\"list\" name=\"action\">\n"
                + "<table>\n"
                + "<tr>\n"
                + "<td>\n"
                + "<table bgcolor=\"POWDERBLUE\">"
                + "<tr>\n"
                + "<td colspan=\"2\" align=\"center\">"
                + "<h2><blink>Bibliothek</blink></h2>\n"
                + "</td>\n"
                + "</tr>\n"
                + "<tr>"
                + "<td colspan=\"2\">&</td>\n"
                + "</tr>"
                + "<tr>"
                + "<td>Buchtitel:</td>\n"
                + "<td><input name=\"titel\" type=\"text\" size=\"50\"></td>\n"
                + "</tr>"
                + "<tr>"
                + "<td>Author:</td>\n"
                + "<td><input name=\"author\" type=\"text\" size=\"50\"></td>\n"
                + "</tr>"
                + "<tr>"
                + "<td>Schlagwort:</td>\n"
                + "<td><input name=\"schlagwort\" type=\"text\" size=\"50\"></td>\n"
                + "</tr>"
                + "<tr>"
                + "<td colspan=\"2\" align=\"center\"><input type=\"submit\"value=\"..::: s u c h e n :::..\" size=\"30\"></td>\n"
                + "</tr>" + "</td>" + "</tr>" + "</form>" + "</center>" + "</BODY>"
                + "</HTML>");
            out.flush();
            out.close();
        }
    }
    catch (Exception e) {
        System.out.println(e.getMessage());
    }
}
```


----------



## SlaterB (21. Jan 2009)

out.flush(); 
            out.close(); 
sollte nicht im else-Fall stehen, sondern hinter der if-Verzweigung


----------



## cashmoney (21. Jan 2009)

VIELEN VIIELEN DANK ..... es zeigt nun an SIEHT alles bestens aus...nur eins noch...

wenn ich nach etwas in der Datenbank suche und auf suchen klicke oder eben nichts eingebe sollte er ja dann alles ausgeben was in der datenbank vorhanden ist..jedenfalls zeigt er mir nichts an nur en white Windows und in der Console steht das der Wert Null ausgibt , nur komischerweise hat es dort in der JSP funktioniert wo ist da den der Unterschied mit den NULL Wert ?


----------



## HLX (21. Jan 2009)

Hast du den Parameter 'action' gesetzt?


----------



## cashmoney (21. Jan 2009)

meinst du nicht die Zeile 24 bzw. 89 ?
wo muss ich den noch ein action paramenter setzen ? in JSP hatte ich es genauso ... =( hmmm


----------



## HLX (21. Jan 2009)

Ach so, dein Formular heisst 'action'. Ich gebe zu, ich habe mir dieses riesige Code-Monster nicht von vorne bis hinten durchgelesen.

Ich schlage vor, du schaust dir mal die Log-Datei deines Web Containers an oder debuggst den Code in einer Entwicklungsumgebung. Sonst wird das hier die Suche nach einer Nadel im Heuhaufen.


----------



## cashmoney (21. Jan 2009)

^^....@ HLX : Danke dir für die Unterstützung

ich habe nun komplett nachgeschaut etc. finde nicht den Grund warum das jetzt nicht läuft, zeigt mir nix an  wo der fehler liegt =( ohh mann....

Falls jemand den " Null " Problem erkennt, wäre ich euch SEHR DANKBAR wenn ihr es hier posten könnt
Vielen Dank


----------



## cashmoney (22. Jan 2009)

hat hier niemand was entdeckt, warum er immer " NULL "  ausgibt ? sorry falls ich euch damit nerve... =(


----------



## cashmoney (22. Jan 2009)

hat sich erledigt.........^^

da fehlte noch die while schleife für den Resultset


----------

