В артефакт на основі сервлетів, такий як @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");
Зауважте, що це попередньо вимагає, що квасоля вже заздалегідь автоматично створена JSF. Інакше ці повернуться null
. Потім вам потрібно буде вручну створити боб і використовувати setAttribute("beanName", bean)
.
Якщо ви можете використовувати CDI @Named
замість застарілого JSF 2.3 @ManagedBean
, це ще простіше, особливо тому, що вам більше не потрібно вручну створювати боби:
@Inject
private Bean bean;
Зауважте, що це не буде працювати, коли ви використовуєте, @Named @ViewScoped
тому що квадратик можна ідентифікувати лише за станом перегляду JSF, і це доступно лише тоді, коли FacesServlet
виклик був. Тож у фільтр, який працює до цього, доступ до @Inject
редактора @ViewScoped
завжди буде кинутий ContextNotActiveException
.
Тільки коли ви всередині @ManagedBean
, ви можете використовувати @ManagedProperty
:
@ManagedProperty("#{bean}")
private Bean bean;
Зверніть увагу , що це не працює всередині @Named
або @WebServlet
будь-якої іншої артефакт. Це дійсно працює @ManagedBean
тільки всередині .
Якщо ви не знаходитесь у a @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");
Дивитися також: