# Servlets: doGet, doPost und service



## T0M (5. Jun 2007)

Ich möchte ein Servlet schreiben, dass eine gesamte Webseite darstellt und das sich manchmal um Get- und Post-Anfragen kümmern muss, manchmal um beides und manchmal auch um keines davon. Welche Methode überschreibe ich dann, um die Seite anzuzeigen? 
Ich verstehe ehrlichgesagt nichtmal den Unterschied zwischen den drei Funktionen, vom Namen abgesehen erscheinen sie mir völlig gleich. Die Post- und Get-Parameter bekomme ich ja schließlich eh bei allen als HttpServletRequest-Objekt, oder nicht?


----------



## HLX (6. Jun 2007)

Die doGet-Methode wird automatisch dann ausgeführt wenn eine Anfrage über ein HTTP-GET erfolgt, z.B. wenn eine Seite per URL angefordert wird. Die doPost-Methode wird ausgeführt, wenn eine Anfrage über ein HTTP-POST erfolgt, also wenn Formular abgeschickt wird, z.B. per "Submit"-Button.

Die Service-Methode sollte nicht überschrieben werden. Sie unterscheidet die einzelnen HTTP-Methoden und ruft entsprechend die doGet, oder die doPost (oder die doHead...) auf.


----------



## T0M (6. Jun 2007)

Danke für deine Antwort, aber ganz klar ist es mir noch nicht. Denn oft sind doch Get- und Post-Anfragen gemischt, welche Methode wird dann aufgerufen? Oder werden beide Aufgerufen, dann wäre es ja ein Fehler, z.B. in der doPost-Methode die doGet-Methode aufzurufen, wie es in manchen Büchern empfohlen wird. 
Wenn ich dich richtig verstanden habe, ist es jedenfalls eine Get-Anfrage, wenn ein Servlet im Browser ohne jegliche Parameter aufgerufen wird?


----------



## HLX (6. Jun 2007)

DoPost und DoGet werden nicht gemischt aufgerufen.

Wenn ein Client via HTTP eine Anfrage an einen HTTP-Server schickt, verwendet er dazu immer *eine* HTTP-Methode, z.B. GET, POST, HEAD...

Die gebräuchlichsten sind GET und POST. Mit GET wird in der Regel eine Seite oder ein Inhalt angefordert. Man kann dabei auch Parameter über die URL übergeben. Das sieht man schonmal bei SessionIds, wenn Cookies ausgeschaltet sind. URL-Parameter können dann auf dem Server ausgelesen werden. Wenn man sich allerdings irgendwo anmelden muss, z.B. für einen Bestellvorgang, dann wäre es schon blöd, wenn das Kennwort in der URL zu lesen wäre. Hier kann man die HTTP-Methode POST verwenden. Dabei wird ein Datenblock mit Name/Wert-Paaren an die HTTP-Nachricht gehängt. 

In einer HTML-Seite kann man über POST Formulare übertragen. Dazu definiert man ein Formular mit

```
<form method="POST"...>
...
</form>
```
Für das Formular definiert man dann einen "Absenden"-Button, der das Formular mit der HTTP-Methode POST an den Server leitet. Geht die Anfrage nun an dein Servlet, ruft die 'service'-Methode die Methode 'doPost' auf.

Manche denken 'doPost' wäre für´s senden vom Server zum Client gedacht. Das ist ein Irrtum. Die einzelnen do-Methoden behandeln ausschließlich die HTTP-Methoden, die der Client zur Kommunikation verwendet hat. Das Senden der Inhalte muss nicht weiter angestoßen werden.

EDIT:
Wenn man in der 'doPost'-Methode 'doGet' aufruft, will man sicherstellen, dass bei beiden HTTP-Methoden das gleiche im Servlet passiert.


----------



## T0M (7. Jun 2007)

Danke für die 2. Antwort. Ich werde in meinem Servlet dann die doGet-Methode von der doPost-Methode aus aufrufen und in der doGet-Methode die ganze Seite ausgeben.


----------

