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)
归档时间: |
|
查看次数: |
13663 次 |
最近记录: |