1、概念
JSP Standard Tag Library
JSP标准标签库
2、标签库的分类
c
核心标签库,还被称为c标签
fn
函数标签库,需要结合EL表达式使用。里面定义了一些对字符串的操作
fmt
格式化标签库,主要用来对日期、时间、数字等进行一些国际化的操作
标签库的使用
需要导入两个jar包:
taglibs-standard-impl-1.2.5.jar
taglibs-standard-spec-1.2.5.jar
同时需要在jsp页面中使用JSP的taglib指令标签,将标签库导入到jsp页面中
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Tips:prefix属性是用来声明在使用标签时的开头。
例如:
prefix=”tag”。则在使用标签库中的标签时,需要:
<tag:if test=""></tag:if>
prefix=”c”。则在使用标签库中的标签时,则需要:
<c:if test=""></c:if>
但是一般推荐不改
3、核心标签库
set
用来向域中设置属性值
<c:set var="" value="" scope=""></c:set>
⑴ var:要设置的属性值的key
对应setAttribute(key, value)中的key
⑵ value:要设置的属性值的value
⑶ scope:要放到哪个域中
可选值:page、request、session、application
如果不写该属性,则会默认放到page域中
remove
用来移除域中的属性值
<c:remove var="" scope=""></c:remove>
⑴ var:要移除的属性值的key
对应removeAttribute(key)中的key
⑵ scope:要移除哪个域中的属性值
如果不写该属性,则默认移除4个域中匹配到的属性值
if
用来判断【单重分支】,类似于Java中的if添加判断
<c:if test=""></c:if>
test:用来接收一个boolean类型的值,当它为true时,执行标签体中的内容
choose
用来判断【多重分支】,类似于Java中的if…else if…else
<c:choose></c:choose>
注意:
⑴ choose标签需要配合和来使用
其中是可选的,和if…else if…else中的else也是可选的,是一样的道理
⑵ when和otherwise标签不能单独使用,必须放在标签中,否则会报错:javax.servlet.jsp.JspTagException: Illegal use of <when>-style tag without <choose> as its direct parent
⑶ otherwise需要配合when标签来使用,否则报错:
org.apache.jasper.JasperException: <h3>Validation error messages from TagLibraryValidator for c in /a.jsp</h3><p>26: Illegal "choose" without child "when" tag</p>
⑷ 当when标签中有一个条件被满足,则之后其他的when标签都不会被执行。所以要注意多个when标签体的条件的顺序
forEach
用来遍历,类似于Java中的foreach【增强for循环】
指定开头和结尾遍历
<c:forEach begin="" end="" var=""></c:forEach>
① begin:设置遍历的开始,必须是大于0的整数,且要小于end的数值。可以等于0
② end:设置遍历的结束,必须是大于0的整数,且要大于being的数值
③ var:每一个遍历出来的结果都会保存到以var的值为key,每一个遍历的结果为value的属性值中,并放到page域中
注意:
⑴ begin和end缺一不可,否则在jsp页面写标签的时候就会报异常
⑵ begin和end都必须大于0,否则报错:
JspTagException: 'begin' < 0
或
JspTagException: 'end' < 0
⑶ 如果being的数值小于end的数值,则会没有效果
遍历数组或集合
<c:forEach items="" var=""></c:forEach>
① items:要遍历的数组或集合对象。可以是通过EL表达式获取到的
② var:遍历到的每一个结果放到page域中时的属性值,对应的key值
Tips:可以设置begin和end两个属性,即从指定的开始下标位置到指定的结束下标位置处,遍历。下标从0开始
使用示例
<%-- 默认放到page域中 --%>
<c:set var="key" value="value"></c:set>
page域:${pageScope.key}<br />
scope域:${requestScope.key}<br />
session域:${sessionScope.key}<br />
application域:${applicationScope.key}<br /><hr />
<%-- 放到指定域中 --%>
<c:set var="key2" value="pageVal" scope="page"></c:set>
<c:set var="key2" value="reqVal" scope="request"></c:set>
<c:set var="key2" value="sessionVal" scope="session"></c:set>
<c:set var="key2" value="appVal" scope="application"></c:set>
page域:${pageScope.key2}<br />
scope域:${requestScope.key2}<br />
session域:${sessionScope.key2}<br />
application域:${applicationScope.key2}<br /><hr />
<%-- 移除所有域中匹配到的属性值 --%>
<c:remove var="key2"/>
page域:${pageScope.key2}<br />
scope域:${requestScope.key2}<br />
session域:${sessionScope.key2}<br />
application域:${applicationScope.key2}<br /><hr />
<%-- 移除指定域中匹配到的属性值 --%>
<c:set var="key3" value="val3" scope="page"></c:set>
<c:set var="key3" value="val3" scope="request"></c:set>
<c:remove var="key3" scope="page"/>
page域:${pageScope.key3}<br />
scope域:${requestScope.key3}<br /><hr />
<%-- 单重分支判断 --%>
<c:if test="${empty pageScope.key3}">
<h1>page域中没有叫“key3”的属性值!</h1>
</c:if>
<%-- 多重分支判断 --%>
<c:choose>
<c:when test="${param.age>40}">大于40岁</c:when>
<c:when test="${param.age>30}">大于30岁</c:when>
<c:when test="${param.age>20}">大于20岁</c:when>
<c:when test="${param.age>10}">大于10岁</c:when>
<c:otherwise>小于10岁</c:otherwise>
</c:choose><hr />
<%-- 指定起止索引 --%>
<c:forEach begin="1" end="5" var="index">
<a href="">${index}</a>
</c:forEach><br /><br />
<%
List<Integer> nums = new ArrayList<Integer>();
nums.add(1);
nums.add(2);
nums.add(3);
nums.add(4);
nums.add(5);
pageContext.setAttribute("nums", nums);
%>
<%-- 遍历指定的集合 --%>
<c:forEach items="${nums}" var="num" >
${num}<br />
</c:forEach><br /><br />
<%-- 指定起止索引遍历 --%>
<c:forEach begin="1" end="3" items="${nums}" var="number">
${number}<br />
</c:forEach>