Java EL系列-3.1.JUEL表达式工厂

  inkfish翻译,请勿商业性质转载,转载请注明来源(http://blog.csdn.net/inkfish
)。本文是我学习JUEL同时,对原网站进行的简单的翻译,原网站地址:http://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使用。

时间: 2024-10-07 00:54:06

Java EL系列-3.1.JUEL表达式工厂的相关文章

Java EL系列-3.0.JUEL基本类

inkfish翻译,请勿商业性质转载,转载请注明来源(http://blog.csdn.net/inkfish ).本文是我学习JUEL同时,对原网站进行的简单的翻译,原网站地址:http://juel.sourceforge.net/guide/basic/index.html . 基本类(Basic Classes) 这一部分过一下JUEL提供的具体的一些类,这些类组成了计算过程的核心:它们组成了表达式的工厂和变量. 我们并不说明内部的行为,这些行为已经在超类API中描述了.并且,我们更注重

Java EL系列-2.JUEL快速入门

inkfish翻译,请勿商业性质转载,转载请注明来源(http://blog.csdn.net/inkfish ).本文是我学习JUEL同时,对原网站进行的简单的翻译,原网站地址:http://juel.sourceforge.net/guide/start.html . 快速入门 JUEL 发行版包含下面一些jar文件:(来源:http://blog.csdn.net/inkfish) 1.juel-api-2.2.x.jar --包含javax.el 包下的一些类 2.juel-impl-2

Java EL系列-1.JUEL简介

inkfish翻译,请勿商业性质转载,转载请注明来源(http://blog.csdn.net/inkfish ).本文是我学习JUEL同时,对原网站进行的简单的翻译,原网站地址:http://juel.sourceforge.net/ JUEL 是统一表达式语言(Unified Expression Language , EL )的一个实现,是JSP 2.1 标准(JSR-245 )的一部分,已经作为Java EE 5 的一部分,并且,JUEL 2.2实现了JSP 2.2 发行版,与Java

【java开发系列】—— struts2简单入门示例

原文:[java开发系列]-- struts2简单入门示例 上篇推荐:JDK安装 前言 最近正好有时间总结一下,过去的知识历程,虽说东西都是入门级的,高手肯定是不屑一顾了,但是对于初次涉猎的小白们,还是可以提供点参考的. struts2其实就是为我们封装了servlet,简化了jsp跳转的复杂操作,并且提供了易于编写的标签,可以快速开发view层的代码. 过去,我们用jsp和servlet搭配,实现展现时,答题的过程是: 1 jsp出发action 2 servlet接受action,交给后台c

java el简介及用法_java

一.EL简介 1.语法结构 ${expression} 2.[]与.运算符 EL 提供.和[]两种运算符来存取数据. 当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用 [].例如: ${user.My-Name}应当改为${user["My-Name"] } 如果要动态取值时,就可以用[]来做,而.无法做到动态取值.例如: ${sessionScope.user[data]}中data 是一个变量 3.变量 EL存取变量数据的方法很简单,例如:${us

【java开发系列】—— JDOM创建、修改、删除、读取XML文件

有很多中操作XML文件的方法,这里介绍一下JDOM的使用方法和技巧. JDOM下载地址 创建XML文档 XML文件是一种典型的树形文件,每个文档元素都是一个document元素的子节点.而每个子元素都是一个Element对象,对象可以向下包含. 1 因此我们可以通过先创建元素再将元素添加到父元素中,最后将顶层元素添加到根元素中. 2 创建完文档元素后,就可以把元素添加到document对象中,然后写入文件. 主要使用的函数: Element.setAttribute 为元素添加信息 Elemen

【java开发系列】—— struts2简单入门

前言 最近正好有时间总结一下,过去的知识历程,虽说东西都是入门级的,高手肯定是不屑一顾了,但是对于初次涉猎的小白们,还是可以提供点参考的. struts2其实就是为我们封装了servlet,简化了jsp跳转的复杂操作,并且提供了易于编写的标签,可以快速开发view层的代码. 过去,我们用jsp和servlet搭配,实现展现时,大体的过程是: 1 jsp触发action 2 servlet接受action,交给后台class处理 3 后台class跳转到其他的jsp,实现数据展现 现在有了stru

java文件过滤器里的lambda表达式问题

问题描述 java文件过滤器里的lambda表达式问题 import java.io.File;public class FileNameTest{ public static void main(String[] args) { File file = new File("".""); String[] nameList = file.list((dir name) -> name.endsWith("".java""

Java NIO 系列教程

Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API.本系列教程将有助于你学习和理解Java NIO.感谢并发编程网的翻译和投递.  (关注ITeye官微,随时随地查看最新开发资讯.技术文章.)  [本文转载于 Java NIO 系列教程] Java NIO提供了与标准IO不同的IO工作方式:  Channels and Buffers(通道和缓冲区):标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channe