EL表达式详细教程
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 |
${1+1<5 ? "呵呵" : "哈哈"}
<!-- 呵呵 -->本文的代码下载 请点这里
- 上一篇: php 下载完成后删除文件
- 下一篇: javaweb mysql实现分页功能
