Я не очень понимаю, как переменные работают в javax.el:
// Implemented by the EL implementation:
ExpressionFactory factory = ExpressionFactory.newInstance();
// Implemented by the user:
ELContext context = ...;
Object result = factory.createValueExpression(context1, "${foo.bar}", Object.class).getValue1(context);
Почему необходимо дважды передавать контекст.Можно ли передать два разных контекста?Что используется для каких целей?Каков ожидаемый результат:
ValueExpression expr = factory.createValueExpression(context1, "${foo.bar}", Object.class).getValue(context2);
Javadoc ExpressionFactory # createValueExpression / JSR-245 объясняет, что:
The FunctionMapper and VariableMapper stored in the ELContext are used to resolve
functions and variables found in the expression. They can be null, in which case
functions or variables are not supported for this expression. The object returned
must invoke the same functions and access the same variable mappings regardless
of whether the mappings in the provided FunctionMapper and VariableMapper
instances change between calling ExpressionFactory.createValueExpression()
and any method on ValueExpression.
Более того, объясняет «Переменные EL JSR-245 2.0.7»:
An EL variable does not directly refer to a model object that can then be resolved
by an ELResolver. Instead, it refers to an EL expression. The evaluation of that
EL expression gives the EL variable its value.
[...]
[...] in this [...] example:
<c:forEach var=“item” items=“#{model.list}”>
<h:inputText value=“#{item.name}”/>
</c:forEach>
При создании выражения «# {item.name}» переменная «item» сопоставляется (в VariableMapper) с некоторым экземпляром ValueExpression, и выражение привязывается к этому экземпляру ValueExpression.Как создается это ValueExpression и как оно связано с различными элементами «model.list»?Как это должно быть реализовано?Можно создать ValueExpression один раз и повторно использовать его для каждой итерации:
<!-- Same as above but using immediate evaluation -->
<c:forEach var=“item” items=“${model.list}”>
<h:inputText value=“${item.name}”/>
</c:forEach>
ValueExpression e1 = factory.createExpression(context,"#{model.list}");
variableMapper.setVariable("item", ??);
ValueExpression e2 = factory.createExpression(context,"#{item.name}");
for(Object item : (Collection<?>) e1.getValue(context)) {
??
}
Или необходимо создать новое ValueExpression для итерации:
ValueExpression e1 = factory.createExpression(context,"#{model.list}");
for(Object item : (Collection<?>) e1.getValue(context)) {
variableMapper.setVariable("item", factory.createValueExpression(item,Object.class));
ValueExpression e2 = factory.createExpression(context,"#{item.name}");
Object name = e2.getValue(context);
...
}