with variable validate simple sessionscope sesiones practices example best jsf session

variable - validate session jsf



¿Cómo obtengo y configuro un objeto en el ámbito de sesión en JSF? (3)

Cuando llama al método FacesContext.getCurrentInstance() , devolverá el subproceso actual, pero en el caso de PSVM no habrá subprocesos ejecutándose en el contexto de la aplicación. Así que obtienes un NPE.

Mejor usar algo como esto:

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"; }

y ponerlo en un bean sesión. Puedes usar el código para validar usuarios.

Necesito persistir solo un objeto en el alcance de la sesión de mi aplicación JSF. ¿Dónde defino una variable de sesión y cómo obtengo y configuro desde un archivo de vista o un bean de respaldo?


Simplemente moviéndose a lo largo de JSF 2.2 y CDI 1.2 - La inyección será al menos más simple. Mantenerse en línea con la respuesta original de @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. } }

con

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; // ... }

Se deben hacer varias notas importantes, especialmente el cambio a @Named , y el nombre del paquete RequestScoped para RequestScoped y SessionScoped . También para hacer una SessionScoped clase, también debe ser Serializable .

La adición de @Inject hace realmente simple, pero entiendo que el objeto sessionBean inyectado solo está disponible después de la construcción, no durante. Esto significa que no tiene acceso a sessionBean dentro del constructor de RequestBean . Esto se resuelve mediante el uso de @PostConstruct que se activa después de que se completa la inyección, y, RequestBean lo demás, RequestBean está completamente inicializado.


Varias maneras:

  • Utilice ExternalContext#getSessionMap()

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

    Y luego más tarde:

    SomeObject yourVariable = (SomeObject) sessionMap.get("somekey");

  • O bien, conviértalo en una propiedad de un bean de ámbito de sesión que inyecte en su bean de ámbito de solicitud.

    sessionBean.setSomeVariable(yourVariable);

    Y luego más tarde:

    SomeObject yourVariable = sessionBean.getSomeVariable();

    La inyección de beans entre sí puede ocurrir por faces-config.xml como se describe here o si ya está en JSF 2.0, por @ManagedProperty

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

    con

    @ManagedBean @SessionScoped public class SessionBean { private SomeObject someVariable; // ... }