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