式言語 2 の bean-view 通信構文について混乱しています。まず、同じ名前でスコープが異なるマネージド Bean をもう 1 つ持つことは可能ですか。セッションに DemoBean という属性があり、DemoBean というセッション Scobed マネージド Bean もあると考えてください。この #{DemoBean} のように EL 経由でこの Bean にアクセスしようとする と、彼らは#{sessionScobe}がセッション属性にアクセスする方法だと言いますが、 #{sessionattributename}
だけ が有効ですか? オブジェクトをセッションマップに配置すると、参照またはコピーされますか?
1 に答える
JSFの目的は、セッション属性自体を管理することです。つまり、セッション マップ属性を手動で保持/回復することを忘れる必要があります。これは、JSF のメカニズムを使用して実行できるためです。
アプリケーション全体の情報を保持したい場合は@ApplicationScoped
、マネージド Bean にアノテーションを使用します。@SessionScoped
、@RequestScoped
および@ViewScoped
注釈を使用して、セッション、リクエスト、または具体的なビューに対して同じことを行うことができます。
したがって、いくつかの属性をセッションに保存する場合:
@ManagedBean
@SessionScoped
public class SessionScopedBean{
public String sessionAttribute;
//Getter and setter
}
以下を使用して、Bean の属性の値を回復/変更できFacesContext
ます。
FacesContext context = FacesContext.getCurrentInstance();
SessionScopedBean bean = (SessionScopedBean) context.getApplication()
.evaluateExpressionGet(context, "#{sessionScopedBean}", SessionScopedBean.class);
bean.setSessionAttribute("value");
JSF Bean はデフォルトで、Bean の名前の最初の文字が小文字になっていることを思い出してください。また、自分自身を初期化しない場合、この Bean は最初のヒットでnullになることも忘れないでください。初期化する Bean でを使用してPreRenderViewEvent
、ログイン ページなどで簡単に実行できます。これにより、セッションの残りの間、Bean が生き続けることが保証されます。
最後に、ビューからセッション属性にアクセスする方法は次のとおりです。
#{sessionScopedBean.sessionAttribute}