gpt4 book ai didi

java - JSF 托管 Bean 自动创建?

转载 作者:太空狗 更新时间:2023-10-29 22:44:11 24 4
gpt4 key购买 nike

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

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

PageBean pageBean = (PageBean) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("pages");

但是,如果还没有访问过调用“#{pages}”的页面,那么它会解析为 null ... 无论如何,是否可以让 JSF 在作用域“开始”时创建一个 bean?因此,在这种情况下,理想情况下,当用户 session 开始时,“页面”bean 会立即在 session 中实例化吗?

最佳答案

使用Application#evaluateExpressionGet()反而。它会在尚未完成时创建 bean。

FacesContext context = FacesContext.getCurrentInstance();
Bean bean = (Bean) context.getApplication().evaluateExpressionGet(context, "#{bean}", Bean.class);

其中 “bean” 是托管 bean 名称,Bean.class 是适当的支持 bean 类。

如有必要,您可以将它包装在辅助方法中,这样就不需要强制转换了(JSF 男孩没有利用泛型和 evaluateExpressionGet 中的 Class 参数):

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

可以用作:

Bean bean = findBean("bean", Bean.class);

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

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

可以用作:

Bean bean = findBean("bean");

更新:以上是 JSF 1.2 特有的。这是 JSF 1.1 或更早版本的方式,使用当前弃用 Application#createValueBinding() :

FacesContext context = FacesContext.getCurrentInstance();
Bean bean = (Bean) context.getApplication().createValueBinding("#{bean}").getValue(context);

关于java - JSF 托管 Bean 自动创建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2050309/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com