在我的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/

10-10 04:09