您的位置:首页 > 其它

EL(Expression Language)表达式概述

2016-03-10 16:05 316 查看
1) EL概述
-a-EL表达式用${ }表示,可用在所有的HTML和JSP标签中,作用是代替JSP页面中复杂的JAVA代码.
-b-EL表达式可操作常量、变量和隐式对象。
最常用的隐式对象有${param}和${paramValues}.
${param}表示返回请求参数中单个字符串的值.
${paramValues}表示返回请求参数的一组值.
pageScope表示页面范围的变量.
requestScope表示请求对象的变量.
sessionScope表示会话范围内的变量.
applicationScope表示应用范围的变量.
-c-<%@ page isELIgnored="true"%>表示是否禁用EL语言。
TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认(FALSE)的启用EL语言.
-d-EL语言可显示逻辑表达式如${true and false}结果是false ;
关系表达式如${5>6} 结果是false ;算术表达式如 ${5+5} 结果是10
-e-EL中的变量搜索范围是: page 、request、 session、 application 。  
点运算符" . "和"[ ]"都是表示获取变量的值。. 区别是 [ ] 可以显示非词类的变量

2) 语法结构
${expression} :必须以“ ${ ”开始,以“ } ”结束,expression就是具体表达式的内容。
注意:EL表达式可以作为元素属性的值,也可以在自定义或者标准动作元素的内容中使用,但是不可以在脚本元素中使用。EL表达式可适用于所有的HTML和JSP标签

3)[ ] 与 . 运算符
-a-EL 提供 . 和 [ ] 两种运算符来存取数据。
-b-当要存取的属性名称中包含一些特殊字符,如. 或 ? 等并非字母或数字的符号, 就一定要使用 [].
例如: ${user.My-Name}应当改为${user["My-Name"] }
-c-如果要动态取值时,就可以用[ ]来做,而.无法做到动态取值
例如: ${sessionScope.user[data]}中data 是一个变量
-------------------------------------------------------------------------------------------------------------
${}是一个JSP2.0中设计的计算引擎,expression中以“" "”包裹的部分不计算
expression中的主体可以是Map和Bean,隐式对象中只有pageContext是Bean,具备方法

--------------------------------------------------------------------------------------------------------------

4)变量
-a-EL存取变量数据的方法很简单。
例 如:${username} 它的意思是取出某一范围中名称为username的变量 因为我们并没有指定哪一个范围的username 所以它会依序从Page、Request、Session、Application范围查找。假如途中找到username,就直接回传,不再继续找下 去,但是假如全部的范围都没有找到时,就回传null。
-b-属性范围在EL中的名称
       Page               PageScope
Request           RequestScope
Session            SessionScope
Application       ApplicationScope

5)EL隐含对象(共有11个)
-a-与范围有关的隐含对象(4个)
与范围有关的EL 隐含对象包含以下四个:
pageScope、requestScope、sessionScope 和applicationScope;
它们基本上就和JSP的pageContext、request、session和application一样;在EL中,这四个隐含对象只能用来取得范围属性值,即getAttribute(String name),却不能取得其他相关信息。

例如:我们要取得session中储存的一个属性username的值,可以利用下列方法:
session.getAttribute("username") 取得username的值,
在EL中则使用下列方法 :${sessionScope.username}

-b-与输入有关的隐含对象(2个)
与输入有关的隐含对象有两个:param和paramValues,它们是EL中比较特别的隐含对象。
例如:我们要取得用户的请求参数时,可以利用下列方法:
request.getParameter(String name)
request.getParameterValues(String name)
在EL中则可以使用param和paramValues两者来取得数据。
${param.name}
${paramValues.name}
-c-其他隐含对象
1)cookie
JSTL并没有提供设定cookie的动作,
例:要取得cookie中有一个设定名称为userCountry的值,可以使用${cookie.userCountry}来取得它。
2)header和headerValues
header 储存用户浏览器和服务端用来沟通的数据
例:要取得用户浏览器的版本,可以使用${header["User-Agent"]}。
另外在鲜少机会下,有可能同一标头名称拥有不同的值,此时必须改为使用headerValues 来取得这些值。
3)initParam
initParam取得设定web站点的环境参数(Context)
例:一般的方法String userid = (String)application.getInitParameter("userid");
可以使用 ${initParam.userid}来取得名称为userid
4) pageContext 这个是唯一一个bean引用,不是Map,可以获得其他引用
pageContext取得其他有关用户要求或页面的详细信息。
${pageContext.request.queryString}            取得请求的参数字符串
${pageContext.request.requestURL}          取得请求的URL,但不包括请求之参数字符串
${pageContext.request.contextPath}           服务的web application 的名称
${pageContext.request.method}                  取得HTTP 的方法(GET、POST)
${pageContext.request.protocol}               取得使用的协议(HTTP/1.1、HTTP/1.0)
${pageContext.request.remoteUser}           取得用户名称
${pageContext.request.remoteAddr }        取得用户的IP 地址
${pageContext.session.new}                       判断session 是否为新的
${pageContext.session.id}                         取得session 的ID
${pageContext.servletContext.serverInfo}   取得主机端的服务信息

 

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类

 

6)禁用EL
在JSP2 .0以后,默认是启用EL表达式的,如果需要禁用表达式的话,使用JSP的page指令的isELIgnored属性来指定,语法:
<%@ page isELIgnored = “true | false” %>
True :表示忽略对EL表达式进行计算。
False(默认) :表示计算EL表达式

7)操作符
-a-算术运算符(5个):
+、- 、* 、/ 或div(除法)、% 或mod(取模)
-b-关系运算符(6个):
==或eq 、!=或ne 、<或lt 、> 或gt 、<= 或le、>= 或ge
-c-逻辑运算符(3个) :
&& 或and :与,符号两边均为true , 则返回 true , 否则返回 false 。
||或or :或,符号两边任何一边为true , 则返回true , 否则返回 false 。
! 或not :非,运算结果为true的时候,则返回false , 否则返回true 。
-d-其它运算符(3个):empty运算符 、条件运算符? 、()运算符
验证运算符(empty):empty作为前缀,用来检索一个值是否为null或empty
例:${empty user.name}用来判断user对象中的name的值是否为null 。
()运算符:$(A*(B+C)
      条件运算符( ?) :
格式: ${ 条件?truevalue:falsevalue} 如果条件为真,则表达式的值为truevalue , 否则为 falsevalue .

8)EL函数(functions)
语法:ns : function ( arg1, arg2, arg3 …. argN )
其中ns为前置名称(prefix),它必须和taglib 指令的前置名称一置

9)发现一个el表达式在JSP2.0中不起作用的问题。
web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
2.4版本默认启用el表达式,如果使用2.5版本,默认el表达式是关闭的
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 那么对应2.5的web.xml -->  jsp页面里应该增加<%@ page isELIgnored="false"%>

发现原因:一句话,凡是部署描述文件遵循Servlet2.4规范的WEB应用,EL表达式的计算默认是启用的,而未遵循的,则EL表达式的计算默认是禁用的。解决方法:

1.设置整个项目使用el表达式,需要在web.xml中加上 (控制一个项目)
< jsp-config >
< jsp-property-group >
< el-ignored >false < / el-ignored >
< /jsp-property-group >
< / jsp-config >

2.设置某个jsp页面使用el表达式,需要在jsp页面加上(控制单个页面)
<%@ page isELIgnored="false"%>

 

 

假若您所用的Container 只支持Servlet 2.3/JSP 1.2,如:Tomcat 4.1.29,您就不能在
JSP 网页中直接使用EL,必须安装支持Servlet 2.4 / JSP 2.0 的Container。
 
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: