jsf - 传递FacesContext或使用getCurrentInstance()

时间:2012-11-23 23:34:09

标签: java jsf

在我的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吗?

2 个答案:

答案 0 :(得分:3)

调用FacesContext.getCurrentInstance() vs传递它会影响性能和功能。

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

因此通常使用FacesContext.getCurrentInstance()进行自举,然后使用传递。

如果只涉及几个电话,并且详细程度适用于您,请务必使用FacesContext.getCurrentInstance()。请注意,如果它涉及许多呼叫,可能会有一些(小的)性能影响。

答案 1 :(得分:2)

previous question中,BalusC得到了答案:

  

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

如果您的实用程序将在服务于HTTP请求的线程之外的线程中使用,那么您必须传递FacesContext to avoid nulls。除此之外,我认为它可以帮助您避免在每种方法中调用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);
}

这将帮助您进行性能权衡(关于访问threadlocal)并且如果您愿意,将帮助您进行详细程度,但您需要记住有关上下文的线程安全性。