Trong một tạo tác dựa trên servlet, chẳng hạn như @WebServlet
, @WebFilter
và @WebListener
, bạn có thể lấy JSF "vani đơn giản" @ManagedBean @RequestScoped
bằng cách:
Bean bean = (Bean) request.getAttribute("beanName");
và @ManagedBean @SessionScoped
bởi:
Bean bean = (Bean) request.getSession().getAttribute("beanName");
và @ManagedBean @ApplicationScoped
bở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 @Named
thay 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 @ViewScoped
vì 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 @Inject
ed @ViewScoped
sẽ 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 @Named
hoặc @WebServlet
hoặ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 FacesContext
có 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: