# Servlet/JSP/JavaBean- Problem



## enkil (10. Sep 2004)

Hallo Leute!

Ich bin gerade dabei mich in Servlets, JSP und co einzuarbeiten. Ich bin momentan dabei simples Login zu implementieren. Aber hier bekomm ich schon Probleme:
Ich habe ein Controller-Servlet, das je nach Benutzereingabe auf verschiedene JSP-Seiten weiterleiten soll. Beim ersten Besuch der Seite wird meine login.jsp angezeigt. Ich lese die Formular-Variablen über einen LoginBean aus. Das erste Problem ist nun folgendes:
In allen Code-Beispielen die ich gesehen habe, wird der Scope der Bean meistens auf "Request" gesetzt, was ich auch sinnvoll finde. Ich leite den User nach Klicken auf den Login-Button wieder auf das Controller-Servlet weiter,  um den weiteren Verlauf zu entscheiden. Das Problem hierbei ist: Wenn ich ich auf mein Bean per

```
request.getSession();
LoginBean login = (LoginBean) request.getAttribute("loginHandler");
```
in meiner doPost-Methode zugreifen möchte bekomme ich eine NullPointerException. Mich würde interessieren woran das liegt, in allen Code-Beispielen die ich gefunden habe war der Scope des Beans auf Request und im Servlet wurde über den Request auf das Bean zugegriffen. Ausschnitt aus dem Code meiner JSP-Seite:

```
<%@ page language="java" session="true" import="java.util.Enumeration"%>
<jsp:useBean id="loginHandler" class="sep.prototyp.LoginBean" scope="request"/>
	<jsp:setProperty name="loginHandler" property="*"/>
<% loginHandler.validate(); %>
```
Wenn ich das Bean in die Session packe kann ich natürlich per session auf das Bean zugreifen, das würde für mich das Problem schon lösen, aber mich würde interessieren wie ich per Request auf das Bean zugreifen kann.
Das nächste Problem ist, dass das Servlet irgendwie eine Seite hintendran ist. Soll bedeuten: 
Eingabe von Benutzername und Passwort -> Klick auf login -> Weiterleitung auf das Servlet. 
Das Servlet soll nun Entscheiden ob die Login-Seite wieder angezeigt wird oder nicht. Wenn Benutzer und Passwort stimmen leitet er mich wieder auf die Login-Seite weiter. Wenn ich die Seite einfach reloade komm ich jedoch auf die gewünschte Seite! Hier ein Code-Stückchen aus meiner doPost-Methode:


```
session = request.getSession();
LoginBean login = (LoginBean) request.getAttribute("loginHandler");
        
// Forward to the login-page again, if the user's data is not valid
if (!login.validate()) {
    login.setErrorMessage("!login.validate()" + login.getUsername() + " " + login.getPassword());
    request.setAttribute("loginHandler", login);
    // Put the URL to the login-servlet back into the request
    loginURL = response.encodeURL("/Prototyp/login");
    request.setAttribute("loginURL", loginURL);
    // forward to the login-jsp
    String selfURL = response.encodeURL("/jsp/login.jsp");
    requestDispatch = request.getRequestDispatcher(selfURL);
    requestDispatch.forward(request, response);
// Forward to the user-preferences - provided logins are correct!
} else {
    userPrefsURL = response.encodeURL("/Prototyp/userprefs");
    request.setAttribute("userPrefsURL", userPrefsURL);
    requestDispatch = request.getRequestDispatcher("/jsp/userprefs.jsp");
    requestDispatch.forward(request, response);
}
```
Die ErrorMessage des Beans geben ich in der JSP-Seite aus. Zum Debuggen hab ich wie oben geschrieben mal folgendes gemacht:

```
login.setErrorMessage("!login.validate()" + login.getUsername() + " " + login.getPassword());
```
Hier kann ich an der JSP-Ausgabe erkennen, dass das Servlet irgendwie eine Seite hintendran ist:
Ich gebe username UserA ein -> login. Eigtl sollte er nun UserA anzeigen, macht er aber nicht. Wenn ich Reloade wird mir UserA angezeigt. Woran liegt das? Kann ich das irgendwie beheben?
Achja: Bei allen JSP-Seiten habe ich:

```
<META http-equiv="PRAGMA" content="NO-CACHE">
```
 verwendet...
Das nächste ist, dass man vielleicht sieht, dass ich oft encodeURL verwende. Ich bin mir bei der Handhabung noch nicht ganz sicher. Die Frage hierzu ist: Muss ich encodeURL für den RequestDispatcher verwenden?

Vielen Dank im Vorraus!


----------



## foobar (10. Sep 2004)

> Muss ich encodeURL für den RequestDispatcher verwenden?


encodeUrl mußt du in allen Methoden verwenden, in denen du eine URL aufrufst. Die Methode encodeURL hat den Nutzen, daß du später das Sessiontracking auch ohne Cookies durchführen kannst.


----------

