Trong một tạo tác dựa trên servlet, chẳng hạn như @WebServlet, @WebFiltervà @WebListener, bạn có thể lấy JSF "vani đơn giản" @ManagedBean @RequestScopedbằng cách:
Bean bean = (Bean) request.getAttribute("beanName");
và @ManagedBean @SessionScopedbởi:
Bean bean = (Bean) request.getSession().getAttribute("beanName");
và @ManagedBean @ApplicationScopedbởi:
Bean bean = (Bean) getServletContext().getAttribute("beanName");
Lưu ý rằng điều này yêu cầu trước rằng bean đã được JSF tự động tạo trước đó. Nếu không, chúng sẽ trở lại null. Sau đó, bạn cần phải tạo bean theo cách thủ công và sử dụng setAttribute("beanName", bean).
Nếu bạn có thể sử dụng CDI @Namedthay vì JSF 2.3 không được chấp nhận @ManagedBean, thì điều đó thậm chí còn dễ dàng hơn, đặc biệt là vì bạn không cần phải tạo các bean theo cách thủ công nữa:
@Inject
private Bean bean;
Lưu ý rằng điều này sẽ không hoạt động khi bạn đang sử dụng @Named @ViewScopedvì bean chỉ có thể được xác định bằng trạng thái xem JSF và điều đó chỉ khả dụng khi nó FacesServletđã được gọi. Vì vậy, trong một bộ lọc mà chạy trước đó, truy cập vào một @Injected @ViewScopedsẽ luôn ném ContextNotActiveException.
Chỉ khi bạn ở trong @ManagedBean, bạn mới có thể sử dụng @ManagedProperty:
@ManagedProperty("#{bean}")
private Bean bean;
Lưu ý rằng điều này không làm việc bên trong một @Namedhoặc @WebServlethoặc bất kỳ vật khác. Nó thực sự chỉ hoạt động bên trong @ManagedBean.
Nếu bạn không ở trong a @ManagedBean, nhưng FacesContextcó sẵn (tức là FacesContext#getCurrentInstance()không quay lại null), bạn cũng có thể sử dụng Application#evaluateExpressionGet():
FacesContext context = FacesContext.getCurrentInstance();
Bean bean = context.getApplication().evaluateExpressionGet(context, "#{beanName}", Bean.class);
có thể được thuận tiện như sau:
@SuppressWarnings("unchecked")
public static <T> T findBean(String beanName) {
FacesContext context = FacesContext.getCurrentInstance();
return (T) context.getApplication().evaluateExpressionGet(context, "#{" + beanName + "}", Object.class);
}
và có thể được sử dụng như sau:
Bean bean = findBean("bean");
Xem thêm: