web-dev-qa-db-ja.com

JSFのセッションスコープでオブジェクトを取得および設定するにはどうすればよいですか?

JSFアプリケーションのセッションスコープにオブジェクトを1つだけ永続化する必要があります。セッション変数はどこで定義し、ビューファイルまたはバッキングBeanから取得および設定するにはどうすればよいですか?

2つの一般的な方法:

  • ExternalContext#getSessionMap() に保存します

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

    そして後で:

    SomeObject yourVariable = (SomeObject) sessionMap.get("somekey");
    
  • または、@SessionScoped Beanに注入する@RequestScoped Beanのプロパティにします。

    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
    
30
BalusC

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への切り替え、およびRequestScopedSessionScopedの完全修飾パッケージ名。また、クラスを作成する場合は、SessionScopedSerializableにする必要があります。

@Injectを追加すると、非常に簡単になります。ただし、注入されたsessionBeanオブジェクトは、構築中ではなく、構築後にのみ使用できることを理解してください。これは、sessionBeanのコンストラクター内でRequestBeanにアクセスできないことを意味します。これは、インジェクションの完了後にトリガーされる@PostConstructを使用することで解決されます。それ以外の場合、RequestBeanは完全に初期化されます。

2
YoYo

メソッド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に入れます。このコードを使用してユーザーを検証できます。

0
ifti