在我的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吗?
最佳答案
在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的信息),并且如果您愿意,也可以帮助您提高详细程度,但是您需要记住上下文的线程安全性。
关于java - jsf-通过FacesContext或使用getCurrentInstance(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13536902/