Подтвердить что ты не робот

Как получить и установить объект в области сеанса в JSF?

Мне нужно сохранить только один объект в области сеанса моего приложения JSF. Где я могу определить переменную сеанса и как ее получить и установить из файла вида или поддержки bean?

4b9b3361

Ответ 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. Вы можете использовать код для проверки пользователей.