JSTL标签
引入前提:当需要遍历输出时,JSP 脚本穿插,循环结构复杂
<table>
<tr>
<th>编号</th>
<th>姓名</th>
<th>成绩</th>
</tr>
<%
List<User> list=(List<User>) request.getAttribute("list");
for (User user:list){
request.setAttribute("user",user);
%>
<tr>
<td>${user.id}</td>
<td>${user.name}</td>
<td>${user.age}</td>
</tr>
<%
}
%>
</table>
1.基本概念
JSP Standard Tag Library JSP 标准标签库, JSP 为开发者提供的⼀系列的标签,使⽤这些标签可以完成⼀些逻辑处理,⽐如循环遍历集合,让代码更加简洁,不再出现 JSP 脚本穿插的情况。
实际开发中 EL 和 JSTL 结合起来使⽤, JSTL 侧重于逻辑处理, EL 负责展示数据。
JSTL 的使⽤
1、需要导⼊ jar 包(两个 jstl.jar 和 standard.jar)存放的位置 web/WEB-INF
2、右键项目,Open Mode Settings,Libraries,+,Java,添加jar包
3、在 JSP ⻚⾯开始的地⽅导⼊ JSTL 标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
“http://java.sun.com/jsp/jstl/core” 引入核心标签库
“ prefix=“c” ” 用 “c”表示,后面的方法必须是 <c:
<table>
<tr>
<th>编号</th>
<th>姓名</th>
<th>成绩</th>
</tr>
<%List<User> list=(List<User>) request.getAttribute("list");%>
<c:forEach items="${list}" var="user">
<tr>
<td>${user.id}</td>
<td>${user.name}</td>
<td>${user.score}</td>
</tr>
</c:forEach>
</table>
2.常用标签
JSTL 优点:
1、提供了统⼀的标签
2、可以⽤于编写各种动态功能
核⼼标签库常⽤标签:
set、 out、 remove、 catch
set:向域对象中添加数据
默认存到 page 里面,更改存放域用 scope="…"
用键值对方法存储,var 就是 key
<%--存到scope="application"--%>
<c:set var="name" value="haoqi" scope="application"></c:set>
${applicationScope.name}
<%--set 不能创建和存放属性,但能更改属性的值--%>
<%
User user = new User(1,"haoqi",19.0);
request.setAttribute("user",user);
%>
${user.name} //haoqi <hr/>
<%-- 修改目标user 当key == name时 将value="dapeng"--%>
<c:set target="${user}" property="name" value="dapeng"></c:set>
${user.name} //dapeng <hr/>
out:输出域对象中的数据
只有out里面的value需要EL表达式
<%--当value值为空时输出default里面的信息--%>
<c:out value="${name}" default="no name"></c:out> <hr/>
${name} <hr/>
remove: 删除域对象中的数据
<!--scope="page" 只删除page里面的-->
<c:remove var="name" scope="page"></c:remove>
<c:out value="${name}" default="未定义"></c:out>
cach:捕获异常
<!--当出现异常时,将异常信息存到定义的变量 error 里面,并输出-->
<c:catch var="error">
<%
int a = 10/0;
%>
</c:catch>
${error}
完整版
<body>
<c:set var="name" value="tom" scope="page"></c:set>
<!--当value为空时,输出 default里面的信息-->
<c:out value="${name}" default="未定义"></c:out>
<!--几乎等价-->
${name}
<!--scope="page" 只删除page里面的-->
<c:remove var="name" scope="page"></c:remove>
<c:out value="${name}" default="未定义"></c:out>
<!--当出现异常时,将异常信息存到定义的变量 error 里面,并输出-->
<c:catch var="error">
<%
int a=10/0;
%>
</c:catch>
${error}
</body>
3.其他标签
条件标签
if和choose
<body>
<c:set var="num1" value="1"></c:set>
<c:set var="num2" value="2"></c:set>
<!--只判断if时,使用这个-->
<!--判断语句写在test里面,用 EL表达式-->
<!--没有 eles ,写一个完全相反的条件判断自己实现else-->
<c:if test="${num1>num2}">yes</c:if>
<c:if test="${num1<num2}">no</c:if>
<hr>
<!--类似if-else时,用这个-->
<!--choose when otherwise 搭配使用-->
<c:choose>
<c:when test="${num1>num2}">yes</c:when>
<c:otherwise>no</c:otherwise>
</c:choose>
</body>
迭代标签
【最经常使用的一个】
forEach
begin/end:开始/结束的位置/下标,从0计数
strp:每次间隔 n 个输出
varStatus:记录用户的状态,有 sta.index (下标) 等方法
<body>
<%
List<String> list=new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
request.setAttribute("list",list);
%>
<c:forEach items="${list}" var="str" begin="0" end="4" step="2" varStatus="sta">
${sta.index}
${str}<br/>
</c:forEach>
</body>
输出结果:
0 a
2 c
4 e
格式化标签
引入:<%@ taglib prefix=“fmt” uri=“http://java.sun.com/jsp/jstl/fmt” %>
对日期和数字进行格式化
<body>
<%
request.setAttribute("date",new Date());
%>
${date} <!--Sat Mar 28 19:10:51 CST 2020-->
<fmt:formatDate value="${date}" pattern="yyyy-MM-dd HH:mm:ss"></fmt:formatDate>
${date} <!--2020-3-28 19:10:51-->
<!--以小数点为中心,maxIntegerDigits向左取整数位,maxFractionDigits向右取小数位-->
<fmt:formatNumber var="32145.23434" maxIntegerDigits="2" maxFractionDigits="3"></fmt:formatNumber>
<!--45.234-->
</body>
函数库标签
引入:<%@ taglib prefix=“fn” uri=“http://java.sun.com/jsp/jstl/functions” %>
底层就是Java里面的 函数,方法与String里面的方法类似
<body>
<%
request.setAttribute("info","JavaWeb");
%>
<!--判断字符串info 里面有没有 字符串We-->
${fn:contains(info,"We" )} <br>
<!--判断字符串info 是不是以 Ja 开头-->
${fn:startsWith(info,"Ja" )} <br>
<!--判断字符串info 是不是以 ab 结尾-->
${fn:endsWith(info, "eb")} <br>
<!--查找下标-->
${fn:indexOf(info, "va")} <br>
<!--截取-->
${fn:substring(info,2 ,3 )} <br>
<!--替换-->
${fn:replace(info,"W" ,"Haa" )} <br>
<!--分割,取第一/第二块-->
${fn:split(info, "H")[0]}-- ${fn:split(info, "H")[1]}
</body>
```v