2016-03-15 2 views
1

Here упоминаются, чтоСколько ELResolver [s] связано с ELContext в приложении JSF?

Хотя только один ELResolver связан с ELContext, там , как правило, несколько резольверов считаются для любых переменного или разрешения собственности.

Для того, чтобы сделать его понятным для того, кто будет отвечать, я демонстрирую его с учетом пользовательского ELResolver. Это только для иллюстративных целей. Я не ощущал необходимости в домашнем обычном ELResolver когда-либо в проектах, в которых я работал до сих пор.

Внутри CustomELResolver, getValue() метод выглядит,

@Override 
    public Object getValue(ELContext ctx, Object base, Object property) 
      throws NullPointerException, PropertyNotFoundException, ELException { 

     logger.log(Level.INFO, "Get Value property : {0}", property); 

     if ((base == null) && property.equals(SOME_PROPERTY)) { 
      logger.log(Level.INFO, "Found request {0}", base); 
      ctx.setPropertyResolved(true); 

      return SOME_OBJECT; 
     } 
     return null; 

} 

Каждое выражение значение вычисляется за кадром методом GetValue . Добавляя это в faces-config.xml, в цепочке ответственности добавляется настраиваемый преобразователь .

простой facelet страница:

<h:outputText value="#{bean.name}" /> 
    <br /> 
    <br /> 
    <b>Ordered:</b> 
    <br /> 
    <h:dataTable id="tableId1" 
       value="#{PROPERTY DECLARED IN CUSTOM RESOLVER CLASS}" var="t"> 
     <h:column>#{t}</h:column> 
    </h:dataTable> 

с

@ManagedBean(name = "bean") 
@RequestScoped 
public class Bean { 

    private String name = "Rafael"; 
    // getters & setters 
} 

Когда я отладки, для этого выражения value="#{PROPERTY DECLARED IN CUSTOM RESOLVER CLASS}" от указанной выше странице, вызов делегированы getValue() в CompositeELResolver, где Рассмотрено значение CustomELResolver, выделенное красным.

enter image description here

В то время как, для этого выражения

value="#{bean.name}" 

enter image description here

нормальный ManagedBeanELResolver считается. Абсолютно, никаких проблем с этим.

Но по этому же запросу ELContext был четко связан с 2 ELResolvers.

Пожалуйста выяснить, как к тому, что документация означает в первом пункте, как упоминалось выше

... один ELResolver связан с ELContext ...

ответ

2

Вы забыли прочитать следующее предложение в ссылке, на которую вы ссылаетесь.

ELResolvers объединяются вместе с использованием CompositeELResolvers, чтобы определить богатую семантику для вычисления выражения.

Если вы посмотрите в иерархии вызовов, вы увидите 1 (один, один) FacesCompositeELResolver ...Таким образом, есть один CompositeResolver, напрямую связанный с ELContext.

Но вы также можете прочитать, что эффективно только один EL-резольвер на самом деле выполняет работу каждый раз, один в цепочке, в котором говорится: «Я разрешил это, вот результат»