Как получить и установить объект в области видимости сеанса в JSF? - PullRequest
18 голосов
/ 21 декабря 2010

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

Ответы [ 3 ]

29 голосов
/ 21 декабря 2010

Несколько способов:

  • Использование ExternalContext#getSessionMap()

    ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
    Map<String, Object> sessionMap = externalContext.getSessionMap();
    sessionMap.put("somekey", yourVariable);
    

    А потом:

    SomeObject yourVariable = (SomeObject) sessionMap.get("somekey");
    
  • Или сделайте его свойством bean-объекта области действия, который вы вводите в свой bean-объект области действия запроса.

    sessionBean.setSomeVariable(yourVariable);
    

    А потом:

    SomeObject yourVariable = sessionBean.getSomeVariable();
    

    Инъекциябобы друг в друге могут произойти на faces-config.xml, как описано здесь или, если вы уже используете JSF 2.0, на @ManagedProperty

    @ManagedBean
    @RequestScoped
    public class RequestBean {
        @ManagedProperty("#{sessionBean}")
        private SessionBean sessionBean;
        // ...
    }
    

    с

    @ManagedBean
    @SessionScoped
    public class SessionBean {
        private SomeObject someVariable;
        // ...
    }
    
2 голосов
/ 10 апреля 2017

Просто переходите к 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 и FullyКвалифицированное имя пакета для RequestScoped и SessionScoped.Также для создания класса SessionScoped его также следует сделать Serializable.

Добавление @Inject делает его действительно простым - но следует понимать, что введенный объект sessionBean доступен только после создания, а нев течение.Это означает, что у вас нет доступа к sessionBean в конструкторе RequestBean.Это решается путем использования @PostConstruct, который запускается после завершения инъекции, а RequestBean в противном случае полностью инициализируется.

0 голосов
/ 11 октября 2011

Когда вы вызываете метод FacesContext.getCurrentInstance(), он возвращает текущий поток, но в случае PSVM поток не будет запущен в контексте приложения.Таким образом, вы получаете 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";
}

и поместить его в сессионный компонент.Вы можете использовать код для проверки пользователей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...