我有一个使用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。
希望我不会忘记任何事情!
非常感谢提前。
答案 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()