@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).
@NamedJSF 2.3 deprecated 이후 대신 CDI를 사용할 수 있다면 @ManagedBean특히 더 이상 수동으로 빈을 생성 할 필요가 없기 때문에 훨씬 더 쉽습니다.
@Inject
private Bean bean;
@Named @ViewScoped빈은 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");
또한보십시오: