EL表达式和JSTL标签库
EL表达式
- EL表达式的作用
EL表达式的全称是Expression Language,即表达式语言。EL表达式主要代替jsp页面中的表达式脚本在jsp页面中进行数据的输出。因为EL表达式在输出数据的时候,要比jsp的表达式脚本简洁很多。
EL表达式的格式是:${表达式}
,EL表达式在输出null值的时候输出的是空串,jsp表达式脚本在输出null值的时候,输出的是null字符串 - EL表达式搜索域数据的顺序
EL表达式主要是在jsp页面中输出数据,而主要是输出域对象中保存的数据。当四个域中都有相同的key的数据的时候,EL表达式会按照四个域的从小到大的顺序去进行搜索,找到就输出。
<%
request.setAttribute("key","request");
session.setAttribute("key","session");
pageContext.setAttribute("key","pageContext");
application.setAttribute("key","application");
%>
${key}
- EL表达式输出Bean的普通属性、数组属性、List属性和Map属性
<body>
输出Bean对象:${对象名}
输出Bean的普通属性:${对象名.属性名}
输出Bean的数组属性:${对象名.数组名[index]}
输出Bean的List集合元素值:${对象名.List名}
输出Bean的Map集合个别元素值:${对象名.Map名.key值}
</body>
需要注意的是,输出Bean对象中的属性是通过属性的get方法查询的,因此属性和get方法需要相互对应
- EL表达式——运算
EL表达式支持关系运算,逻辑运算和算数运算,基础规则和java中的运算类似。语法为${运算表达式}
- 关系运算:
- 逻辑运算
- 算数运算
- empty运算
empty运算可以判断一个数据是否为空,如果为空则输出true,否则为false
${empty 值}
- 值为null时为空
- 值为空串时为空
- 值为Object类型的数组长度为0时为空
- 值为list集合或者map集合,元素为0时为空
- “.”点运算和[]中括号运算符
点运算可以用于输出Bean对象中某个属性的值;中括号运算可以输出有序集合中某个元素的值;并且中括号运算还可以输出map集合中key里含有特殊字符的key的值
- 关系运算:
//当map中含有以下状态的值时
Map<String , Object> map = new HashMap<>();
map.put("a.a.a" , 1);
map.put("b+b+b" , 2);
map.put("c-c-c" , 3);
request.satAttribute("map",map);
//因此在使用EL表达式时,不可能使用${requestScope.map.a.a.a}或者${requestScope.map.b+b+b}的形式去获取数据
${requestScope.map[a.a.a]}
${requestScope.map[b+b+b]}
${requestScope.map[c-c-c]}
- EL表达式的11个隐含对象
EL表达式中隐含有11个内置对象,这是EL表达式中自己定义的,可以直接使用- pageContext:他可以获取jsp中的九大内置对象
- pageScope:可以获取pageContext域中的数据
- requestScope:可以获取request域中的数据(获取的数据相当于request.getAttribute)
- sessionScope:可以获取Session域中的数据
- applicationScope:可以获取application域中的数据
- param:可以获取请求参数的值(这里相当于request.getParameter)
- paramValues:可以获取请求参数的值(多个值时使用)
- header:可以获取请求头的信息
- headerValues:可以获取请求头的信息(多个值时使用)
- cookie:可以获取当前请求的Cookie信息
- initParam:可以获取在web.xml中配置的
<context-param>
上下文参数
EL获取域中属性:${域对象名.key值}
,如${requestScope.key1}
pageContext对象的使用- 获取协议:
${pageContext.request.scheme}
- 获取服务器IP:
${pageContext.request.serverName}
- 获取服务器端口:
${pageContext.request.serverPort}
- 获取工程路径:
${pageContext.request.contextPath}
- 获取请求方法:
${pageContext.request.method}
- 获取客户端ip地址:
${pageContext.request.remoteHost}
- 获取会话的id编号:
${pageContext.session.id}
- 获取协议:
JSTL标签库
JSTL标签库全程是指JSP Standard Tag Library 。是一个不断完善的开放源代码的JSP标签库。主要是为了替换代码脚本,使得JSP页面更加简洁。
JSTL由五个不同功能的标签库组成:
其中由于避免在web层与数据库进行一些交互,sql库和x库已经很少推荐使用了,其中核心标签库(c库)是JSTL使用的核心。
在jsp标签库中使用taglib指令引入标签库:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
core核心库的使用
<c:set/>
,set标签用于向域中保存数据,如<c:set scope="session" var="abc" value="value"/>
<c:if></c:if>
,用于做if判断,test属性表示判断的条件,使用EL表达式输出,如:<c:if test="${12 == 12}"></c:if>
. <c:choose> <c:when> <c:otherwise>
,用于做多路判断,和java中的switch-case-default非常接近
<c:choose>
<c:when test=""></c:when>
<c:when test=""></c:when>
<c:otherwise test="">
<!-- 当然在这些分支中也可以嵌套多路判断标签 -->
<c:choose>
<c:when test=""></c:when>
<c:when test=""></c:when>
<c:otherwise test="">
<!-- 当然在这些分支中也可以嵌套多路判断标签 -->
</c:otherwise>
</c:choose>
</c:otherwise>
</c:choose>
<c:foreach/>
,用于遍历输出使用,可以用于遍历输出数组、List集合、Map集合等,使用Map集合为例说明
<%
Map<String,Object> map = new HashMap<String, Object>();
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");
request.setAttribute("map" , map);
%>
<c:foreach items="${requestScope.map}" var="item">
map的内容:${item.key} = ${item.value}
</c:foreach>