我有一个使用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。
希望我不会忘记任何东西!
非常感谢提前。
嘿,以“HttpSession的”和'session。(set/get)Attribute'it WorksS !!!太好了! ** Vinh Ba Tran **你摇滚!非常感谢! – graundechefe