Dalam artefak berbasis servlet, seperti @WebServlet
, @WebFilter
dan @WebListener
, Anda dapat mengambil JSF "vanilla biasa" @ManagedBean @RequestScoped
dengan:
Bean bean = (Bean) request.getAttribute("beanName");
dan @ManagedBean @SessionScoped
oleh:
Bean bean = (Bean) request.getSession().getAttribute("beanName");
dan @ManagedBean @ApplicationScoped
oleh:
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 @Named
bukan 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 @ViewScoped
karena kacang hanya dapat diidentifikasi oleh status tampilan JSF dan itu hanya tersedia ketika FacesServlet
telah dipanggil. Jadi dalam filter yang berjalan sebelumnya, mengakses @Inject
ed @ViewScoped
akan 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 @Named
atau @WebServlet
atau artefak lainnya. Ini benar-benar @ManagedBean
hanya berfungsi di dalam .
Jika Anda tidak berada di dalam a @ManagedBean
, tetapi FacesContext
sudah 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: