EL表达式
EL表达式只能在 JSP 文件中写
Expression Language 表达式语言,替代 JSP 页面中数据访问时的复杂编码,可以非常便捷地取出域对象(pageContexe、request、session、application)中保存的数据,前提是一定要先 setAttribute ,EL就相当于在简化 getAttribute。
${变量名} 变量名就是 setAttribute 对应的 key 值。
<%
String name = (String) request.getAttribute("name");
%>
<%=name%>
<hr/>
${name}
EL表达式底层是 getAttribute
JSP中其实都是中间层的东西
-
EL 对于 4 种域对象的默认查找顺序:
pageContext —> request —> session —> application
按照上述的顺序进行查找,找到后立即返回,在 application 中也无法找到,则返回 null
-
指定作用域进行查找
pageContext:${pageScope.name}
request: ${requestScope.name}
sesssion: ${sessionScope.name}
application: ${applicationScope.name}
数据级联:
<% User user = new User(1,"张三",89); pageContext.setAttribute("User",user); %> 编号:${user.id} 姓名:${user.name} 成绩:${user.score}
JSTL
JSP Standard Tag Library JSP 标准标签库,JSP 为开发者提供的一系列的标签,使用这些标签可以完成一些逻辑处理,比如循环遍历集合,让代码更加简洁,不在出现 JSP 脚本穿插的情况。
实际开发中 EL 和 JSTlL 集合起来使用,JSTL 侧重于逻辑处理,EL 负责展示数据。
JSTL 的使用:
1、需要导入 jar 包(jstl.jar standard.jar)存放的位置 web/WEB-INF/lib
2、在 JSP 页面开始的地方导入 JSTL 标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
3、在需要得放使用
<table>
<tr>
<th>编号</th>
<th>姓名</th>
<th>成绩</th>
</tr>
<c:forEach items="${users}" var="user">
<tr>
<td>${user.id}</td>
<td>${user.name}</td>
<td>${user.score}</td>
</tr>
</c:forEach>
</table>
-
如果不用 JSTL 在 jsp 中循环遍历时的代码
<table> <tr> <th>编号</th> <th>姓名</th> <th>成绩</th> </tr> <% List<User> list = (List<User>) request.getAttribute("users"); for(User user : list){ request.setAttribute("user",user); %> <tr> <td>${user.id}</td> <td>${user.name}</td> <td>${user.score}</td> </tr> <% } %> <table>
我们可以看出需要频繁的 <% %>,且需要setAttribute,消耗内存,不方便,容易出错
JSTL 优点
- 提供了统一的标签
- 可以用于编写各种动态功能
核心标签库 常用标签
引入标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
set、out、remove、catch
-
set:向域对象中添加数据
替代的是:
<% request.setAttribute("name","tom"); %>
<c:set var="name" value="tom" scope="request"></c:set>
-
out:输出域对象中的数据
<!--和 EL 表达式功能相同--> <c:set var="name" value="tom" scope="request"></c:set> <c:out value="${name}" ></c:out> <!--比 EL 表达式多了一个功能:可以再找不到指定 key 时打印的不是 null 而是可以显示自定义的东西--> <c:out value="${age}" default="未定义" ></c:out>
-
remove:删除域对象中的数据
<c:set var="name" value="Allan" scope="request"></c:set> <c:out value="${name}" ></c:out> <c:remove var="name" scope="request"></c:remove> <c:out value="${name}" default="未定义" ></c:out>
-
catch:捕获异常,将最重要的错误信息存在 error 中
<c:catch var="error"> <% int a = 10/0; %> </c:catch> ${error}
条件标签:if、choose
<C:set var="num1" value="1"></C:set>
<C:set var="num2" value="2"></C:set>
<c:if test="${num1>num2}">fail</c:if>
<c:if test="${num1<num2}">ok</c:if>
<hr>
<c:choose>ch
<c:when test="${num1>num2}">fail</c:when>
<c:otherwise>ok</c:otherwise>
</c:choose>
迭代标签:forEach
<%
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
list.add("f");
request.setAttribute("list",list);
%>
<c:forEach items="${list}" var="str">
${str}<br/>
</c:forEach>
格式化标签库常用标签
引入标签库
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%
request.setAttribute("date",new Date());
%>
<fmt:formatDate value="${date}" pattern="yyyy-MM-dd HH:mm:ss"></fmt:formatDate>