# Bei Weiterleitung von Servlet zu JSP: URL der JSP anzeigen



## MichiM (12. Dez 2007)

Guten Abend,

vorwiegend zu Übungszwecken bastle ich grad an einem Kontaktformular.
Drei Felder: Name, Email, Nachricht.

Hierbei möcht ich mich ans MVC-Konzept halten.

Die JSP enthält das Formular. Beim Abschicken wird ein Servlet aufgerufen, das die Daten verarbeitet (u.a. die Mail verschickt, ggf. Fehlercodes generiert, etc.), Ergebnis im Bean ablegt, anschließend (zunächst mal pauschal, ist ja nur ein Test) zur aufrufenden JSP weiterleitet, welche das Ergebnis präsentiert.

Funktioniert alles recht schön, allerdings bekomme ich dann, wenn ich den Scope auf "request" setze:


```
<jsp:useBean id="emailAbsenderBean" class="servlet.EmailAbsenderBean" scope="request" />
```

und im Servlet am Ende auf diese Weise:


```
RequestDispatcher dispatcher = request.getRequestDispatcher ( "kontakt.jsp" );
        dispatcher.forward ( request, response );
```

zur JSP weiterleite, in der Browser-Adresszeile die URL des *gemappten Servlets* angezeigt. Unschön.

Bei Verwendung von Scope "Session" (an sich ja unnötig) und Weiterleitung durch


```
response.sendRedirect( "/java/kontakt.jsp" );
```

ließe sich (zumindest) *das* zwar zunächst schöner hinkriegen, allerdings ist der Scope dann eben auch "Session" und ich krieg bei jedem Neubetreten des Formulars diejenigen Daten in die Felder gesetzt, die beim letzten Absenden des Formulars drinstanden. Auch wieder unschön. :wink:

Wie macht man das jetzt am Schönsten? Lässt sich das auch irgendwie so hinbiegen bzw. zurechtmappen, dass bei der Weiterleitung über Statuscode 302 vom Servlet zur JSP dann wirklich der Name der JSP angezeigt wird und nicht der des gemappten Servlets?

Gruß Michi


----------



## bronks (12. Dez 2007)

Das ist eine klassische Falschanwendung des MVC-Pattern, wie sie fast überall im Internet und in vielen Büchern herumgeistert. 

Richtigerweise wird immer nur der Controller aufgerufen, welcher entscheiden muß was angezeigt werden soll. Bei WebApps wird das in fast allen fällen vermurxt dargestellt, weil die Möglichkeit zur Schlamperei offensteht und als erstes die JSP aufgerufen wird.


In Zusammenhang mit meinem ersten Absatz: http://www.java-forum.org/de/topic60683_jeder-depp-schreibt-cher.html


----------



## ms (12. Dez 2007)

Irgendwie scheinen in letzter Zeit die URLs wichtiger zu sein als der Inhalt.
Gebe bronks völlig recht.
Was wenn der Inhalt nicht von Jsp's sondern von sagen wir Velocity-Templates oder per XML-XSLT-Transformation generiert wird?

ms


----------



## maki (12. Dez 2007)

```
response.sendRedirect( "/java/kontakt.jsp" );
```
Pfui!  :bloed: 

Schliesse ich mich bronks und ms an.


----------



## MichiM (14. Dez 2007)

Kennt jemand von Euch einen Artikel, der die Umsetzung des hier favorisierten Pattern (ausschließlicher Controlleraufruf) mit mustergültigem (möglichst kurzen) Beispiel unter Beteiligung aller drei Schichten beschreibt?

Den eigentlichen Kritikpunkt hab ich mangels Horizontbreite aus dem oben Gesagten noch nicht richtig erfasst, zumal ja - wie angedeutet - der Großteil der Literatur eben anderes zur konkreten Umsetzung der Idee propagiert.  :wink:

Vorteilhaft für den Anfänger wäre auch, wenn dabei knapp und präzise darüber aufgeklärt wird, wo die praktischen Schwachstellen der Literaturvariante (JSP ruft Servlet auf, Servlet speichert Daten in Bean, leitet weiter zu JSP und JSP stellt Daten aus Bean dar) und die Stärken der alternativen Variante (ausschließlicher Controlleraufruf) liegen.

(Das Pfui ist da im Moment noch bisschen zu abstrakt für mich.   )


----------



## maki (14. Dez 2007)

> (Das Pfui ist da im Moment noch bisschen zu abstrakt für mich. icon_biggrin.gif )


Das Pfui erklärt:
Du machst einen redirect, keine Weiterleitung:


> response.sendRedirect( "/java/kontakt.jsp" );


D.h. du schickst dem Client (Browser) die Anweisung, direkt auf die JSP zu gehen, das verletzt die Regeln des MVC Prinzips, wo alle(!) Client anfragen über den Controller laufen müssen.

Der Controller (Servlet) "besorgt" dann die Daten (Model) und leitet den Request an die passende View (JSP) intern weiter.
Das ist einer der Gründe, warum die URL immer "falsch" ist bzw. ignoriert werden sollte, ein andere ist, das Daten auf per POST geschickt werden können (und meistens auch sollen).


----------



## Ralf Ueberfuhr (15. Dez 2007)

Ihr mögt ja alle Recht haben, aber eine Möglichkeit habt ihr nicht betrachtet.

Für Webanwendungen gibt es zwei Mechanismen: Push und Pull. Webframeworks wie Struts und JSF nutzen den Push-Mechanismus, d.h. es wird der Controller aufgerufen, der leitet weiter an die JSP.

Es gibt aber auch Frameworks, die den Pull-Mechanismus anwenden (auch "komponentenbasiert"), z.B. JBoss Seam oder Tapestry. Bei denen wird der View aufgerufen, und der View holt sich dann Informationen von sogar mehreren Controllern.

Das würde für den Threadstarter heißen, direkt auf die JSP zu verlinken und dort das Servlet/die Servlets zu inkludieren.
Ist eben auch ein wenig Geschmackssache.

@Threadstarter: URLs sollen doch nur wegen Suchmaschinen und Lesezeichen schön sein. Das kannst du auch mit nem URL-Mapping schaffen. Mappe eine URL "irgendwas.jsp" auf ein Servlet. Dann hast du MVC2 UND ne schöne URL.


----------

