3、EL 与 freemarker 表达式比较

一、EL介绍

EL相关概念

EL主要用于查找作用域中的数据,然后对它们执行简单操作;它不是编程语言,甚至不是脚本编制语言。通常与 JSTL 标记一起作用,能用简单而又方便的符号来表示复杂的行为。

 

EL基本格式
EL表达式的格式:用美元符号($)定界,内容包括在花括号({})中;
例如: ${loginInfoBean.suser}

此外,您可以将多个表达式与静态文本组合在一起以通过字符串并置来构造动态属性值;
例如:Hello {loginInfoBean.suser} ${loginInfoBean.spwd}

 

EL语法组成-标识符
EL表达式由标识符、存取器、文字和运算符组成。

标识符用来标识存储在作用域中的数据对象。EL 有 11 个保留标识符,对应于 11个EL隐式对象。除了11隐式对象外,假定所有其它标识符都用来标识作用域的变量。

 

标识符
例:
${abc} 相当于<%=pageContext.findAttribute(“abc”)%>
${og_1} <%=pageContext.findAttribute(“og_1”)%>
 …等等;就是说{}内的标识符除了11个保留字之外都表示作用域中的数据对应的名.

${requestScope}中的requestScope是11个EL隐式对象之一,它不再表示作用域中数据,而是表示request作用域;

 

EL隐藏对象
pageContext  PageContext 实例对应于当前页面的处理
pageScope  与页面作用域属性的名称和值相关联的Map类
requestScope 与请求作用域属性的名称和值相关联的Map类
sessionScope 与会话作用域属性的名称和值相关联的Map类
applicationScope 与应用程序作用域属性的名称和值相关联的Map类
param  按名称存储请求参数的主要值的 Map 类
paramValues 将请求参数的所有值作为 String 数组存储的 Map 类
Header  按名称存储请求头主要值的 Map 类
headerValues 将请求头的所有值作为 String 数组存储的 Map 类
cookie  按名称存储请求附带的 cookie 的 Map 类
initParam  按名称存储 Web 应用程序上下文初始化参数的Map类

 

EL存取器
存取器用来检索对象的特性或集合的元素。

存取器: 通过 “[]” 或 “.” 符号获取相关数据

例:
${userBean.suser}  或  ${userBean[“suser”]}
//获取输出bean中的suser属性值;
${mcType[“id”]} //获取map中key为id对应的值;

 

EL运算符
运算符允许对数据和文字进行组合以及比较。

EL运算符:
类别  运算符
算术运算符  +、-、*、/(或 div)和 %(或 mod)
关系运算符  ==(或eq)、!=(或ne)、<(或lt)、>(或gt)、<=(或le)    和  >=(或ge)
逻辑运算符  &&(或 and)、||(或or)和 !(或 not)
验证运算符  empty
验证运算符(empty):对于验证数据特别有用。empty 运算符采用单个表达式作为其变量(也即,${empty input}),并返回一个布尔值,该布尔值表示对表达式求值的结果是不是“空”值。求值结果为 null 的表达式被认为是空,即无元素的集合或数组。如果参数是对长度为零的 String 求值所得的结果,则 empty 运算符也将返回 true。


EL关系运算符有以下六个运算符

关系运算符
说 明
范 例
= = 或 eq
    等于  
${ 5 = = 5 } 或 ${ 5 eq 5 }
!= 或 ne
   不等于
${ 5 != 5 }  或 ${ 5 ne 5 }
< 或 lt
   小于  
${ 3 < 5 }   或 ${ 3 lt 5 } 
> 或 gt
   大于  
${ 3 < 5 }   或 ${ 3 lt 5 } 
<= 或 le
   小于等于
${ 3 > 5 }   或 ${ 3 gt 5 } 
>= 或 ge
大于等于
${ 3 >= 5 }  或 ${ 3 ge 5 }

EL函数
函数名 函数说明 使用举例
fn:contains 判断字符串是否包含另外一个字符串
fn:containsIgnoreCase 判断字符串是否包含另外一个字符串(大小写无关)
fn:endsWith 判断字符串是否以另外字符串结束
fn:escapeXml 把一些字符转成XML表示,例如<字符应该转为< ${fn:escapeXml(param:info)}
fn:indexOf 子字符串在母字符串中出现的位置 ${fn:indexOf(name, "-")}
fn:join 将数组中的数据联合成一个新字符串,并使用指定字符格开 ${fn:join(array, ";")}
fn:length 获取字符串的长度,或者数组的大小 ${fn:length(shoppingCart.products)}
fn:replace 替换字符串中指定的字符 ${fn:replace(text, "-", "•")}
fn:split 把字符串按照指定字符切分 ${fn:split(customerNames, ";")}
fn:startsWith 判断字符串是否以某个子串开始
fn:substring 获取子串 ${fn:substring(zip, 6, -1)}
fn:substringAfter

获取从某个字符所在位置开始的子串

${fn:substringAfter(zip, "-")}
fn:substringBefore 获取从开始到某个字符所在位置的子串 ${fn:substringBefore(zip, "-")}
fn:toLowerCase 转为小写 ${fn.toLowerCase(product.name)}
fn:toUpperCase 转为大写字符 ${fn.UpperCase(product.name)}
fn:trim 去除字符串前后的空格 ${fn.trim(name)}

 二、freemarker表达式


一、直接指定值

直接指定值可以是字符串、数值、布尔值、集合及Map对象。


1. 字符串

直接指定字符串值使用单引号或双引号限定。字符串中可以使用转义字符”\"。如果字符串内有大量的特殊字符,则可以在引号的前面加上一个字母r,则字符串内的所有字符都将直接输出。

2. 数值

数值可以直接输入,不需要引号。FreeMarker不支持科学计数法。

3. 布尔值 

直接使用true或false,不使用引号。

4. 集合

集合用中括号包括,集合元素之间用逗号分隔。
使用数字范围也可以表示一个数字集合,如1..5等同于集合[1, 2, 3, 4, 5];同样也可以用5..1来表示[5, 4, 3, 2, 1]。

5. Map对象

Map对象使用花括号包括,Map中的key-value对之间用冒号分隔,多组key-value对之间用逗号分隔。
注意:Map对象的key和value都是表达式,但key必须是字符串。


二、输出变量值

FreeMarker的表达式输出变量时,这些变量可以是顶层变量,也可以是Map对象的变量,还可以是集合中的变量,并可以使用点(.)语法来访问Java对象的属性。

1. 顶层变量

所谓顶层变量就是直接放在数据模型中的值。输出时直接用${variableName}即可。

2. 输出集合元素

可以根据集合元素的索引来输出集合元素,索引用中括号包括。如: 输出[“1”, “2”, “3”]这个名为number的集合,可以用${number[0]}来输出第一个数字。FreeMarker还支持用number[1..2]来表示原集合的子集合[“2”, “3”]。

3. 输出Map元素

对于JavaBean实例,FreeMarker一样把它看作属性为key,属性值为value的Map对象。
输出Map对象时,可以使用点语法或中括号语法,如下面的几种写法的效果是一样的:
             book.author.name                                                                                                                         
             book.author["name"]                                                                                                                      
             book["author"].name                                                                                                                      
             book["author"]["name"]                                                                                                                   
使用点语法时,变量名字有和顶层变量一样的限制,但中括号语法没有任何限制。

三、字符串操作
1. 字符串连接

字符串连接有两种语法:
(1) 使用${..}或#{..}在字符串常量内插入表达式的值;
(2)  直接使用连接运算符“+”连接字符串。
如,下面两种写法等效:
              ${"Hello, ${user}"}                                                                                                                
              ${"Hello, " + user + "!"}                                                                                                         
有一点需要注意: ${..}只能用于文本部分作为插值输出,而不能用于比较等其他用途,如:
              <#if ${isBig}>Wow!                                                                                                                
              <#if "${isBig}">Wow!                                                                                                              
应该写成:
              <#if isBig>Wow!          

                                                                                                          

2. 截取子串

截取子串可以根据字符串的索引来进行,如果指定一个索引值,则取得字符串该索引处的字符;如果指定两个索引值,则截取两个索引中间的字符串子串。如:
              <#assign number="01234">
              ${number[0]} <#-- 输出字符0 -->
              ${number[0..3]} <#-- 输出子串“0123” -->

四、集合连接操作

      连接集合的运算符为“+”

五、Map连接操作

Map连接操作的运算符为“+”

六、算术运算符

算术运算符:支持“+”、“-”、“*”、“/”、“%”运算符。

关系运算符

关系运算符
说 明
范 例
==
    等于  
${ 5 = = 5 } 或 ${ 5 = 5 }
!=
   不等于
${ 5 != 5 }  或 ${ 5 ne 5 }
< 或 lt
   小于  
${ 3 < 5 }   或 ${ 3 lt 5 } 
> 或 gt
   大于  
${ 3 < 5 }   或 ${ 3 lt 5 } 
<= 或 le
  小于等于
${ 3 > 5 }   或 ${ 3 gt 5 } 
>= 或 ge
大于等于
${ 3 >= 5 }  或 ${ 3 ge 5 } 
注1: ==和!=可以用作字符串、数值和日期的比较,但两边的数据类型必须相同。而且FreeMarker的比较是精确比较,不会忽略大小写及空格。
注2: 上面这些比较运算符可以用于数字和日期,但不能用于字符串。大部分时候,使用gt比>有更好的效果,因为FreeMarker会把>解释成标签的结束字符。可以使用括号来避免这种情况,如:<#if (x>y)>。

逻辑运算符:  1. &&: 逻辑与;  2. ||: 逻辑或;  3. !: 逻辑非
逻辑运算符只能用于布尔值。

七、内建函数

FreeMarker提供了一些内建函数来转换输出,可以在任何变量后紧跟?,?后紧跟内建函数,就可以通过内建函数来转换输出变量。
字符串相关常用的内建函数:
1. html: 对字符串进行HTML编码;
2. cap_first: 使字符串第一个字母大写;
3. lower_case: 将字符串转成小写;
4. upper_case: 将字符串转成大写;
集合相关常用的内建函数:
1. size: 获得集合中元素的个数;
数字值相关常用的内建函数:
1. int: 取得数字的整数部分。

其它内建函数:

chunk,  is_date,  last,  root,  j_string,  round,  is_hash,  long,  float,  contains,ends_with,  namespace,  matches,  time,  values,  seq_last_index_of,  uncap_first,  byte,  substring,  is_transform,  web_safe,  groups,  seq_contains,  is_macro,  index_of,  word_list,  int,  is_method,  eval,  parent,  xml,  number,  capitalize,  if_exists,  rtf,  node_type,  double,  is_directive,  url,  size,  default,  floor,  ceiling, is_boolean,  split,  node_name,  is_enumerable,  seq_index_of,  is_sequence,  sort,  is_node,

sort_by,  left_pad,  cap_first,  interpret,  children,  node_namespace,  chop_linebreak, date,  short,  last_index_of,  is_collection,  ancestors,  length,  trim,  datetime, is_string,  reverse,  c,  keys,  upper_case,  js_string,  has_content,  right_pad,  replace,  is_hash_ex,  new,  is_number,  lower_case,  is_indexable,  string,  exists,  html,  first

使用试例
str?contains(childStr);是用来判断一个字符串是否包含一些字符。
seq?seq_contains(item);用来判断一个集合是否包含元素,集合的元素要和判断的元素的类型一致。
seq?chunk(n)          ;Sequence内置的分段器,用途:某些比较BT的排版需求 ,举例:

十、空值处理运算符

FreeMarker的变量必须赋值,否则就会抛出异常。而对于FreeMarker来说,null值和不存在的变量是完全一样的,因为FreeMarker无法理解null值。
FreeMarker提供两个运算符来避免空值:
  • !  : 指定缺失变量的默认值;
  • ?? :判断变量是否存在。
!运算符有两种用法:
    variable!或variable!defaultValue。第一种用法不给变量指定默认值,表明默认值是空字符串、长度为0的集合、或长度为0的Map对象。
使用!运算符指定默认值并不要求默认值的类型和变量类型相同。

??运算符返回布尔值,如:variable??,如果变量存在,返回true,否则返回false。


你可能感兴趣的:(3、EL 与 freemarker 表达式比较)