2

在我的 jsf 应用程序中,我有很多与静态FacesContext相关的实用程序方法。我总是问自己同样的问题?

我应该通过参数将上下文传递给方法吗?或使用FacesContext.getCurrentInstance()

例如:

public static <T> T getInstance(final Class<T> type, final FacesContext context, final String elExpression)
{
    return context.getApplication().evaluateExpressionGet(context, elExpression, type);
}

出现了更多的混乱,因为验证器和转换器接口使用上下文作为参数。

可以有多个 FacesContext 吗?

4

2 回答 2

4

调用FacesContext.getCurrentInstance()与传递它具有性能和功能影响。

您可能已经注意到,大多数 JSF API 本身都使用传递。这样做是因为传递比访问线程局部变量要快得多。最重要的是,通过传递,调用链中的方法可以更轻松地以受控方式包装 FacesContext。

所以通常FacesContext.getCurrentInstance()用于引导,然后你会使用传递。

如果它只涉及几个调用,并且冗长到你,那么FacesContext.getCurrentInstance()也一定要使用。请注意,如果它涉及许多调用,则可能会对性能产生一些(小)影响。

于 2012-11-24T10:17:36.680 回答
2

上一个问题中,BalusC 回答了这个问题:

FacesServlet 就是创建 FacesContext 并将其作为 ThreadLocal 放入当前 HTTP 请求中的人。

如果您的实用程序将用于服务 HTTP 请求的线程以外的线程中,那么您必须传递 FacesContext以避免空值。除此之外,我认为它可以帮助您避免FacesContext.getCurrentInstance()在每种方法中进行冗长的调用。

或者你可以使用两者的组合,一个没有:

public static <T> T getInstance(final Class<T> type, final String elExpression){
    return JsfUtils.getInstance(type, FacesContext.getCurrentInstance(), elExpression);
}


public static <T> T getInstance(final Class<T> type, final FacesContext context, final String elExpression){
    return context.getApplication().evaluateExpressionGet(context, elExpression, type);
}

这将帮助您进行性能权衡(关于访问线程本地),并且如果您愿意,将帮助您避免冗长,但您需要记住上下文中的线程安全性。

于 2012-11-24T01:07:33.170 回答