< a href = “#1”>EL表达式
< a href = “#2”>EL表达式
EL表达式
- Experssion Language,是表达式语言
- EL表达式的作用主要是替代jsp页面中的脚本表达式,脚本在jsp页面中进行数据传输
- EL表达式在输出数据的时候,要比jsp的表达式脚本要简单的多
EL表达式使用
<%
request.setAttribute("key", "value");
%>
脚本表达式输出key对应的值为:<%= request.getAttribute("key") %> <br>
EL表达式输出key的值为:${key}
<%-- 区别:
第一个若key无对应的value则输出null
第二个key若无对应的value则输出空字符串--%>
EL表达式四个域的使用顺序
<%
pageContext.setAttribute("key", "1");
request.setAttribute("key", "2");
session.setAttribute("key", "3");
application.setAttribute("key", "4");
%>
${key}
当四个域中都有key的数据的时候,EL表达式会按照四个域中从小到大顺序取进行搜索,找到数据就输出
EL表达式输出复杂的bean对象
<%
Person person = new Person();
person.setName("国歌好帅");
person.setPhones(new String[]{"1234", "5678"});
List<String> cites = new ArrayList<>();
cites.add("北京");
cites.add("上海");
cites.add("深圳");
person.setCities(cites);
Map<String, Object> map = new HashMap<>();
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");
person.setMap(map);
pageContext.setAttribute("person", person);
%>
输出:${person}<br>
输出person的name属性:${person.name}<br>
输出list集合值:${person.cities.get(1)}<br>
输出list集合中的所有值:${person.cities}<br>
输出数组的属性值:${person.phones[1]}<br>
输出map集合:${person.map}<br>
输出map集合中某一值:${person.map.get("key1")}
关系运算、逻辑运算、算数运算
关系运算
${ 1 == 1} 或 ${1 eq 1}<br>
${ 1 != 1} 或 ${1 ne 1}<br>
${ 1 < 1} 或 ${1 lt 1}<br>
${ 1 > 1} 或 ${1 gt 1}<br>
${ 1 <= 1} 或 ${1 le 1}<br>
${ 1 >= 1} 或 ${1 ge 1}<br>
<hr>
逻辑运算
${12 == 12 && 12 > 11} 或 ${12 == 12 and 12 > 11}<br>
${12 == 12 || 12 > 11} 或 ${12 == 12 or 12 > 11}<br>
${!true} 或 ${not true}<br>
<hr>
算术运算
${ 12 + 12} <br>
${ 12 - 12} <br>
${ 12 * 12} <br>
${ 12 / 12} 或 ${12 div 12}<br>
${ 12 % 12} 或 ${12 mod 12}<br>
.运算和[]括号运算
- . 运算可以输出bean对象中属性的值
- []运算可以输出有序集合中某个元素的值 ,还可以输出map集合中带有特殊字符串key
<%
Map<String, Object> map = new HashMap<>();
map.put("a.a.a", "aaaValue");
map.put("b-b-b", "bbbValue");
request.setAttribute("map", map);
%>
<%--[]用来输出带有特殊字符的--%>
${map[a.a.a]}
EL表达式11个隐含对象
- EL获取四个特定域属性
<%
// empty 可以判断值是否为空
// 1、值为null时为空
request.setAttribute("key1", "value1");
// 2、值为空串的时候为空
request.setAttribute("key2", "value2");
// 3、值为Object类型数组长度为0
request.setAttribute("key3", "value3");
// 4、list集合,元素个数为0
List<String> list = new ArrayList<>();
request.setAttribute("emptyList", list);
// 5、map集合,元素个数为0
Map<String, Object> map = new HashMap<>();
request.setAttribute("emptyMap", map);
%>
${empty key1} <br>
${empty key2} <br>
${empty key3} <br>
${empty emptyList} <br>
${empty emptyMap} <br>
三元运算
${12 == 12 ? "小狗" : "小凹沟"}
- pageContext对象的使用
<%--
<%= request.getScheme() %> 获取请求的ip协议
<%= request.getServerName() %> 获取请求服务的的ip域名
<%= request.getServerPort() %> 获取请求服务器的端口号
<%= request.getContextPath() %> 获取当前工作路径
<%= request.getMethod() %> 获取请求方式(POST/GET)
<%= request.getRemoteHost() %> 获取客户端的ip地址
<%= session.getId() %> 获取会话id
--%>
1、协议:${pageContext.request.scheme} <br>
2、服务器ip:${pageContext.request.serverName} <br>
3、服务器端口:${pageContext.request.serverPort} <br>
4、获取工程路径:${pageContext.request.contextPath} <br>
5、获取请求方式:${pageContext.request.method} <br>
6、获取客户端ip地址:${pageContext.request.remoteHost} <br>
7、获取会话id编号:${pageContext.session.id} <br>
<hr>
<%--简化代码操作--%>
<%
pageContext.setAttribute("req", request);
%>
1、协议:${req.scheme} <br>
2、服务器ip:${req.serverName} <br>
3、服务器端口:${req.serverPort} <br>
4、获取工程路径:${req.contextPath} <br>
5、获取请求方式:${req.method} <br>
6、获取客户端ip地址:${req.remoteHost} <br>
7、获取会话id编号:${pageContext.session.id} <br>
- EL表达式其它隐含对象的使用
获取请求参数单个属性值:${ param.username } <br>
获取多个属性的某个值:${paramValues.hobby[0]} <br>
<hr>
获取请求头
${header['User-Agent']} <br>
获取多个请求头一个${headerValues['User-Agent'][0]} <br>
<hr>
获取Cookie的名称:${ cookie.JSESSIONID.name} <br>
获取Cookie的值:${ cookie.JSESSIONID.value } <br>
JSTL标签库
- JSTL标签库全称是指 JSP Standard Tag Library JSP标准的标签库
- EL表达式主要是为了替换jsp中的脚本表达式,而标签库则是为了替换脚本代码,这样使得整个jsp页面更加整洁
JSTL标签库使用步骤
- 先导入JSTL标签库jar包
- 使用taglib指令引入标签库
core核心库的使用
<%-- scope 属性表示设置到哪个域
page表示pageContext域
request表示Request域
session表示Session域
application表示ServletContext域
var设置属性值key为多少
value设置属性值--%>
保存之前:${requestScope.abc} <br>
<c:set scope="page" var="abc" value=""></c:set>
保存之后:${requestScope.abc} <br>
<hr>
<%--test属性表示判断的条件--%>
<c:if test="${12 == 12}">
<h1>12等于12</h1>
</c:if>
<hr>
<%--
多路选择,和switch标签作用类似
choose标签表示选择判断
when标签表示每一种判断情况
test标签表示当前这种判断情况
注意事项:
1、标签里不能使用html注释
2、when标签负标签一定时父标签
3、标签内部可以嵌套
--%>
<%
request.setAttribute("height", 179);
%>
<c:choose>
<c:when test="${requestScope.height > 170}">
<h1>小巨人</h1>
</c:when>
<c:when test="${requestScope.height < 18}">
<h1>小安人</h1>
</c:when>
<c:otherwise>
<h1>default</h1>
</c:otherwise>
</c:choose>
<%-- 遍历:
begin:设置属性开始的索引
end:设置属性结束的索引
var:表示循环的变量(也是当前正在遍历的数据)--%>
<c:forEach begin="1" end="10" var="i">
${ i }
</c:forEach>
<hr>
<%-- 遍历Object类型数组--%>
<%
request.setAttribute("arr", new String[]{"123", "345"});
%>
<c:forEach items="${ requestScope.arr }" var="item">
${item} <br>
</c:forEach>
遍历map集合
<%
Map<String, String> map = new HashMap<>();
map.put("1", "下流");
map.put("2", "小镇的");
request.setAttribute("map", map);
%>
<c:forEach items="${requestScope.map}" var="entry">
${entry} <br> <%--输出键值对--%>
${entry.key} <br>
${entry.value} <br>
</c:forEach>
<hr>
<%--遍历list集合,存储自定义类型数据--%>
<%
List<Student> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
list.add(new Student(i, "wzl", "123", 12, "haode"));
}
//将数据保存到域中
request.setAttribute("list", list);
%>
<c:forEach items="${requestScope.list}" var="stu">
${stu} <br>
</c:forEach>
<%--
优化案例:
begin:表示遍历的开始索引值
items:表示遍历的集合
var:表示遍历到的数据
end:表示结束的索引值
step:表示遍历的步长
--%>
<c:forEach begin="2" end="8" step="2" items="${requestScope.list}" var="stu">
${stu} <br>
</c:forEach>