Мне нужно сохранить только один объект в области сеанса моего приложения JSF. Где я могу определить переменную сеанса и как ее получить и установить из файла вида или поддержки bean?
Как получить и установить объект в области сеанса в JSF?
Ответ 1
Два основных способа:
Сохраните его в
ExternalContext#getSessionMap()ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext(); Map<String, Object> sessionMap = externalContext.getSessionMap(); sessionMap.put("somekey", yourVariable);А потом позже:
SomeObject yourVariable = (SomeObject) sessionMap.get("somekey");Или сделайте его свойством бина
@SessionScoped, который вы добавляете в свой бин@RequestScoped.sessionBean.setSomeVariable(yourVariable);А потом позже:
SomeObject yourVariable = sessionBean.getSomeVariable();Вы можете получить
@Named @SessionScopedв@Named @RequestScopedчерез@Inject.@Inject private SessionBean sessionBean;Или, если вы еще не используете CDI, вы можете получить
@ManagedBean @SessionScopedв@ManagedBean @RequestScopedчерез@ManagedProperty.@ManagedProperty("#{sessionBean}") private SessionBean sessionBean; // +getter+setter
Ответ 2
Просто двигайтесь к JSF 2.2 и CDI 1.2. Инъекция будет, по крайней мере, проще. Сохранение в соответствии с исходным ответом @BalusC:
import javax.enterprise.context.RequestScoped;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.inject.Named;
@Named
@RequestScoped
public class RequestBean {
    @Inject
    private SessionBean sessionBean;
    // ...
    @PostConstruct
    void init() {
      // Interact with sessionBean during construction
      // but after Injection.
    }
}
с
import java.io.Serializable;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;
@Named
@SessionScoped
public class SessionBean implements Serializable {
    private SomeObject someVariable;
    // ...
}
Существует несколько важных замечаний, в частности, переход на @Named и полное имя пакета для RequestScoped и SessionScoped. Также для создания класса SessionScoped он также должен быть сделан Serializable.
Добавление @Inject делает его очень простым - но поймите, что введенный объект sessionBean доступен только после построения, а не во время. Это означает, что у вас нет доступа к sessionBean внутри конструктора RequestBean. Это решается с помощью @PostConstruct, который запускается после завершения инъекции, а RequestBean в противном случае полностью инициализируется.
Ответ 3
При вызове метода FacesContext.getCurrentInstance() он вернет текущий поток, но в случае P.S.V.M в контексте приложения не будет потока. Итак, вы получаете NPE.
Лучше использовать что-то вроде этого:
public String checker() {
    SessionFactory factory = HibernateUtil.getSessionFactory();
    Session session = factory.getCurrentSession();
    session.beginTransaction();
    Query q = session.createQuery("from UserLogin where UserId='"
            + uid.getUserId() + "'and Pswd='" + uid.getPswd()
            + "'and RoleId='" + uid.getRoleId() + "'");
    setUid((UserLogin) q.uniqueResult());
    System.out.println("upto here every thing is workind properly");
    if (uid != null) {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletRequestrequest = (HttpServletRequest) context
                .getExternalContext().getRequest();
        HttpSession appsession = request.getSession(true);
        if (appsession.isNew() == false) {
            appsession.invalidate();
            appsession = request.getSession(true);
        }
        context.getExternalContext().getSessionMap().put("userbean", uid);
        session.close();
        return uid.getRoleId();
    } else
        return "invalid";
}
и поместите его в сеанс bean. Вы можете использовать код для проверки пользователей.