Olá pessoal,
Estou fazendo um sistema de login, pra aprender um pouco sobre o JSF com Faces, me disseram que é melhor que JSP, correto?
Bom, estou trabalhando da seguinte maneira:
Tenho uma pasta com três Controllers:
MainController;
HomeController;
LoginController;
Vou mostrar o conteúdo de cada um , ficou bem simples e vou ignorar os gets e sets para ficar mais fácil de visualizar ok?
MainController:
[code]package com.erp3.gui.controllers;
import javax.faces.context.FacesContext;
public class MainController {
public LoginController loginController;
public MainController() {
this.checkUserSession();
}
public String checkUserSession() {
loginController = (LoginController) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("loginController");
if (!loginController.getIsLoggedIn()) {
return "login.html";
} else {
return null;
}
}
}[/code]
HomeController:
[code]package com.erp3.gui.controllers;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
@ManagedBean
public class HomeController extends MainController {
public String username;
public HomeController() {
super();
}
}[/code]
LoginController:
[code]
package com.erp3.gui.controllers;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
@ManagedBean
public class LoginController {
public Boolean isLoggedIn = false;
private String username;
private String password;
private FacesMessage msg;
public String login() {
if (this.getUsername().equals("daniel") && this.getPassword().equals("123")) {
this.isLoggedIn = true;
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("loginController", this);
return "home.html";
} else {
this.isLoggedIn = false;
msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Usuário ou senha inválida.", username);
FacesContext.getCurrentInstance().addMessage(null, msg);
return "login.html";
}
}
public String logOut() {
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("loginController");
return "login.html";
}
}[/code]
Então, fiz algumas pesquisas e vi esta maneira de criar uma sessão: FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("loginController", this);
, não sei se a maneira correta ou mais indicada ou quem sabe a única.
O que acontece é que no meu MainController, eu verifico a existência desta sessão loginController para direcionar o usuário para o login.html caso não tenha sessão ativa.
No meu arquivo master.xhtml tenho o seguinte código:
*Exclui as tags HTML para facilidade de leitura.
<ui:fragment rendered="#{loginController.isLoggedIn}">
<ui:include src="../includes/top.xhtml"/>
</ui:fragment>
<ui:insert name="body" />
<hr />
<ui:fragment rendered="#{loginController.isLoggedIn}">
<ui:include src="../includes/footer.xhtml" />
</ui:fragment>
Ou seja, verifiquei no meu Bean LoginController se a variável isLoggedIn é true ou false, isto esta funcionando perfeitamente, se eu tentar acessar a página home.xhtml sem fazer o login estes dois fragments não aparecem mas o conteúdo da página aparece e pelo que percebi, o meu arquivo MainController não esta executando a função checkUserSession como eu esperava.
Outra coisa, quando faço o login, sou direcionado para home.xhtml mas a URL não muda e se eu digitar na URL o caminho para home.html ele não mostra os fragments e em algumas vezes ele da um erro dizendo que não posso instanciar a classe HomController
Eu gostaria de saber também se quando eu chamo alguma página, por exemplo, home.xhtml, o Java executa o HomeController ou simplesmente abre o arquivo home.xhtml?
Alguma ideia?
Muito obrigado.