2016-06-12 65 views
0

我有一个使用JSF页面和实体类的Web应用程序,用户必须通过身份验证才能向学生发布一些练习。JSF在控制器之间传递对象值

在实体类, “用户” 对象有: ID(INT),登录(串),密码(字符串)和类型(字符串)

在我的 “用户” 控制豆,我有一种方法来查看用户是否已经存在于数据库中。那个过程进展顺利。一切工作正常。所以,我知道一个“用户”对象是用正确的数据实例化的。

我有另一个控制器,在另一个用户可以发布练习的JSF页面中使用。

在实体类,一个 “锻炼” 对象有: ID(INT),用户ID(INT)(外键上的用户ID),描述(字符串)等

当我在“Exercises”控制器中准备“练习”对象,保存到数据库,我需要访问另一个控制器中的“用户”对象来设置用户ID。这就是我头痛的原因!因为用户ID allways设置为空!

我已经尝试过@Named和@Inject(推荐),还有@Managedbean和@ManagedProperty(他们说这将被弃用)......尝试使用@RequestScoped和@SessionScoped的单一和混合组合。尝试在“Exercises”控制器中实例化@PostConstruct方法中的“user”对象...已经阅读了很多关于如何执行它的示例,但没有一个可行!

我知道这是一个非常基本的问题,我有!它只包含如何将一个对象从一个控制器传递到另一个控制器!经过两天的试验,仍然没有成功!这真让我抓狂!

请帮助!:

“用户” 控制

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"; 
    } 
} 

“演习” 控制器

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; 
    } 
} 

我认为 “用户” 控制器应@SessionScoped因为我会在浏览页面时需要用户数据,但我也使用了@RequestScoped,所以不会有更多的冲突我无法控制!

还有一件事:我正在使用Netbeans的Netbeans 8.1和Java DB。

希望我不会忘记任何东西!

非常感谢提前。

回答

0

我从我的项目中提取了一些代码行。 这里是保持用户会话

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; 
     } 
    } 

} 

和登录验证

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"; 
    } 
} 

从现在的课,我可以通过方法来获取用户对象

SessionPreferences.getLoggedInUser() 
+0

嘿,以“HttpSession的”和'session。(set/get)Attribute'it WorksS !!!太好了! ** Vinh Ba Tran **你摇滚!非常感谢! – graundechefe