【问题标题】:EL Expression in JSF 2.2JSF 2.2 中的 EL 表达式
【发布时间】:2017-06-22 23:08:36
【问题描述】:

我正在使用 JSF 2.2,我需要使用 EL 表达式获取托管 bean 的实例。我正在使用以下代码创建托管 bean 的实例(如果尚未创建)。如果 bean 已经创建并且在内存中(任何作用域变量,无论是 session、request 等),它都会返回托管 bean 的该实例而不创建新实例。 我的要求是,如果 bean 尚未创建,那么它应该返回 null 而不是创建新实例。如果它已经创建,那么它应该返回该实例。但是下面的代码,如果它不存在,最终会创建一个。 希望我清楚。

public static MyManagedBean getMyManagedBean () {

MyManagedBean  bean = (MyManagedBean ) getFacesContext().getApplication().getExpressionFactory().createValueExpression(getELContext(),
        "#{MyManagedBean}",
        MyManagedBean .class).getValue(FacesContext.getCurrentInstance().getELContext());
return bean;

}

【问题讨论】:

    标签: jsf-2.2


    【解决方案1】:

    这是简单(但冗长)的版本:

    public static <T> T resolveBean(String name)
    {
        FacesContext context = FacesContext.getCurrentInstance();
        ExternalContext externalContext = context.getExternalContext();
    
        Map<String, Object> requestMap = externalContext.getRequestMap();
        Object requestObject = requestMap.get(name);
        if(requestObject != null)
        {
            return (T) requestObject;
        }
    
        Map<String, Object> viewMap = context.getViewRoot().getViewMap();
        Object viewObject = viewMap.get(name);
        if(viewObject != null)
        {
            return (T) viewObject;
        }
    
        Map<String, Object> sessionMap = externalContext.getSessionMap();
        Object sessionObject = sessionMap.get(name);
        if(sessionObject != null)
        {
            return (T) sessionObject;
        }
    
        Map<String, Object> applicationMap = externalContext.getApplicationMap();
        Object applicationObject = applicationMap.get(name);
        if(applicationObject != null)
        {
            return (T) applicationObject;
        }
    
        BeanManager beanManager = CDI.current().getBeanManager();
        Bean<T> bean = (Bean<T>) beanManager.resolve(beanManager.getBeans(name));
        if(bean != null)
        {
            Context cdiContext = beanManager.getContext(bean.getScope());
            T instance = cdiContext.get(bean);
            if(instance != null)
            {
                return instance;
            }
        }
    
        return null;
    }
    

    【讨论】:

    • 感谢您的回复。我会试试这个。
    • @BalusC 我完成了与 CDI 托管 bean 一起工作的代码。我忽略了那部分,因为这个问题只用 JSF 标记,但是完整的代码总是更好。但是这段代码真的完整吗?还有其他我们应该查找的地方吗?
    猜你喜欢
    • 2013-03-20
    • 2017-07-18
    • 1970-01-01
    • 2013-09-02
    • 2011-06-24
    • 2014-06-21
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    相关资源
    最近更新 更多