我在JSF中编写了一个应用程序,它根据一些配置文件生成一些CRUD页面。要配置这些页面,可以提供参数。它们可以是任何类型,也可以是EL表达式。目前,我为每个getter-invocation创建并评估这些表达式,我认为这不是理想的解决方案:
现在我有两个简单的问题,我无法自己回答:
应该可以为每个请求缓存那些ValueExpression实例。在第一次访问时(在我的情况下,我使用JSF' s postAddToView
事件)我创建表达式并在每个getter-invokation中进行评估。
public void populateComponent(ComponentSystemEvent event) {
FacesContext context = FacesContext.getCurrentContext();
_valueExpression = context.getApplication().getExpressionFactory()
.createValueExpression(context.getELContext(), _expression, String.class);
}
public String getExpressionValue() {
FacesContext context = FacesContext.getCurrentContext();
return (String) _valueExpression.getValue(context.getELContext())
}
这应该与在JSF本身处理的XHTML中直接使用表达式相同。 目前我还没有看到此解决方案的任何问题?
是否也可以创建一次ValueExpression实例并将其用于所有请求?缓存将位于应用程序级别而不是每个请求。这将删除postAddToView
事件并将该逻辑移动到我的配置解析器(可以访问FacesContext)。或者,如果在多个请求/线程中使用单个值表达式,我可能会遇到任何副作用吗?