В артефакте на основе сервлета, таком как @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
. Затем вам нужно будет вручную создать bean-компонент и использовать его setAttribute("beanName", bean)
.
Если вы можете использовать CDI @Named
вместо устаревшего JSF 2.3 @ManagedBean
, то это еще проще, особенно потому, что вам больше не нужно вручную создавать bean-компоненты:
@Inject
private Bean bean;
Обратите внимание, что это не сработает, когда вы используете, @Named @ViewScoped
потому что компонент может быть идентифицирован только по состоянию представления 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");
Смотрите также: