在我的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吗?
答案 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)并且如果您愿意,将帮助您进行详细程度,但您需要记住有关上下文的线程安全性。