EL表达式和JSTL标签
EL表达式
EL的概述
EL(Expression Language):目的是为了是jsp写起来更加简单。
EL表达式只能获取存在4个作用域中的数据。
EL获取对于null这样的数据,在页面中表现为空字符串。
- EL语法结构:${expression}
eg:
<!--JSP脚本写法-->
<%
pageContext.setAttribute("name","widsom");
String value = (String)pageContext.getAttribute("name") ;
out.print(value);
%>
<!--EL表达式写法-->
${name}
最终输出的都是:widsom
${name}的原理是pageContext.findAttribute(“name”);所以${}底层调用的就是pageContext.findAttribute()方法。
EL运算符
点运算符
<% User user = new User("widsom"); pageContext.setAttribute("user",user); %> ${user.name} 输出的是:widsom
${user.name},等价于user.getName()方法。点(.)运算符相当于调用getter(),点后面跟的是属性名。
属性导航:${user.city.name}
表示的是User对象调用getCity(),比如返回一个City对象,City对象调用getName()方法。然后输出。
[]运算符:点运算符能做的,它也可以,点不能做的,它也可以。
${user.name}等价于${user[‘name’]}或者${user[“name”]}
eg1:
<% List<String> list = new ArrayList(); list.add("111111"); list.add("222222"); list.add("333333"); pageContext.setAttribute("list",list); %> <%-- 这里我们不能采用点运算符,如:${list.1} ,而是使用[]运算符 --%> ${list[1]} 输出的是:222222
eg2:
<% Map<String,String> map = new HashMap(); map.put("a","aaaaaa"); map.put("b","bbbbbb"); map.put("c","cccccc"); pageContext.setAttribute("map",map); %> <!--这里的a代表的是map中的key--> ${map['a']} ${map["a"]} ${map.a} 三个输出的都是:aaaaaa 也就是说,这里点运算符和[]运算符作用是一样的。
empty运算符
判断null,空字符串和没有元素的集合,都返回true。
eg:
<% String str1 = null; pageContext.setAttribute("str1",str1); String str2 = ""; pageContext.setAttribute("str2",str2); String str3 = "123"; pageContext.setAttribute("str3",str3); List<String> list1 = new ArrayList(); pageContext.setAttribute("list1",list1); List<String> list2 = new ArrayList(); list2.add("123"); pageContext.setAttribute("list2",list2); %> ${empty str1} ${empty str2} ${empty str3} ${empty list1} ${empty list2} 输出的值为: true true false true false
三元运算符
如:
${empty list1 ? “列表没有数据” : “列表有数据”}eg:
<% pageContext.setAttribute("sex", 0); %> <input type="radio" name="sex" value="m" ${sex==0 ? "checked='checked'" : "" }/>男<br/> <input type="radio" name="sex" value="f" ${sex==1 ? "checked='checked'" : "" }/>女<br/> 我们切换pageContext.setAttribute()的值,刷新页面,就可以看到效果了。
EL隐式对象(11个)
如图所示:
其实这11个对象基本实现对请求消息的封装。
这里我们有几个需要注意的:
requestScope不是jsp中的request内置对象。
sessionScope不是jsp中的session内置对象。
applicationScope不是jsp中的application内置对象。
例如:我们要获取/应用名称
JSP语法:request.getContextPath();
在EL表达式:${pageContext.request.contextPath}
我们需要借助pageContext获取其他域对象调用。
JSTL
JSTL(JavaServerPages Standard Tag Library)
JSP标准标签库
JSTL的作用:使用JSTL实现JSP页面中逻辑处理。如判断、循环等。
JSTL的使用
- 在JSP页面添加taglib指令
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
- 使用JSTL标签
<!--表示if标签-->
<c:if test=""></c:if>
常用的标签介绍
核心标签库core:
通用标签
- set:设置变量
<c:set var="num" value="${10+5}" scope="page"></c:set>
- out:输出数据
<c:out value="${num}"></c:out><br/>
- remove:移除变更
<c:remove var="num" /><br/>
- set:设置变量
条件标签
if
<c:set var="num" value="5"></c:set> <c:if test="${num>3}"> 结果为true </c:if> <c:if test="${num<=3}"> 结果为false </c:if>
choose:相当于Java中的switch语句
<c:set var="num" value="5" /> <c:choose> <c:when test="${num==1}"> num==1 </c:when> <c:when test="${num==2}"> num==2 </c:when> <c:when test="${num==3}"> num==3 </c:when> <c:when test="${num==4}"> num==4 </c:when> <c:when test="${num==5}"> num==5 </c:when> <c:otherwise> num不在范围内 </c:otherwise> </c:choose>
迭代标签
forEach标签具有以下一些属性:
var:迭代参数的名称。在迭代体中可以使用的变量的名称,用来表示每一个迭代变量。类型为String。
items:要进行迭代的集合。对于它所支持的类型将在下面进行讲解。
varStatus:迭代变量的名称,用来表示迭代的状态,可以访问到迭代自身的信息。
begin:如果指定了items,那么迭代就从items[begin]开始进行迭代;如果没有指定items,那么就从begin开始迭代。它的类型为整数。
end:如果指定了items,那么就在items[end]结束迭代;如果没有指定items,那么就在end结束迭代。它的类型也为整数。
step:迭代的步长。
普通for循环
<c:forEach var="i" begin="0" end="10" step="1"> ${i} </c:forEach>
增强for循环
<% List<String> list = new ArrayList(); list.add("111111"); list.add("222222"); list.add("333333"); pageContext.setAttribute("list",list) %> <c:forEach items="${list}" vatStatus="str"> ${i} </c:forEach>
- varStatus:
varStatus这个属性会记录着遍历的元素的一些信息:
- getIndex():索引(从0开始)
- getCount():数量(从1开始)
- isFirst():是否是第一个元素
- isLast():是否是最后一个元素
<c:forEach items="${list} var="i" varStatus="str"> <tr> <td>${i}</td> <td>${str.index}</td> <td>${str.count}</td> <td>${str.first}</td> <td>${str.last}</td> </tr> </c:forEach>