Мне нужно сохранить только один объект в области сеанса моего приложения 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. Вы можете использовать код для проверки пользователей.