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实现分页功能