Witam. Pisze dynamiczną aplikację internetową i mam pewien problem. Mianowicie posiadam 4 klasy zmapowane z tabel w bazie danych opisujące użytkowników, którzy mogą się logować do systemu. I mam taką wątpliwość co do implementacji metody odpowiedzialnej za logowanie. Stworzyłem JSF managedBeana i tam właśnie umieściłem metodę odpowiedzialną za logowanie, który wygląda następująco.
@ManagedBean
@RequestScoped
public class LoginMB {
private static final String PERSISTENCE_UNIT_NAME = "ePrzychodnia-ejbPU";
private static EntityManagerFactory factory;
private String login;
private String password;
/**
* Creates a new instance of LoginMB
*/
public LoginMB() {
}
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String validate() {
factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
EntityManager em = factory.createEntityManager();
Query q = em.createQuery("SELECT a FROM Admin a WHERE a.personalId = :login AND a.password = :password");
q.setParameter("login", login);
q.setParameter("password", password);
try {
Admin admin = (Admin)q.getSingleResult();
if (login.equals(admin.getPersonalId()) && password.equals(admin.getPassword())) {
return "admin";
}
} catch (Exception e) {
System.out.println("Błąd: " + e.getMessage());
return "failed";
}
return "failed";
}
}
Rozchodzi mi się o tą metodę validate. Wszystko oczywiści działa tak jak tego chciałem, ale wiem, że w JSF tworzymy wygląda naszej aplikacji i nie powinno się tam umieszczać skomplikowanych obliczeń takich jak np. operacje na bazie danych. Jednak zupełnie nie wiem gdzie takowy kod miałbym umieścić? Poza tym mam klasy reprezentujące te 4 typy użytkowników mapujące tabele w bazie danych. Klasy DAO i fasady dla każdego typu użytkownika. Więc gdzie niby miałbym umieścić ten kod jeśli nie w managedBeanie? Tworzyć osobną klasę, w które zaimplementuję tą metodę a w managedBeani stworzyć zmienną reprezentująca tę klasę? Czy jak to się powinno robić?
Mam jeszcze pytanie dotyczące metody logującej validate umieściłem tam tylko sprawdzanie tabeli admin w poszukiwaniu danego użytkownika. Jednak będą musiał powielić ten kod dla 3 pozostałych tabel, który będzie zwracał w postaci Stringa typ danego użytkownika. Czy takie podejście jest prawidłowe i ta metoda jest w miarę sensownie napisana? Czy można to jakoś inaczej zrealizować? Ciężko coś znaleźć tego typu w internecie. Wszystko to raczej proste przykłady z logowaniem na sztywno.