閱讀620 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Java EL係列-3.1.JUEL表達式工廠

  inkfish翻譯,請勿商業性質轉載,轉載請注明來源(https://blog.csdn.net/inkfish )。本文是我學習JUEL同時,對原網站進行的簡單的翻譯,原網站地址:https://juel.sourceforge.net/guide/basic/factory.html 。說實話,這篇翻譯的的確不怎樣。

表達式工廠(Expression Factory)

  如果要使用EL ,就必須要有一個javax.el.ExpressionFactory 的實例。表達式工廠用於創建多種類型的表達式。JUEL 的表達式工廠實現類是de.odysseus.el.ExpressionFactoryImpl ,獲得表達式工廠實例的最方便方法是:

javax.el.ExpressionFactory factory = new de.odysseus.el.ExpressionFactoryImpl();

  表達式工廠是線程安全的,允許創建數量不限的表達式。表達式工廠提供下麵的操作:

  • 提供類型強製轉換(Type coercions)
  • 創造樹狀值表達式(Tree value expressions)
  • 創建對象值表達式(Object value expressions)
  • 創建樹狀方法表達式(Tree method expressions)

表達式緩存

  每一個工廠實例使用它自己的表達式緩存。緩存的表達式是一個很重要的特性,因為解析是一個相對昂貴的操作。一個表達式緩存映射表達式字符串到他們已經解析過的表達方式(樹)。

  JUEL 提供一個緩存接口,該接口允許應用使用他們自己的緩存機製。雖然,在絕大多數情形中,JUEL 的默認實現應該是足夠好的。默認緩存使用下麵兩種映射:

  • 主映射是用java.util.LinkedHashMap 實現的,如果緩存的上線達到,那麼新的實體(entry)會被添加,並且用最近使用原則(LRU )從主映射裏移除舊的映射關係,並把舊的映射關係保存到二級映射表中。
  • 二級映射表是用java.util.WeakHashMap 來實現的。實體保證生命期至少和他們字符串的強引用一樣長。沒有任何引用的時候對應的實體才可能被垃圾回收器回收。

  默認的構造器使用的緩存容量是1000,你可以通過設置javax.el.cacheSize 屬性來自定義緩存大小,比如5000:

java.util.Properties properties = new java.util.Properties(); properties.put("javax.el.cacheSize", "5000"); javax.el.ExpressionFactory factory = new de.odysseus.el.ExpressionFactoryImpl(properties);

  使用自己的緩存機製可以參考“高級主題”一節。

類型轉換

  在計算表達式中,有幾個點可能會進行類型轉換。

  • 算術或邏輯操作中進行的強製轉換
  • 值表達式強製轉換成創建時期望的類型
  • 字符方法表達式計算的文字會強製轉換成創建時期望的類型
  • 非字符方法表達式,最後一個屬性強製轉換到方法名(翻譯不出來)
  • 符合表達式在連接的時候強製轉換所有字表達式為字符串

  所有這些強製轉換依照的都是同樣的規則,規範中對這些強製轉換規則有詳細的描述。它支持字符串、字符、布爾、枚舉、數字類型間的轉換,而且從字符串轉換到其他類型使用了JavaBeans 的屬性編輯器來支持。客戶端程序通過表達式工廠方法能夠實現EL 的強製轉換規則。

ExpressionFactoryImpl.coerceToType(Object, Class<?>)

  上麵那段代碼返回的是Object 類型對象。JUEL 能被配置成用其他的強製轉換規則,具體可以參考“高級主題”一段。

工廠配置

  工廠可以通過屬性文件配置。下麵是不指定屬性時,表達式工廠創建的機製,屬性的查詢如下:

  1. JAVA_HOME/lib/el.properties ——如果存在javax.el.ExpressionFactory 屬性,而且值是de.odysseus.el.ExpressionFactoryImpl ,那麼JUEL 就作為默認的el啟動;
  2. System.getProperties() ——如果規則1沒有符合,係統屬性把javax.el.ExpressionFactory 的值設置為de.odysseus.el.ExpressionFactoryImpl ,這兒設置能覆蓋1的設置;
  3. el.properties 文件在類路徑的任何地方——這裏設置的屬性能覆蓋1和2成為默認值。

  有了上麵的那些,接下來下麵的屬性會讀到:

  • javax.el.cacheSize ——表達式緩存的大小(默認是1000);
  • javax.el.methodInvocations ——如果設置成true 意味著允許方法調用。更多信息請參考“高級主題”一節;
  • javax.el.nullProperties ——如果設置成true 將解析null 屬性。更多信息請參考“高級主題”一節;
  • javax.el.varArgs ——如果設置成true 則允許表達式裏存在可變變量的函數/方法調用。

  工廠類同樣提了供構造器,可以讓你準確的傳遞你的屬性。如果你僅僅想要從JEE5 風格變成JEE6 風格,JUEL 提供枚舉構造器作為profiles使用。

最後更新:2017-04-02 04:01:45

  上一篇:go magento -- 推薦插件 -- 高級網站地圖
  下一篇:go weblogic10 標簽庫配置