2016-03-15 60 views
1

Here應提到的是在JSF應用程序中有多少個ELResolver與一個ELContext相關聯?

雖然僅單個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

你忘了閱讀在你引用的鏈接中的下一句話。

ELResolver使用CompositeELResolvers組合在一起,至 定義用於評估表達式的豐富語義。

如果你看看調用層次結構,你會看到1(一個,一個)FacesCompositeELResolver ...所以有一個CompositeResolver直接與ELContext相關聯。

但是你也可以閱讀它,實際上每次只有一個EL解析器實際上在做這項工作,在'鏈'中說'我解決了它,這裏是結果'的那個'

相關問題