@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)。
@NamedJSF 2.3が非推奨になったため、代わりにCDIを使用できる場合は@ManagedBean、特にBeanを手動で作成する必要がなくなるため、さらに簡単になります。
@Inject
private Bean bean;
@Named @ViewScopedBeanは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");
参照: