ในสิ่งประดิษฐ์ตามเซิร์ฟเล็ตเช่น@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
เอ็ดมักจะโยน@ViewScoped
ContextNotActiveException
เมื่อคุณอยู่ข้างใน@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");
ดูสิ่งนี้ด้วย: