JSF在控制器之间传递对象值

时间:2016-06-12 22:59:06

标签: jsf jsf-2

我有一个使用JSF页面和实体类的Web应用程序,用户必须进行身份验证才能向学生发布一些练习。

在实体类中,“用户”对象具有: id(int),login(string),password(string)和type(string)

在我的“用户”控制器bean中,我有一个方法来查看用户是否已经存在于数据库中。这个过程进展顺利。一切都很好。所以,我肯定知道“用户”对象是用正确的数据实例化的。

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

在实体类中,“exercise”对象具有: id(int),userID(int)(用户ID的外键),description(string)等。

当我在“exercise”控制器中准备“exercise”对象时,为了保存到数据库,我需要访问另一个控制器中的“user”对象来设置userID。这就是我头痛的原因!因为userID总是设置为null !!!

我尝试使用@Named和@Inject(推荐),还使用@Managedbean和@ManagedProperty(他们说会弃用)...尝试使用@RequestScoped和@SessionScoped的单一和混合组合...尝试在“exercise”控制器中的@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。

希望我不会忘记任何事情!

非常感谢提前。

1 个答案:

答案 0 :(得分: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";
    }
}

从现在开始,我可以通过方法获取User对象

SessionPreferences.getLoggedInUser()