Dalam artefak berbasis servlet, seperti @WebServlet, @WebFilterdan @WebListener, Anda dapat mengambil JSF "vanilla biasa" @ManagedBean @RequestScopeddengan:
Bean bean = (Bean) request.getAttribute("beanName");
dan @ManagedBean @SessionScopedoleh:
Bean bean = (Bean) request.getSession().getAttribute("beanName");
dan @ManagedBean @ApplicationScopedoleh:
Bean bean = (Bean) getServletContext().getAttribute("beanName");
Perhatikan bahwa ini mensyaratkan bahwa kacang sudah dibuat secara otomatis oleh JSF sebelumnya. Jika tidak, ini akan kembali null. Anda kemudian perlu membuat kacang dan menggunakannya secara manual setAttribute("beanName", bean).
Jika Anda dapat menggunakan CDI dan @Namedbukan karena JSF 2.3 sudah tidak digunakan lagi @ManagedBean, ini akan lebih mudah, terutama karena Anda tidak perlu lagi membuat kacang secara manual:
@Inject
private Bean bean;
Perhatikan bahwa ini tidak akan berfungsi saat Anda menggunakan @Named @ViewScopedkarena kacang hanya dapat diidentifikasi oleh status tampilan JSF dan itu hanya tersedia ketika FacesServlettelah dipanggil. Jadi dalam filter yang berjalan sebelumnya, mengakses @Injected @ViewScopedakan selalu membuang ContextNotActiveException.
Hanya ketika Anda berada di dalam @ManagedBean, maka Anda dapat menggunakan @ManagedProperty:
@ManagedProperty("#{bean}")
private Bean bean;
Perhatikan bahwa ini tidak berfungsi di dalam @Namedatau @WebServletatau artefak lainnya. Ini benar-benar @ManagedBeanhanya berfungsi di dalam .
Jika Anda tidak berada di dalam a @ManagedBean, tetapi FacesContextsudah tersedia (yaitu FacesContext#getCurrentInstance()tidak kembali null), Anda juga dapat menggunakan Application#evaluateExpressionGet():
FacesContext context = FacesContext.getCurrentInstance();
Bean bean = context.getApplication().evaluateExpressionGet(context, "#{beanName}", Bean.class);
yang dapat diselenggarakan sebagai berikut:
@SuppressWarnings("unchecked")
public static <T> T findBean(String beanName) {
FacesContext context = FacesContext.getCurrentInstance();
return (T) context.getApplication().evaluateExpressionGet(context, "#{" + beanName + "}", Object.class);
}
dan dapat digunakan sebagai berikut:
Bean bean = findBean("bean");
Lihat juga: