EL表达式及其定义和使用 转
作者:http://blog.csdn.net/goskalrie/article/details/51315397
简介
EL(Expression Language)表达式语言实在JSP2.0版本中引入的新特性,它用于JSP文件中的数据访问。这种表达式语言能简化JSP文件中数据访问的代码,可用来代替传统的基于”<%=”和”%>”形式的Java表达式,以及部分基于“<%”heels“%>”形式的Java程序片段。
例如:
<%
ShoppingCart cart =(ShoppingCart)session.getAttribute(“cart”);
if(cart != null){
%>
<%=cart.getTotal()%>
<%} %>
上述代码等价于:
${sessionScope.cart.total}
基本语法
EL表达式的基本形势为:${var},所有的表达式都以”${”符号开头,以”}”符号结尾。如果在JSP文件的模版文件中使用EL表达式,那么表达式的值会输出到网页上。
例如以下Java表达式和El表达式的作用相同,都用于输出请求参数username:
Java表达式:<%=request.getParameter(“username”)%>
EL表达式:${param.username}
比较以上两种表达式的形式,可以看出,EL表达式使得JSP文件的穿件人员能用更加简单的语法来访问数据。
EL表达式和Java表达式一样,既可以直接插入到JSP文件的模版文件中,也可以作为JSP标签的属性的值:
<jsp:useBeanid=”myBean” scope=”page” class=”defaultPackage.CounterBean”/>
<jsp:setProerptyname=”myBean” property=”count” value=”${myBean.count+1}”/>
Current countvalue is :${myBean.count}
访问对象的属性及数组的元素
EL表达式语言可以使用点号运算符”.”来访问对象的属性,例如表达式${customer.name}表示customer对象的name属性。
EL表达式语言也可以使用方括号运算符”[]”来访问对象的属性,例如表达式${customer[“name”]}和${customer.name}是等价的。
方括号运算符”[]”还可以用来访问数组中的元素,例如${sustomers[0]}表示访问customers数组中的第一个元素。
EL语言的运算符
|
运算符类型 |
运算符 |
说明 |
范例 |
结果 |
|
算 术 运 算 符 |
+ |
加 |
${16+5} |
21 |
|
- |
减 |
${16-5} |
11 |
|
|
* |
乘 |
${16*5} |
80 |
|
|
/或div |
除 |
${16/5} |
3.2 |
|
|
%或mod |
模(求余) |
${16%5} |
1 |
|
|
关 系 运 算 符 |
==或eq |
等于 |
${16==5} |
false |
|
!=或ne |
不等于 |
${16!=5} |
true |
|
|
<或lt |
小于 |
${16<5} |
false |
|
|
>或gt |
大于 |
${16>5} |
true |
|
|
<=或le |
小于等于 |
${16<=5} |
false |
|
|
>=或ge |
大于等于 |
${16>=5} |
true |
|
|
逻辑 运算 符 |
&&或and |
逻辑与 |
${16>5&&16<18} |
true |
|
||或or |
逻辑或 |
${16>5||16<18} |
true |
|
|
!或not |
逻辑非 |
${!(16>5)} |
false |
|
|
empty运算符 |
empty |
检查是否为空值 |
${empty var} |
如果变量var为null,就返回true |
|
条件运算符 |
a?b:c |
条件运算符 |
${16>5?16:5} |
16 |
EL语言提供了一个用于测试对象是否为空的特殊运算符“empty“,其语法形式为${empty var},它能判断var变量(确切地说,应该是命名变量)是否为空。在以下情况下empty运算符返回true:
· var变量不存在,即没有定义。
· var变量的值为null。
· var变量引用集合(Set、List和Map)类型的对象,并且在i集合对象中不包含任何元素。
empty运算符可以与”!”运算符一起使用。
隐含对象
EL语言定义了11个隐含对象,他们都是java.util.Map类型。
EL表达式语言中的隐含对象
|
隐含对象的固定变量名 |
类型 |
说明 |
|
applicationScope |
java.util.Map |
把Web应用范围内的属性名和属性值进行映射 |
|
cookie |
java.util.Map |
把客户请求中的Cookie名和Cookie对象进行映射 |
|
header |
java.util.Map |
把HTTP请求头部的项目名和项目值进行映射 |
|
headerValues |
java.util.Map |
把HTTP请求头部的项目名和项目值的数组进行映射,例如${headerValues[“accept-language”]}等价于<%=request.getHeaders(“accept-laguage”)%> |
|
initParam |
java.util.Map |
把Web应用的初始化参数名和参数值进行映射 |
|
pageContext |
java.util.Map |
表示javax.servlet.jsp.PageContext对象 |
|
pageScope |
java.util.Map |
把页面范围内的属性名和属性值进行映射 |
|
param |
java.util.Map |
把客户请求中的请求参数名和参数值进行映射 |
|
paramValues |
java.util.Map |
把客户请求中的请求参数名和所有匹配的参数值数组进行映射 |
|
resquestScope |
java.util.Map |
把请求范围内的属性名和属性值进行映射 |
|
sessionScope |
java.util.Map |
把会话范围内的属性名和属性值进行映射 |
命名变量
EL表达式中的变量称为命名变量,它不是JSP文件中的局部变量或实例变量,而是存放在特定该范围内的属性,命名变量的名字和属性名字对应。例如${username}等价于以下代码:
<%
Stringusername=(String)pageContext.finAttribute(“username”);
if(username != null){
%>
<%=username%>
<%} %>
假如在Person类中并不存在username属性,而是提供了public类型的getUsername()方法:
public String getUsername(){
returnthis.lastName + “.” + this.firstName;
}
就可以通过${person.username}表达式获得person.getUsername()方法的返回值。
自定义和使用EL函数
EL表达式语言可以访问EL函数。EL函数实际上与Java类的方法对应,这个Java类必须定义为public类型,并且作为函数的方法必须声明为public static类型。当Java类定义好以后,应该在标签描述符(TLD)文件中,把Java类的方法映射为函数。
创建一个简单的工具类,定义静态方法localNowDate()方法,在页面中显示当前的本地时间。静态方法styleTable1()设置常用的表格样式,静态方法funcAlert()自定义简单的js方法,静态方法返回一个自定义的页面控件。
- public static String localNowDate(){
- Date date = new Date();
- String dateString = (1900+date.getYear()) + " 年 " + (date.getMonth() + 1) + " 月 " + date.getDate() + " 日 \n"
- +date.toLocaleString().substring(9);
- return dateString;
- }
- public static String styleTable1(){
- return "font-size:20px;color:#E91E63;background-color: #795548;";
- }
- public static String funcAlert(String content){
- System.out.println(content);
- return "alert('" + content +"')";
- }
- public static String myTable(){
- return "<table id='myTable' style='border-width:2px;border-style: solid;border-color:#795548;'>"
- + "<tr style='background-color:#666666;'><th>Head1</th><th>Head2</th></tr>"
- + "<tr><td>Element1</td><td>Element2</td></tr></table>";
- }
然后定义TLD文件:
- <?xml version="1.0" encoding="utf-8" ?>
- <taglib 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 web-jsptaglibrary_2_0.xsd"
- version="2.0">
- <tlib-version>1.0</tlib-version>
- <short-name>elDemo</short-name>
- <uri>elDemo</uri>
- <function>
- <description>show local now dateTime</description>
- <name>localNowDate</name>
- <function-class>dis.geo.demos.el.ELDemo</function-class>
- <function-signature>java.lang.String localNowDate()</function-signature>
- </function>
- <function>
- <description>styleTable1</description>
- <name>styleTable1</name>
- <function-class>dis.geo.demos.el.ELDemo</function-class>
- <function-signature>java.lang.String styleTable1()</function-signature>
- </function>
- <function>
- <description>styleTable1</description>
- <name>funcAlert</name>
- <function-class>dis.geo.demos.el.ELDemo</function-class>
- <function-signature>java.lang.String funcAlert(java.lang.String)</function-signature>
- </function>
- <function>
- <description>myTable</description>
- <name>myTable</name>
- <function-class>dis.geo.demos.el.ELDemo</function-class>
- <function-signature>java.lang.String myTable()</function-signature>
- </function>
- </taglib>
在web.xml文件中注册taglib:
- <taglib>
- <taglib-uri>/elDemo</taglib-uri>
- <taglib-location>fiels/elDemo.tld</taglib-location>
- </taglib>
在JSP文件中使用自定义的EL表达式:
- <%@ page language="java" contentType="text/html; charset=utf-8"
- pageEncoding="utf-8" isELIgnored="false"%>
- <%@ taglib prefix="me" uri="/elDemo" %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <title>MyELDemo</title>
- </head>
- <script type="text/javascript">
- </script>
- <body>
- <p>${me:localNowDate()}</p><br/>
- <table style="${me:styleTable1()}">
- <tr>
- <td>1.1</td>
- <td>1.2</td>
- <td>1.3</td>
- </tr>
- <tr>
- <td>2.1</td>
- <td>2.2</td>
- <td>2.3</td>
- </tr>
- <tr>
- <td>3.1</td>
- <td>3.2</td>
- <td>3.3</td>
- </tr>
- </table>
- <hr/>
- <a href="#" onclick="${me:funcAlert('Clicked me!!!')}">click me</a>
- <hr/>
- ${me:myTable() }
- </body>
- </html>
启动服务器,查看页面效果:
总结:
EL表达式的使用能够简化页面内容,提高代码的复用率,其可以完成类似于自定义JSP标签,CSS样式。假如有这样的一种情况,需要在页面中使用内联样式,而样式的内容又很多,这样页面中不仅有标签还有大量的内联样式,不免有些混乱,使用上面例子中的自定义EL就可以解决此类问题。
EL=Expression Language=Easy Language(简化语言)
EL表达式及其定义和使用 转的更多相关文章
- EL表达式具体解释
在 JSP 页面中,使用标签库取代传统的 Java 片段语言来实现页面的显示逻辑已经不是新技术了,然而.由自己定义标签非常easy造成反复定义和非标准的实现.鉴于此.出现了 JSTL ( JSP St ...
- EL表达式中的11个隐式对象
EL表达式中定义了11个隐式对象,使用这些隐式对象可以很方便地读取到Cookie.HTTP请求消息头字段.请求参数.Web应用程序中的初始化参数的信息,EL表达式中的隐式对象具体如下: 隐式对象 作用 ...
- 使用EL表达式需要注意的
1.表达式与Java无关,表达式都是以${开始,以}结束. 2.EL访问java变量不能直接访问,因为得不到数据,要访问数据,需要将其放到作用域中.而使用<%=java变量%>可以访问ja ...
- JavaWeb 之 EL表达式
EL 表达式 一.概述 1.概念 EL 表达式:Expression Language 表达式语言. 2.作用 替换和简化 jsp 页面中 java 代码的编写. 3.语法格式 ${表达式} 4.注意 ...
- (十一)El表达式详细介绍
看之前,最好先看下 el表达式快速入门 本来将重点讲下 el表达式 能干嘛 : 目录 执行计算 获得 web 开发常用对象 关于 param 与 paramValues 的用法: 关于 header ...
- (十)EL表达式和JSTL标签快速入门
目录 什么是 el 表达式 示例:使用EL表达式获取pageContext .request.session.application域中的数据: 示例:使用EL表达式获取Bean属性 获取当前WEB应 ...
- Java Web程序设计笔记 • 【第9章 EL表达式】
全部章节 >>>> 本章目录 9.1 EL 表达式基础 9.1.1 EL 表达式简介 9.1.2 EL 表达式的定义 9.1.3 使用 EL 访问变量 9.1.4 使用 E ...
- java web学习总结(三十一) -------------------EL表达式
一.EL表达式简介 EL 全名为Expression Language.EL主要作用: 1.获取数据 EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象.获取数 ...
- JavaWeb:EL表达式
JavaWeb:EL表达式 说明 1.Expression Language语言,一种用于JSP文件中的数据访问的语言. 2.能够简化JSP文件中该数据访问的代码,可用来替代传统的基于<%= % ...
随机推荐
- phpcms V9 首页模板文件解析(转)
转自:http://www.cnblogs.com/Braveliu/p/5100018.html 转在了解了<phpcms V9 URL访问解析>之后,我们已经知道首页最终执行的是con ...
- 京东电话面试——PHP开发
1.学过<数据结构>吗?你学过的计算机相关课程有哪些? 2.web操作中,当你输入一个url到看到页面,描述一下这中间发生了什么? 3.TCP/IP的请求方式都有哪些? 4.POST和GE ...
- MySQL在远程访问时非常慢的解决skip-name-resolve 并且出现 Reading from net
转载:http://www.itokit.com/2012/0515/73932.html 服务器放在局域网内进行测试时,数据库的访问速度还是很快.但当服务器放到外网后,数据库的访问速度就变得非常慢. ...
- eclipse中DDMS的LOGcat只有一列level
拷贝来源:http://www.cnblogs.com/kobe8/p/4620785.html http://stackoverflow.com/questions/25010393/eclipse ...
- MOS管体二极管的作用
这里有两种解释: 1.mos管本身自带有寄生二极管,作用是防止VDD过压的情况下,烧坏mos管,因为在过压对MOS管造成破坏之前,二极管先反向击穿,将大电流直接到地,从而避免MOS管被烧坏. 2.防止 ...
- HDU 1166 敌兵布阵 线段树的基本应用——动态区间和问题
题目: http://acm.hdu.edu.cn/showproblem.php?pid=1166 简单题,1A了,这个好像就是传说中的“点树”. 设当前结点表示线段[left, right],编号 ...
- Python的数字类型及其技巧
Python中的数字类型 int float fractions.Fraction decimal.Decimal 数字的舍与入 int(f):舍去小数部分,只保留整数部分,所以int(-3.8)的结 ...
- spring mvc 配置
之前配置spring mvc 怎么都访不到对应的jsp,后来把prefix里面的jsp改为views,就能访问到了,然后再改回jsp也可以访问到 搞了两天,都崩溃了,不管怎样先把没问题的例子给记录下来 ...
- uva 1335 - Beijing Guards
竟然用二分,真是想不到: 偶数的情况很容易想到:不过奇数的就难了: 奇数的情况下,一个从后向前拿,一个从前向后拿的分配方法实在太妙了! 注: 白书上的代码有一点点错误 代码: #include< ...
- 【Hihocoder 1167】 高等理论计算机科学 (树链的交,线段树或树状数组维护区间和)
[题意] 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 少女幽香这几天正在学习高等理论计算机科学,然而她什么也没有学会,非常痛苦.所以她出去晃了一晃,做起了一些没什么意 ...