ในสิ่งประดิษฐ์ตามเซิร์ฟเล็ตเช่น@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)จากนั้นคุณจะต้องสร้างด้วยตนเองถั่วและการใช้งาน
หากคุณสามารถใช้ CDI @Namedแทนเนื่องจาก JSF 2.3 เลิกใช้งาน@ManagedBeanแล้วจะง่ายยิ่งขึ้นโดยเฉพาะอย่างยิ่งเนื่องจากคุณไม่จำเป็นต้องสร้างถั่วด้วยตนเองอีกต่อไป:
@Inject
private Bean bean;
โปรดทราบว่าจะใช้ไม่ได้เมื่อคุณใช้@Named @ViewScopedเนื่องจาก bean สามารถระบุได้ด้วยสถานะมุมมอง JSF เท่านั้นและจะใช้ได้เฉพาะเมื่อFacesServletมีการเรียกใช้ ดังนั้นในการกรองซึ่งไปก่อนนั้นการเข้าถึง@Injectเอ็ดมักจะโยน@ViewScopedContextNotActiveException
เมื่อคุณอยู่ข้างใน@ManagedBeanเท่านั้นจึงจะสามารถใช้@ManagedProperty:
@ManagedProperty("#{bean}")
private Bean bean;
โปรดทราบว่าสิ่งนี้ใช้ไม่ได้ภายใน@Namedหรือ@WebServletหรือสิ่งประดิษฐ์อื่น ๆ มันใช้งานได้จริงภายใน@ManagedBeanเท่านั้น
หากคุณไม่ได้อยู่ใน a @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");
ดูสิ่งนี้ด้วย: