2016-06-12 5 views
0

Ich habe eine Webanwendung, die JSF-Seiten und Entitätsklassen verwendet, in denen sich ein Benutzer authentifizieren muss, um einige Übungen für seine Schüler veröffentlichen zu können.JSF übergeben Objektwerte zwischen Controllern

In der Entity-Klasse, ein "user" Objekt hat: id (int), Login (string), Passwort (string) und Typ (string)

In meiner "Benutzer" Controller Bohne, ich habe Eine Methode, um festzustellen, ob der Benutzer bereits in der Datenbank vorhanden ist. Und dieser Prozess läuft gut. Alles funktioniert gut. Also, ich weiß sicher, dass ein "Benutzer" -Objekt mit den richtigen Daten instanziiert wird.

Ich habe einen anderen Controller, der in einer anderen JSF-Seite verwendet wird, wo der Benutzer eine Übung veröffentlichen kann.

In der Entity-Klasse, eine "Übung" Objekt hat: id (int), Benutzer-ID (int) (Fremdschlüssel-ID auf Nutzer), Beschreibung (string) usw.

Wenn ich bin Vorbereitung des "Übung" -Objekts in der "Übungen" -Controller, um in der Datenbank zu speichern, muss ich Zugriff auf das "Benutzer" -Objekt in der anderen Steuerung haben, um die BenutzerID zu setzen. Und das ist der Grund meiner Kopfschmerzen! Weil die userID immer auf null setzt !!!

Ich habe versucht mit @Named und @Inject (empfohlen), auch mit @Managedbean und @ManagedProperty (was sie sagen, wird veraltet sein) ... Versucht mit einzelnen und gemischten Kombinationen von @RequestScoped und @SessionScoped .. Versuchen Sie, das "Benutzer" -Objekt in einer @ PostConstruct-Methode in "Übungen" -Controller instanziiert ... Habe schon viele Beispiele gelesen, wie es geht, aber nichts davon funktioniert!

Ich weiß, das ist ein sehr grundlegendes Problem, das ich habe! Und es besteht nur darin, ein Objekt von einem Controller an einen anderen zu übergeben! Noch kein Erfolg, nach zwei Tagen des Experimentierens! Das macht mich verrückt!

Bitte helfen

!:

"Benutzer" Regler

package controlers; 

import beans.UtilizadoresFacade; 
import entities.Utilizadores; 
import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.List; 
import javax.ejb.EJB; 
import javax.enterprise.context.RequestScoped; 
import javax.inject.Named; 

@Named("utilizadoresController") 
@RequestScoped 
public class UtilizadoresController implements Serializable { 

    @EJB 
    UtilizadoresFacade ejbFacade; 
    Utilizadores utilizador = new Utilizadores(); //The one i want to pass to the other controller 
    List<Utilizadores> utilizadores = new ArrayList(); 

    public Utilizadores getUtilizador() { 
     return utilizador; 
    } 

    public void setUtilizador(Utilizadores utilizador) { 
     this.utilizador = utilizador; 
    } 

    public List<Utilizadores> getUtilizadores() { 
     return utilizadores = (List<Utilizadores>)ejbFacade.consultarUtilizadores(); 
    } 

    public String verificarUtilizador() { // method to verify the user in database by name and password 
    utilizadores = (List<Utilizadores>)ejbFacade.consultarUtilizador(utilizador.getNome(), utilizador.getSenha()); 
     if(utilizadores.isEmpty()) 
      return "index.xhtml"; 
     else if(utilizadores.get(0).getTipo().equals("normal")) { 
      utilizador.setId(utilizadores.get(0).getId()); // Here is where i save the ID to "user" object 
      return "normal.xhtml"; 
     } 
     else { 
      utilizador.setId(utilizadores.get(0).getId()); 
      return "administrador.xhtml"; 
     } 
    } 

    public String criarUtilizador(){ // this method is to add new user to database and it works fine. 
     ejbFacade.adicionarUtilizador(utilizador); 
     if(utilizador.getTipo().equals("normal")) 
      return "normal.xhtml"; 
     else 
      return "administrador.xhtml"; 
    } 
} 

"Übungen" Controller

package controlers; 

import beans.ExerciciosFacade; 
import entities.Exercicios; 
import entities.Ucs; 
import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.List; 
import javax.ejb.EJB; 
import javax.enterprise.context.RequestScoped; 
import javax.inject.Inject; 
import javax.inject.Named; 

@Named("exerciciosController") 
@RequestScoped 
public class ExerciciosController implements Serializable { 

    @EJB 
    ExerciciosFacade ejbFacade; 
    @Inject 
    UtilizadoresController utilizadoresController; 
    Ucs cadeira = new Ucs(); //this is a discipline 
    Exercicios exercicio = new Exercicios(); 
    List<Exercicios> exercicios = new ArrayList(); 

    public List<Exercicios> getExercicios(){ 
     return exercicios = (List<Exercicios>)ejbFacade.consultarExercicios(); 
    } 

    public String criarExercicio(){ // Method to add an exercise to database 
     exercicio.setUcid(cadeira); // Sets de discipline ID to "exercise" object (another foreign key) and works well because this value comes from a form in JSF page 
     exercicio.setUtilizadorid(utilizadoresController.getUtilizador()); // This is where i try to set de user ID to "exercise" object 
     ejbFacade.adicionarExercicio(exercicio); 
     return "normal.xhtml"; 
    } 

    public Exercicios getExercicio() { 
     return exercicio; 
    } 

    public void setExercicio(Exercicios exercicio) { 
     this.exercicio = exercicio; 
    } 

    public Ucs getCadeira() { 
     return cadeira; 
    } 

    public void setCadeira(Ucs cadeira) { 
     this.cadeira = cadeira; 
    } 
} 

Ich denke, die "Benutzer" Controller @SessionScoped werden sollte, weil ich sein werde Ich brauche die Benutzerdaten, während er durch die Seiten navigiert, aber ich habe auch @RequestScoped verwendet, damit es nicht mehr Konflikte gibt, die ich nicht kontrollieren kann !!!

Noch eine Sache: Ich arbeite mit Netbeans 8.1 und Java DB auch von Netbeans.

Hoffe ich vergesse nichts!

Vielen Dank im Voraus.

Antwort

0

Ich extrahiere einige Codezeilen aus meinem Projekt. Hier ist die Klasse zu halten Benutzersitzung

SessionPreferences.java 

@ManagedBean(name = "sessionPreferences") 
@SessionScoped 
public class SessionPreferences implements Serializable { 

    public static User getLoggedInUser() { 
     try { 

      HttpSession session = (HttpSession) FacesContext.getCurrentInstance() 
        .getExternalContext().getSession(false); 
      User authenticatedUser = (User) session.getAttribute("username"); 
      return authenticatedUser; 

     } catch (Throwable e) { 
      log.error("Error getting logged in user", e); 
      return null; 
     } 
    } 

} 

und die Anmeldung Validierung

public String validateUsernamePassword() { 
    CryptWithMD5 clss = new CryptWithMD5(); 
    String md5Pwd = clss.cryptWithMD5(pwd); 
    boolean valid = DBConnection.validate(user, md5Pwd); 
    if (valid) { 
     HttpSession session = SessionBean.getSession(); 
     session.setAttribute("username", user); 
     return "index"; 
    } else { 
     FacesContext.getCurrentInstance().addMessage(
       null, 
       new FacesMessage(FacesMessage.SEVERITY_WARN, 
         "Incorrect Username and Passowrd", 
         "Please enter correct username and Password")); 
     return "login"; 
    } 
} 

Von nun an kann ich User-Objekt durch die Methode

SessionPreferences.getLoggedInUser() 
+0

Hey, mit 'Http' bekommen und 'Sitzung. (set/get) Attribut' es funktioniert !!! Groß !!! ** Vinh Ba Tran ** Sie rocken !!! Vielen, vielen Dank! – graundechefe

Verwandte Themen