部分参考自:https://blog.csdn.net/qq_25827845/article/details/53311722
一、简介
JSTL是一个定制标签类库的集合,可以用于迭代或者集合,条件测试,数据库操作等。是EL表达式的扩展,与EL配合使用可以使JSP页面几乎没有Java代码。
二、使用
现在JSTL的版本为1.2,使用需要导入两个jar包,一个是jstl.jar,另外一个是standard.jar,放在lib目录下。
在使用jstl的页面用taglib指令使用指定类库,这里使用core库:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>。
prefix为标签的前缀,可以为任何内容,但是建议使用c,uri为指定标签库的uri地址。
三、JSTL标签库
JSTL总共有四大标签库,分别为:
core:核心标签库,主要内容。
fmt:格式化标签库,其中格式化数字和格式化时间较常用。
sql和xml基本不使用。
四、core类库:
1. out标签
(1) 格式:<c:out value="value" [escapeXml="true|false"] [default="defaultValue"] /> (下划线表示默认值)
value的值可以是任意字符,也可以是EL表达式,注意如果在EL表达式中也有双引号会报错,故EL表达式中要用单引号代替双引号。
escapeXml默认为true,表明value中结果字符<、>、&、‘、“将会被转换成相应的字符实体代码<等,这很重要,因为如果某个字符串中包含特殊字符且没有被转换,那么无法在客户端显示出来, 这就有可能会被js脚本攻击。
default可以设置一个默认值,如果value值为null,则返回默认值,如果默认值也为null,则返回一个空字符串
2. set标签
(1) 总共有四种格式,其中一二种类似,三四种类似,故以下介绍第一种和第三种:
<c:set var="varName" value="value" [scope="{page|request|session|application}"] />
value里可以是字符,也可以是EL表达式的值,scope为限域变量的作用范围。作用是创建一个名为varName的限域变量。
<c:set target="target" property="propertyName" value="value" />
target为要赋新值的限域对象,必须是JavaBean实例,property是target实例的属性,value是赋给具体的属性值。作用是设置已存在的限域对象的属性值。
3. remove标签
(1) 格式:<c:remove var="varName" [scope="{page|request|session|application}"] />
var值为要删除在范围scope的变量。
4. if 标签
(1) 格式:<c:if test="testCondition" [var="varName" scope="{page|request|session|application}"] />
test值要返回布尔值,故testCondition里可以是带有关系和empty运算符的EL表达式。var和scope要配合使用,var引用测试条件值的限域变量名称,类型为Boolean,利用scope属性来指定其作用范围。
5. choose、when、otherwise标签
相当于Java中的if...else if...else...以下用一个例子说明:
1 <c:set var="score" value="${param.score }"/> 2 <c:choose> 3 <c:when test="${score > 100 || score < 0}">错误的分数:${score }</c:when> 4 <c:when test="${score >= 90 }">A级</c:when> 5 <c:when test="${score >= 80 }">B级</c:when> 6 <c:when test="${score >= 70 }">C级</c:when> 7 <c:when test="${score >= 60 }">D级</c:when> 8 <c:otherwise>E级</c:otherwise> 9 </c:choose>
6. forEach标签
forEach标签是迭代动作指令,在JSP中十分常用。
(1) 遍历变量
1 <c:set var="sum" value="0" /> 2 <c:forEach var="i" begin="1" end="10" step ="2"> 3 <c:set var="sum" value="${sum + i}" /> 4 </c:forEach> 5 <c:out value="sum = ${sum }"/>
(2) 遍历数组:
1 <% 2 String[] names = {"zhangSan", "liSi", "wangWu", "zhaoLiu"}; 3 pageContext.setAttribute("ns", names); 4 %> 5 <c:forEach var="item" items="${ns}"> 6 <c:out value="name: ${item}"/><br/> 7 </c:forEach>
(3) 遍历集合
<% List<String> names = new ArrayList<String>(); names.add("zhangSan"); names.add("lisi"); pageContext.setAttribute("ns", names); %> <c:forEach var="item" items="${ns}"> <c:out value="name: ${item}"/><br/> </c:forEach>
(4) 遍历Map
1 <% 2 Map<String,String> stu = new HashMap<String,String>(); 3 stu.put("number", "N_1001"); 4 stu.put("name", "zhangSan"); 5 pageContext.setAttribute("stu", stu); 6 %> 7 <c:forEach var="item" items="${stu }"> 8 <c:out value="${item.key }: ${item.value }"/><br/> 9 </c:forEach>
(5) varStatus属性
这个属性是保存迭代状态的限域变量名称,可以获取循环状态,例如可以根据当前所在的行数来输出分隔符,最后一行不输出分隔符等等等。
count:int类型,当前以遍历元素的个数;
index:int类型,当前元素的下标;first:boolean类型,是否为第一个元素;
last:boolean类型,是否为最后一个元素;
current:Object类型,表示当前项目。
五、fmt类库
以下介绍常用的格式化时间和格式化数字的一般用法。
1. 格式化时间
1 <% 2 pageContext.setAttribute("date", new Date()); 3 %> 4 <fmt:formatDate value="${date}" pattern="yyyy-MM-dd HH:mm:ss"/>
2. 格式化数字
1 <% 2 double num = 4.1; 3 pageContext.setAttribute("num", num); 4 %> 5 <fmt:formatNumber value="${num }" pattern="0.00"/><br/> 6 <fmt:formatNumber value="${num }" pattern="#.##"/>