JSF Managed Bean自动创建?

rat*_*rat 16 java jsf managed javabeans

是否可以自动创建JSF托管bean?

例如,我有几个会话范围的bean.有时需要在代码中访问这些实例(而不仅仅是在JSF中),这可以通过以下方式完成:

PageBean pageBean = (PageBean) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("pages");
Run Code Online (Sandbox Code Playgroud)

但是,如果没有访问过调用'#{pages}'的页面,那么这会解析为null ...无论如何都要让JSF在范围'开始'时创建一个bean?那么在这种情况下理想情况下,当用户会话开始时,'pages'会立即在会话中实例化bean吗?

Bal*_*usC 27

Application#evaluateExpressionGet()改用.它还会在尚未完成时创建bean.

FacesContext context = FacesContext.getCurrentInstance();
Bean bean = (Bean) context.getApplication().evaluateExpressionGet(context, "#{bean}", Bean.class);
Run Code Online (Sandbox Code Playgroud)

"bean"托管bean名称在哪里,Bean.class是适当的辅助bean类.

你可以根据需要将它包装在一个帮助器方法中,这样就不必进行转换(JSF男孩没有利用泛型和Class参数evaluateExpressionGet):

public static <T> T findBean(String managedBeanName, Class<T> beanClass) {
    FacesContext context = FacesContext.getCurrentInstance();
    return beanClass.cast(context.getApplication().evaluateExpressionGet(context, "#{" + managedBeanName + "}", beanClass));
}
Run Code Online (Sandbox Code Playgroud)

可以用作:

Bean bean = findBean("bean", Bean.class);
Run Code Online (Sandbox Code Playgroud)

或者没有类型,但有一个@SuppressWarnings:

@SuppressWarnings("unchecked")
public static <T> T findBean(String managedBeanName) {
    FacesContext context = FacesContext.getCurrentInstance();
    return (T) context.getApplication().evaluateExpressionGet(context, "#{" + managedBeanName + "}", Object.class);
}
Run Code Online (Sandbox Code Playgroud)

可以用作:

Bean bean = findBean("bean");
Run Code Online (Sandbox Code Playgroud)

更新:以上是按照JSF 1.2的具体方式.以下是使用当前已弃用的 JSF 1.1或更早版本的方法Application#createValueBinding():

FacesContext context = FacesContext.getCurrentInstance();
Bean bean = (Bean) context.getApplication().createValueBinding("#{bean}").getValue(context);
Run Code Online (Sandbox Code Playgroud)