• 1. 第8章 EL表达式 EL全名为Expression Language,它原来是JSTL 1.0为了方便存取 数据所定义的语言。到了JSP 2.0以后,EL正式纳入成为标准规划之一 。EL表达式的引入可以通过表达式语言来简化数据存取的代码。只要是 支持Servlet 2.4/JSP2.0的Container,都可以在JSP网页中直接使用EL 。 通过本章的学习,读者应该能够完成如下几个目标。 熟练使用EL运算符 熟练掌握EL内置对象 熟练使用EL存取器
  • 2. 8.1 EL运算符 EL提供了多种运算符操作,比如算术运算符、关系运算符、逻辑运算符、验证运算符等。本节将对这些运算符进行详细的讲解。
  • 3. 8.1.1 算术运算符 通过EL提供算术运算符,开发者可以非常方便的在JSP页面进行算术操作。而且使用算术运算符和Java的算术运算符非常相视,开发者能很熟练的使用这些算术运算符来进行开发,从而简化了页面代码量。 常用的算术运算符有加、减、乘、除、求余,如下表所示。算术运算符说明示例结果+加${1 + 1}2-减${1 - 1}0*乘${1 * 2}2/或div除${3 / 2}1.5%或mod取余${3 % 2}1示例代码 ArithmeticDemo.jsp
  • 4. 8.1.2 关系运算符 关系运算符主要用来进行比较操作。EL提供了关系运算符,使开发者能很方便的在JSP页面进行比较操作。关系运算符说明示例结果= = 或 eq等于${1 = = 1}或${1 eq 1}true!= 或ne不等于${1 != 1}或${1 ne 1}false< 或 lt小于${1 < 2}或${1 lt 1}true> 或 gt大于${1 > 2}或${1 gt 1}false<= 或 le小于或者等于${1 <= 2}或${1 le 1}true>= 或 ge大于或者等于${1 >= 2}或${1 ge 1}false示例代码 RelationDemo.jsp
  • 5. 8.1.3 逻辑运算符 逻辑运算符主要用来进行逻辑操作,如:交集、并集、非。EL提供了关系运算符,使开发者能很方便的在JSP页面进行逻辑操作。需要注意的是运算符两边的表达式必须是布尔类型的。逻辑运算符说明示例结果&& 或 and交集${A && B}或${A and B}当A和B都为true时为true,其他情况为false|| 或 or并集${A || B}或${A or B}当A和B都为false时为false,其他情况为true! 或 not非${!A} 或${not A}当A为true时,为false 当A为false时,为true示例代码 LogicDemo.jsp
  • 6. 8.1.4 条件运算符 前面提到了大量的预算符,下面还将介绍一个可以节省大量代码的条件运算符。条件运算符的格式如下。 ${A ? B : C} 如果A为true时,执行B代码;而如果A为false时,则执行C代码。示例代码 ConditionDemo.jsp
  • 7. 8.1.5 验证运算符 EL提供了验证运算符empty,其对于验证数据特别有用。empty运算符采用单个表达式作为其变量即${empty input},并返回一个布尔值,该布尔值表示对表达式求值的结果是不是“空”值。求值结果为null的表达式被认为是空,如无元素的集合或数组。如果参数是对长度为零的String求值所得的结果,则empty 运算符也将返回 true。示例代码 ValidateDemo.jsp
  • 8. 8.1.6 括号运算符以及运算符的优先级 括号运算符主要用来改变运算的优先级,例如${(3+2)*8},执行结果为40。如果去掉括号,那么结果将为19。从而可以看出在括号中内容将会先执行。从 高 到 低从高到低[] , .()-(负) 、 not 、 ! 、 empty* 、 / 、 div 、 % 、 mod+ 、-(减)< 、 > 、 <= 、 >= 、 lt 、 gt 、 le 、 ge== 、 != 、 eq 、 ne&& 、 and|| 、 or${A ? B : C}示例代码 BlendDemo.jsp
  • 9. 8.2 EL内置对象 EL表达式非常简单,在前面已经介绍过EL的运算符。所有的EL表达式都是以“${”开始“}”为结尾的。如:“${applicationScope.user.userName}”。 如果按照以前的JSP Scriptlets的写法代码如下。 User user = (User)application.getAttribute(“user”); String username = user.getUserName();
  • 10. 8.2.1 .与[ ]运算符 EL通过.与[ ]运算符来存取数据。比如: ${applicationScope.user.userName} 等价于 ${applicationScope.user[“userName”] } .和[ ]也可以同时混合使用,如下: ${sessionScope.shoppingCart[0].price} 回传的结果为shoppingCart中第一项物品的价格。 接下来介绍两者的差异。
  • 11. 8.2.1 .与[ ]运算符(1)如果存取的属性名称包含一些特殊的符号,如“.”或者是“-”等非字母或数字的符号时,就必须使用[ ],例如。 applicationScope.user.usert-Name 这样写是错误的,必须使用[ ],代码如下。 applicationScope.user[“user-Name”] (2)如果使用变量来传入,那么也就只能使用[ ]。例如。 <%String data = “userName”;%> ${applicationScope.user[data]} 这样做的效果等于于上面代码。 ${applicationScope.user.userName}
  • 12. 8.2.2 与储存有关的内置对象 前面几章介绍了JSP中有内置对象,同样在EL中也有自己的隐含对象。 首先介绍4个与存储范围有关的隐含对象,分别是applicationScope、sessionScope、requestScope、pageScope。这些隐含对象使用时来和JSP中的pageContext,request,session,application一样。但是这四个隐含对象只能用来取得某个范围的属性值。即JSP中的getAttribute(String name),不能取得其他的信息。比如在JSP中request对象除了能够存取属性外,还可以用来接受参数和表头信息等。 (1)applicationScope对象,用来取得application范围属性值。 (2)sessionScope对象,用来取得session范围属性值。 (3)requestScope对象,用来取得request范围属性值。 (4)pageScope对象,用来取得page范围属性值。 如果不指定范围,如使用${name}。其意思是去取某一范围中名称为name的属性。因为并没有指定哪一个属性范围的name,所以它的默认值会从page范围内找,如果找不到,再依次到request、session、application范围中找。如果没有找到就返回null。在网页中也就没有显示。
  • 13. 8.2.3 与输入有关的内置对象 与输入有关的隐含对象有两个param和paramValues,用来取得用户的请求参数。在使用EL之前可以使用如下代码取得用户的请求参数。 request.getParameter(String name); request.getParameterValues(name); 在使用EL时则可以使用param和paramValues两者来取得用户请求参数。其中使用param接收的参数只有一个值,而如果参数有几个值,就必须使用paramValues来接受参数。示例代码 ParamDemo.jsp
  • 14. 8.2.4 cookie内置对象 下面来介绍EL其他的隐含对象cookie、header、headerValues、iniParam、pageContext。 cookie以key-value(键值对)的形式存储在浏览器的缓存区内。EL中 没有提供设定cookie的操作(这些操作一般都是后端开发者去做的),只能通过cookie对象设置cookie中的值。示例代码 AddCookieDemo.jsp GetCookieDemo.jsp
  • 15. 8.2.5 header内置对象 header储存用户浏览器和服务器用来沟通的数据。当用户浏览器请求服务器的页面时,会传送出一个记载信息的标头文件。而服务器端可以通过header或者headerValues来取得这些值。其中header用来取得同一标头名称只有一个值的信息,而headerValues用来取得同一标头名称拥有不同的值的信息。示例代码 GetHeaderDemo.jsp
  • 16. 8.2.6 initParam内置对象 initParam可以取得在web站点中设置的环境参数(context)值。包含所有初始化参数的Map。可以获取初始化参数。示例代码 InitParamDemo.jsp03 04 username 05 James 06
  • 17. 8.2.7 pageContext内置对象pageContext用来取得有关用户请求和页面的详细信息。取得请求的参数字符串 ${pageContext.request.queryString} 取得请求URL ${pageContext.request.requestURL} 取得web应用名称 ${pageContext.request.contextPath} 取得HTTP请求方式(GET or POST)pageContext.request.method} 取得使用的协议 ${pageContext.request.protocol} 取得用户IP地址 ${pageContext.request.remoteAddr} 判断session是否为新 ${pageContext.session.new} 取得sessionID ${pageContext.session.id}
  • 18. 8.3 EL存取器 使用EL存取器(也称作导航)可以访问JavaBean、Map、对象数组和List等中的数据。EL对数据的访问比使用Scriptlets有着代码量少,易维护的特点。 8.3.1 使用存取器读取JavaBean中的数据 8.3.2 使用存取器读取Map中的数据 8.3.3 使用存取器读取数组中的数据 8.3.4 存取器复杂应用
  • 19. 8.4 综合练习结合EL内置对象和EL算术表达式做一个简单的计算器程序。
  • 20. 8.5 小结 大多数读者学习完本章肯定会眼前一亮,发现在功能不减的同时代 码量明显减少,这就是EL的强大之处。EL表达式中最重点也是最难点 在于EL存取器,建议读者对照书中示例进行深入的学习。