В артефакте на основе сервлета, таком как @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, потому что bean-компонент можно идентифицировать только по состоянию представления JSF, а это доступно только при вызове FacesServlet. Таким образом, в фильтре, который запускается до этого, доступ к @Injected @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");
Смотрите также:
person
BalusC
schedule
13.04.2010