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