JSF - получение экземпляра SessionScoped Bean - PullRequest
8 голосов
/ 25 ноября 2010

У меня есть эта конфигурация в моем веб-приложении. 2 бобы:

1 ° Bean - проверяет логин;

@ManagedBean(name="login")
@SessionScoped
public class Login {
    private String nickname;
    private String password;
    private boolean isLogged;

    public String getNickname() { return nickname; }
    public void setNickname(String newValue) { nickname=newValue; }

    public String getPassword() { return password; }
    public void setPassword(String newValue) { password=newValue; }

    public void checkLogin() {
        ... i check on db the nickname and the password ...

        if(USER EXIST) {
            isLogged=true;
        } else {
            isLogged=false;
        }

        return true;
    }
}

2 ° Bean - Управление пользовательским параметром:

@ManagedBean(name="user")
@SessionScoped
public class User {
    private String name;
    private String surname;
    private String mail;

    public User() {
        String[] record=null;
        Database mydb=Configuration.getDatabase();
        mydb.connetti();
        ArrayList<String[]> db_result=null;
        db_result=mydb.selectQuery("SELECT name, surname, mail, domicilio FROM users WHERE nickname='???????'");

        int i = 0;
        while (i<db_result.size() ) {
           record=(String[]) db_result.get(i);
           i++;
        }
    }

    ... getter and setter methods...
}

Как вы можете видеть, я хотел бы знать, как получить никнейм, установленный ранее для моего компонента login, чтобы я мог выполнить запрос в моей БД.

На самом деле мне нужно получить экземпляр логина текущего сеанса: как я могу его получить? Я должен использовать что-то вроде session.getBean("login"):)

Надеюсь, этот вопрос ясен:)

Ответы [ 2 ]

11 голосов
/ 25 ноября 2010

Используйте @ManagedProperty, чтобы ввести его, и используйте @PostConstruct, чтобы получить к нему доступ после построения бина (потому что в обычном конструкторе это все равно будет null).

@ManagedBean
@SessionScoped
public class User {

    @ManagedProperty(value="#{login}")
    private Login login; 

    @PostConstruct
    public void init() {
        // Put original constructor code here.
    }

    // Add/generate getters/setters and other boilerplate.
}

Тем не менее, это не правильный подход. Вы хотели бы сделать это наоборот. Введите User в Login с помощью @ManagedProperty(value="#{user}") и выполните задание во время действия метода отправки.

Вы также хотели бы указать пароль в предложении WHERE. Совершенно не нужно тащить всю таблицу пользователей в память Java и определять ее по одному. Просто дайте БД выполнить работу и проверьте, возвращает ли она ноль или одну строку.

8 голосов
/ 28 февраля 2012

Также попробуйте использовать следующий код:

    ExternalContext tmpEC;
    Map sMap;
    tmpEC = FacesContext.getCurrentInstance().getExternalContext();
    sMap = tmpEC.getSessionMap();
    login loginBean = (login) sMap.get("login");
...