JSF Daten aus ManagedBean können vom Controller gelesen werden

Headhunter_X

Mitglied
Hallo,

ich habe eine Seite login.jsp. Den Username und das Passwort schreibe ich in eine ManagedBean. Die MB ist als <Session> deklariert.

Darauf folgen noch zwei weiter Seiten, auf denen man Daten in ein Formular eintragen kann.
Auf der letzten Seite möchte ich dann alle Informationen der vorherigen Seiten in eine Datenbank schreiben. Die Daten der letzen Seite sind dann auch verfügbar und können ohne Probleme in die Datenbank geschrieben werden. Jedoch ist die Property USername der Seite login.jsp in der DB leer. Wenn ich die Property aber auf der JSP-Seite ausgeben lasse, ist sie noch da. Das heißt, irgendwie muss der Fehler zwischen Login und Controller liegen.


ManagedBean
Java:
public class Login
{
    private String username="";
    private String userpass="";

    Controller controller ;

    public LoginController()
    {}

    public void setUsername(String username)
    {
        this.username = username;
        System.out.println("Login: " +this.username);
        this.controller = new Controller();
        this.controller.setqNumber(this.username);
    }

    public String getUsername()
    {
        return this.username;
    }

    public void setUserpass(String userpass)
    {
        this.userpass = userpass;
    }

    public String getUserpass()
    {
        return this.username;
    }



Controller:

Java:
public class Controller
{
    private ArrayList<SelectItem> allApplications = new ArrayList<SelectItem>();
    private ArrayList<SelectItem> testRoles;
    private int selectedOptionsId=0;
    private int selectedRoleId=0;
    private String justificationText ="";
    private String username="";
        
    private Login login = new Login();
    private GiveRolesModel roleModel = new GiveRolesModel();
    private OrderModel orderModel = new OrderModel();
    
    public Controller()
    {
        allApplications.add(new SelectItem(0,"Wählen Sie"));
        allApplications.add(new SelectItem(1,"Test1"));
        allApplications.add(new SelectItem(2,"Test2"));
    }

    public void setSelectedRoleId(int selectedRoleId)
    {
        this.selectedRoleId = selectedRoleId;
    }

    public int getSelectedRoleId()
    {
        return this.selectedRoleId;
    }

    public void setSelectedOptionsId(int selectedOptionsId)
    {
        this.selectedOptionsId = selectedOptionsId;
    }

    public int getSelectedOptionsId()
    {
        return this.selectedOptionsId;
    }

    public ArrayList<SelectItem> getApplications()
    {
        return this.allApplications;
    }

    public ArrayList<SelectItem> getTestRoles()
    {
        this.roleModel.setSID(getSelectedOptionsId());
        this.testRoles = this.roleModel.getTestRoles();

        return this.testRoles;
    }

    public void setJustificationText(String justificationText)
    {
        this.justificationText = justificationText;
    }

    public String getJustificationText()
    {
        return this.justificationText;
    }

    public String delegateOrder()
    {
        this.username = this.login.getUsername();
        this.orderModel.setOrder(this.justificationText, this.username);

        return "login";
    }
}

Letzte JSP-Seite:
HTML:
 <h:form id="form1">
    <p>
    <h:selectOneListbox required="true" requiredMessage="Bitte eine Rolle auswählen." id="listOfroles" value="#{Controller.selectedRoleId}" >
        <f:selectItems id="role" value="#{Controller.testRoles}"></f:selectItems>
    </h:selectOneListbox>
                </p>
                  <br>
                <p>Bitte geben Sie eine kurze Begründung für Ihre Antragsstellung ein:</p>
                <p>
             <h:inputTextarea id="begr_as" value="#{Controller.justificationText}" styleClass="" cols="50" rows="5" required="true" requiredMessage="Bitte Begründung eingeben." ></h:inputTextarea>
                                        </p>
                                        <p style="font-size:10px;">Max. 150 Zeichen.</p>
                                        <br>
                                        <p><h:commandButton styleClass="button"  value="Antrag absenden" id="save" action="#{Controller.delegateOrder}"  /></p>
                                    </h:form>

Java:
public void setOrder(String justificationText, String username)
    {
        this.justificationText = justificationText;
        this.username = username;

        dbQuery = new DatabaseQuery();
        this.dbQuery.setUpdate("INSERT INTO ANTRAEGE VALUES(1,"+"'"+this.username+"'"+",'Test','Test','Test','in Bearbeitung','Test','Test','Test',"+"'"+this.justificationText+"'"+",'K.A.')");
        this.result = this.dbQuery.getQuery();
    }
 
Zeig mal deine Login-Seite. Ich vermute, dass du dort Benutzernamen und Passwort in ein anderes Objekt speicherst, als das, aus dem du später den Benutzernamen ausliest.

Gruß Fant
 
Hallo Fant,
hier meine Login-Seite:

HTML:
 <h:form id="form">
      <p>
         <h:panelGrid columns="2">
                  <h:outputLabel for="username" value="Username:"></h:outputLabel>
               <h:inputText id="username" required="true" value="#{LoginController.username}" ></h:inputText>
              <h:outputLabel for="userpass" value="Passwort:"></h:outputLabel>
                <h:inputSecret id="userpass" required="true" value="#{LoginController.userpass}" ></h:inputSecret>
                  </h:panelGrid>
           <h:commandButton value="Login" action="#{LoginController.login}" ></h:commandButton>
      </p>
</h:form>

Bemerkung zur vorher geposteten Managed-Bean: Die Klasse heißt natürlich auch LoginController, nicht nur Login.
 
Beim Drücken des CommandButtons auf der login-Seite speicherst du Benutzer und Passwort in einer Instanz der Bean LoginController.

In der anderen Controller-Klasse wird ebenfalls ein Objekt der Klasse LoginController angelegt (oder ist das doch noch eine anderen Klasse mit dem Namen Login?) aus der du den usernamen ziehst. Da steht zu diesem Zeitpunkt aber doch nur ein leerer String drin. Folglich wird auch ein leerer String an die Funktion setOrder übergeben.

Andersherum das gleiche Spiel. In der Funktion setUsername in der Klasse LoginController legst du ein Objekt vom Typ Controller an. Mal abgesehen davon, dass ich im von dir geposteten Code die Funktion setqNumber nicht finden kann, musst du dir klar darüber sein, dass das nicht das gleiche Objekt ist, dass du später auf der anderen jsf-Seite über #{controller...} ansprichst.

Gruß Fant
 
Hallo Fant,

danke für die Info. Wenn das dann nicht mehr das gleiche Objekt ist, wie komme ich denn dann wieder an den Usernamen ran? Denn wenn ich auf der letzten Seite ein OutputLabel mit #LoginController.username setzte, gibt er den aktuellen Usernamen ja wieder aus.
 
In #{LoginController.userName} speicherst du ja auch auf der ersten Seite den Benutzernamen.

Mach auf deiner letzten Seite doch mal eine Ausgabe von dem, was in #{Controller.LoginController.userName} steht. DIESEN Wert versuchst du nämlich zu speichern!


Um an den gewünschten Wert zu kommen gibt es verschiedene Möglichkeiten. Du kannst per @Inject-Annotation die Werte aus der LoginController-Bean in die Controller-Bean injizieren. Oder du legst auf der ersten Seite nach erfolgreicher Anmeldung den Benutzer in der Session ab. Oder du übergibst den Wert per Request-Parameter, oder oder oder ... welcher Weg der beste ist hängt natürlich immer davon ab, was genau gemacht werden, wie schnell der Zugriff erfolgen muss, wie sicher das ganze gegenüber Manipulationen sein muss usw.

Gruß Fant
 
Hallo Fant,

danke für den Hinweis. Jetzt funktioniert es. Ich hab Dependency Injection gewählt.
Dafür hab ich dann den LoginController als <bean-property> bei Controller angegeben.
Zusätzlich dann noch get- und set-Methode in der Klasse Controller von LoginController angelegt und es läuft.
 
Zuletzt bearbeitet:

Zurück
Oben