# Servlet auf sich selbst verweisen lassen (Anfängerfrage)



## wyldstyle (2. Nov 2010)

Hallo ihr da draußen, im Rahmen der Uni versuche ich mich in Servlets einzuarbeiten und bin da auf einen Logikfehler gekommen den ich mir nicht erklären kann.

Folgende Aufgabe: Es soll ein Servlet erstellt werden zum verwalten einer Datenbank.
Der erste Schritt ist hierbei eine Verweisseite die auf die einzelnen Funktionsseiten verweist und hier hänge ich bereits.

Mal als Code kurz umrissen:


```
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html");
		out = response.getWriter();
		out.println("<html><body>");
		out.println("<h1>Hauptmenue</h1>");
		out.println("<hr/>");
		out.println("<ul>");
		out.println("<li>  Link zu der Funktion </li>");
		out.println("</ul>");
		out.println("</body></html>");
	}
```

Ich weiss einfach nicht wodrauf ich den Link verweisen lassen soll, denn die Seiten sollen halt erst vom Servlet erzeugt werden und existieren noch nicht, wodrauf also den link verweisen lassen!? Optimal wäre es wenn ich einen Link auf einen methodenaufruf um servlet verweisen könnte aber das geht nicht oder?
Wie löst man sowas bitte!?

Grüße,
wyldstyle


----------



## SlaterB (2. Nov 2010)

Seiten existieren generell nicht und werden auch nicht einmal erzeugt so dass sie dann 'da' sind

ein typischer Link ist /index oder so, der führt zu einem Servlet falls gemappt, dieses schreibt Output oder leitet an eine JSP weiter je nach verwendetem Framework,
ganz danach wie alles konfiguriert ist

irgendwelche laufenden Beispielanwendungen bekannt?


----------



## wyldstyle (2. Nov 2010)

Laufende Beispiele gibt es generell nicht, ist eine Übungsaufgabe der Uni. Ich poste dir mal die Aufgabenbeschreibung, vielleicht hab ich das auch einfach total falsch verstanden:



> *In der folgenden Aufgabe soll ein Servlet erstellt werden, welches uber eine JDBC - Datenbankverbindung
> dynamische HTML-Seiten erzeugt, welche Daten aus einer Datenbank
> enthalten.* Nennen Sie die Datei DB.java bzw DB.class und verwenden Sie kein Package,
> um die Korrektur zu vereinfachen. Die bisher verwendete Musik-Datenbank von Blatt 1 soll
> ...




Daraus leite ich jetzt ab:
bei aufruf des servlets wird eine seite erzeugt die 3 links anbietet: "anzeigen aller alben","hinzufügen eines albums", "entfernen eines albums". Durch klick kommt man auf die enstsprechende seite. aber wodrauf sollen die links nur verweisen !? es soll halt in einem servlet realisiert werden <.<


----------



## SlaterB (2. Nov 2010)

Links kann wirklich völig beliebig wählen, schau dir die URL oben im Browser an
> http://www.java-forum.org/web-tier/108134-servlet-selbst-verweisen-lassen-anfaengerfrage.html

```
http://www.java-forum.org/web-tier/108134-servlet-selbst-verweisen-lassen-anfaengerfrage.html
```
es gibt nirgendwo eine Festplatte wo eine entsprechend benannte html-Datei rumliegt,
der Link wird dynamisch verarbeit, auch 

```
http://www.java-forum.org/web-tier/108134-a.html
```
führt zur selben Seite, nur die Thread-Id am Anfang ist wichtig, der Rest ist schmückendes Beiwerk,
diese URL/ dieser Link wird an ein Servlet bzw. PHP-ähnliches geleitet wo die Id ausgewertet und eine Antwort-Seite dynamisch geschrieben wird

also sind Links erstmal Schall und Rauch, je nach Konfigurations-Möglichkeiten kannst du durchaus

```
/AnzeigeAllerAlben
/Hinzufügen
/ZeigeAlbum-Rolling-Stones
/ZeigeAlbum?id=42
```
und so weiter schreiben, was dir einfällt,
der Link bewirkt nichts anderes, als das dann eine entsprechende Anfrage gestellt wird,
ob der WebServer diese verarbeiten kann entscheidet sich dann wenn die Anfrage kommt

----

so viel allgemein zu Links gesagt, ob dein bestimmtes Programm das alles kann ist eine andere Frage

sehr komisch finde ich den Satz
>  Nennen Sie die Datei DB.java bzw DB.class und verwenden Sie kein Package, um die Korrektur zu vereinfachen.
DB ist ein schlechter Name für ein Servlet und ohne package kann die Klasse garantiert von keinem Webserver dieser Welt genutzt werden,
das klingt mehr nach einfachen Dummy-Programm wozu meine allgemeinen Erläuterungen vielleicht nicht sehr weit helfen

nach meiner Vorstellung würde das jedenfalls z.B. so aussehen:

```
if ("Hauptmenue".equals(request)) {
  // erstelle Hauptmenü-Seite
} else if ("ZeigeAlleAlben".equals(request)) {
  // erstelle AlleAlben-Seite
}
usw.
```


----------



## wyldstyle (2. Nov 2010)

Ich hab halt nur das eine Servlet was ich nutzen soll, bei Aufruf wird eine Indexseite erzeugt und beim Klick drauf halt die andern Seiten dynamisch.

So wie du das meinst, wäre die Indexseite ja quasi extern und würde mit dem servlet kommunizieren. Es ist halt so gedacht, dass das Servlet erst die Indexseite erzeugt. Und dann kommt das problem, dass ich mich selbst referenzieren muss bzw das servlet mit 2 isntanzen laufen muss dafür.

bsp:


```
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html");
		System.out.println("test");
		out = response.getWriter();
		out.println("<html><body>");
		out.println("<h1>Hauptmenue</h1>");
		out.println("<hr/>");
		out.println("<ul>");
		out.println("<form action=\"DB\" method=\"POST\"><input type=\"submit\" value=\"Submit\"></form>");
		out.println("</ul>");
		out.println("</body></html>");

	}
```

erzeugt ne htmlseite mit nem button bei dessem druck DB (das servlet) aufgerufen werden soll. apache mag das aber absolut nicht und ich weiss nicht wie diese selbstreferenzeirung gehen soll?


----------



## SlaterB (2. Nov 2010)

nun, ich habe alles dazu gesagt was ich soweit sagen kann

'apache mag das aber absolut nicht' ist eine ziemlich ungenaue Fehlermeldung, aber da gibts auch tausende Einstellungen damit verschiedenste Dinge funktionieren,
ohne Einweisung/ Test-Web-Anwendung kann man dazu eigentlich gar nichts machen

---
wie gesagt kann eine Java-Klasse DB ohne package unmöglich von einem anderen Java-Programm wie z.B. Apache verwendet werden


----------



## jann (9. Nov 2010)

Deine Klasse DB.java:


```
...
out.println("<li><a href=\"http://www.deinserver.de:8080/deinVerzeichnis/DB\">Hauptmenue</a></li>");
...
```

Unter der Vorraussetzung, dass der Tomcat auf Port 8080 angesprochen wird und Deine DB.class im Verzeichnis "deinVerzeichnis" liegt. Der erste Aufruf dieses Servlets über den Browser sieht dann so aus:

http://www.deinserver.de:8080/deinVerzeichnis/DB

Ob Du die Portangabe brauchst hängt aller dings ganz von der Konfiguration Deines Servers ab. Ist für das Verständis aber auch unwichtig.

Das Servlet DB.class erzeugt als Rückgabewert das HTML, das den Browser veranlasst Dir die Startseite anzuzeigen, in der dann das Wort Hauptmenue als Link wiederum auf das Servlet verweist.


----------

