サーブレットベースのアーティファクトなどでは@WebServlet
、@WebFilter
と@WebListener
、あなたは「プレーン・バニラ」JSFをつかむことができる@ManagedBean @RequestScoped
ことで:
Bean bean = (Bean) request.getAttribute("beanName");
そして@ManagedBean @SessionScoped
:
Bean bean = (Bean) request.getSession().getAttribute("beanName");
そして@ManagedBean @ApplicationScoped
:
Bean bean = (Bean) getServletContext().getAttribute("beanName");
これには、BeanがJSFによって事前に自動作成されている必要があることに注意してください。それ以外の場合は戻りnull
ます。次に、手動でBeanを作成して使用する必要がありますsetAttribute("beanName", bean)
。
@Named
JSF 2.3が非推奨になって以来、CDIの代わりにCDIを使用できる場合@ManagedBean
、特にBeanを手動で作成する必要がなくなるため、さらに簡単になります。
@Inject
private Bean bean;
これは仕事、あなたが使用しているではないことに注意してください@Named @ViewScoped
Beanが唯一のJSFビュー状態で識別することができますので、いつにのみ利用可能ですFacesServlet
呼び出されました。したがって、その前に実行されるフィルターでは、@Inject
ed にアクセスする@ViewScoped
と常にがスローされContextNotActiveException
ます。
あなたが中@ManagedBean
にいるときだけ、あなたは使うことができます@ManagedProperty
:
@ManagedProperty("#{bean}")
private Bean bean;
これは、@Named
または@WebServlet
その他のアーティファクト内では機能しないことに注意してください。それは本当に内部で@ManagedBean
のみ機能します。
の中にいなくても@ManagedBean
、がFacesContext
すぐに利用できる(つまり、FacesContext#getCurrentInstance()
が返されないnull
)場合は、次も使用できますApplication#evaluateExpressionGet()
。
FacesContext context = FacesContext.getCurrentInstance();
Bean bean = context.getApplication().evaluateExpressionGet(context, "#{beanName}", Bean.class);
これは次のように便利です。
@SuppressWarnings("unchecked")
public static <T> T findBean(String beanName) {
FacesContext context = FacesContext.getCurrentInstance();
return (T) context.getApplication().evaluateExpressionGet(context, "#{" + beanName + "}", Object.class);
}
次のように使用できます。
Bean bean = findBean("bean");
以下も参照してください。