牛骨文教育服务平台(让学习变的简单)
博文笔记

EL表达式详细教程

创建时间:2015-02-05 投稿人: 浏览次数:2012

EL表达式(Expression Language),主要功能是用来获取数据并显示,也可做算术和逻辑运算,与传统的JSP标签相比,使用起来,更加方便,代码更加简洁,极力推荐使用,本文将逐一介绍EL表达式的各个功能,以及自定义EL表达式。


一、表达式基本语法

1、EL表达式语法规则

<%
	User user = new User();
	User parent = new User();
	user.setId(10001);
	user.setName("小耳朵");
	parent.setId(10002);
	parent.setName("大耳朵");
	List<String> list = new ArrayList<String>();
	list.add("打球");
	list.add("上网");
	user.setHobby(list);
	user.setParent(parent);
	request.setAttribute("user",user);
%>
注:下面的测试代码都是基于这些数据来进行的。

1、语法规则
${user.name}-${user["name"]}-${user["parent"].name}-${"常量"}
-${user.parent["name"]}-${user.hobby[0]}-${user["hobby"][1]}<br>
<!-- 小耳朵-小耳朵-大耳朵-常量 -大耳朵-打球-上网 -->

规则为:${表达式}

2、禁用、启用EL表达式

不同版本的JSP可能会不支持EL表达式,所以如果发现页面中的EL表达式没有作用,可以在文件顶部加上这行代码

<%@ page isELIgnored="false|false" %>
<!-- false:启用EL,true:禁用EL -->
这种方式只对单个页面起作用,若想禁用或启用所有JSP页面中的EL表达式,则可以在web.xml中加上这条配置,两个地方同时配置时,页面中的配置高于web.xml中的配置。

<jsp-config>
       <jsp-property-group>
              <url-pattern>*.jsp</url-pattern>
              <el-ignored>true</el-ignored>
       </jsp-property-group>
</jsp-config>
另外,若想单次禁用EL,可以在$前面加上转义字符即可

2、单次禁用EL
ID:${user.id} - 
Name:${user.name}<br>
<!-- ID:10001 - Name:${user.name} -->
3、与JSTL联合使用,遍历集合

3、联合JSTL遍历集合
<c:forEach items="${user.hobby}" var="hb">
	${hb}
</c:forEach><br>
<!-- 打球 上网 -->
对JSTL不熟悉的可以看我的另一篇博客 JSTL详细教程

二、表达式内置对象

EL表达式有11个内置对象,使用这些对象可以让我们取值更加精确,实现更多的功能。

对象 类型 说明
pageContext javax.servlet.ServletContext 此JSP的pageContext
pageScope java.util.Map 取得page范围的属性名称所对应的值
requestScope java.util.Map 取得request范围的属性名称所对应的值
sessionScope java.util.Map 取得session范围的属性名称所对应的值
applicationScope java.util.Map 取得application范围的属性名称所对应的值
param java.util.Map 与ServletRequest.getParameter(String name)相同
paramValues java.util.Map 与ServletRequest.getParameterValues(String name)相同
header java.util.Map 与ServletRequest.getHeader(String name)相同
headerValues java.util.Map 与ServletRequest.getHeaders(String name)相同
cookie java.util.Map 与HttpServletRequest.getCookies()相同
initParam java.util.Map 与ServletContext.getInitParameter(String name)相同

1、pageContext介绍

pageContext是PageContext类的实例,使用pageContext可以访问page、request、session、application范围的变量,从而可以获取请求的相关信息,下面是几个常用的pageContext表达式。

表达式 说明
${pageContext.request.queryString} 取得请求的参数字符串
${pageContext.request.requestURL} 取得请求的URL,但不包括请求之参数字符串,即servlet的HTTP地址。
${pageContext.request.contextPath} 服务的webapplication的名称
${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是否为新的,所谓新的session,表示刚由server产生而client尚未使用
${pageContext.session.id} 取得session的ID
${pageContext.servletContext.serverInfo} 取得主机端的服务信息
协议: ${pageContext.request.scheme} <br>
地址: ${pageContext.request.serverName} <br>
端口: ${pageContext.request.serverPort} <br>
服务名: ${pageContext.request.contextPath} <br>
<!-- 
协议: http 
地址: localhost 
端口: 8080 
服务名: /el
-->
2、四个scope范围介绍

它们基本上就和JSP的pageContext、request、session和application一样,不过在EL中,这四个对象只能用来取得范围属性值,即getAttribute(String name),不能取得其他相关信息。

<c:set var="p_var" value="page" scope="page"></c:set>
<c:set var="r_var" value="request" scope="request"></c:set>
<c:set var="s_var" value="session" scope="session"></c:set>
<c:set var="a_var" value="application" scope="application"></c:set>
${pageScope.p_var} -
${requestScope.r_var} -
${sessionScope.s_var} -
${applicationScope.a_var}
<!-- page - request - session - application -->

3、param和paramValues介绍

这两个对象是用来获取用户的请求参数,功能和request.getParameter(Stringname)request.getParameterValues (String name)类似。

<!-- href="2/param.jsp?key=value1&&key=value2"  -->
${param.key} - ${paramValues.key[0]} - ${paramValues.key[1]}
<!-- value1 - value1 - value2 -->
4、header和headerValues介绍

header 储存用户浏览器和服务端用来沟通的数据。
例:要取得用户浏览器的版本,可以使用${header["User-Agent"]},极端情况下,有可能同一标头名称拥有不同的值,此时必须改为使用headerValues 来取得这些值。

<c:forEach items="${header}" var="name">
	${name.key} - ${name.value}<br>			
</c:forEach>
<!--
cookie - JSESSIONID=15D2DA26722BB776757C32B9C503F118
cache-control - max-age=0
connection - keep-alive
accept-language - zh-CN,zh;q=0.8
host - localhost:8080
accept - text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
user-agent - Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.12 Safari/535.11
accept-encoding - gzip,deflate,sdch
referer - http://localhost:8080/el/
accept-charset - GBK,utf-8;q=0.7,*;q=0.3
-->
5、cookie介绍

这个很简单,就是从coodie文件中取值,前提是cookie文件中已经存有对应的key-value值。

<%
	Cookie cookie = new Cookie("name","zhangsan");
	response.addCookie(cookie);
%>
取得的cookie值:<br>
${cookie.name.value}
<!-- zhangsan -->
6、initParam介绍

获取web.xml中配置的初始化值。

<context-param>
	<param-name>userName</param-name>
	<param-value>zhangsan</param-value>
</context-param>
取得的web.xml中配置的值:<br>
${initParam.userName}
<!-- zhangsan -->


三、算术逻辑运算

1、算术运算

语法:${num1+num2},在做算术运算时,EL会自动转换数字类型,但是不支持数字+字母,字母+字母这种形式的运算。

加法:${1+1} - ${1.5+1.0} - ${-5 + 10}<!-- 2 - 2.5 - 5 --> <br>
减法:${1-1} - ${1.5-1.0} - ${-5 - 10}<!-- 0 - 0.5 - -15 --> <br>
乘法:${1*0} - ${1.5*1.0} - ${-5 * 10}<!-- 0 - 1.5 - -50 --> <br>
除法:${1/0} - ${1.5/1.0} - ${-5 / 10}<!-- Infinity - 1.5 - -0.5 --> <br>
求余:${1%1} - ${1.5%1.0} - ${-5 % 10}<!-- 0 - 0.5 - -5 --> <br>
2、逻辑运算

语法:${bo1 ><== bo2},表达式语言不仅可在数字与数字之间比较,还可在字符与字符之间比较,字符串的比较是根据其对应UNICODE值来比较大小的。

运算符 说明 例子 结果
>或gt 大于 ${1 > 2} false
<或lt 小于 ${"a"<"b"} true
==或eq 等于 ${1==1} true
!=或ne 不等于 ${1!=1} false
>=或ge 大于等于 ${1 >=2} false
<=或le 小于等于 ${1 <=2} true
&&或and 并且 ${true&&false} false
||或or 或者 ${true||false} true
!或not 相反 ${!true} false
empty 是否空 ${empty "aa"} false
3、三目运算符

${1+1<5 ? "呵呵" : "哈哈"}
<!-- 呵呵 -->

本文的代码下载 请点这里

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。