一、jstl标签简介
1、什么是jstl?
JSTL(JSP StandardTag Library),JSP标准标签库。JSTL是一种标签语言,但不是JSP内置的标签。分为:core、format、xml、sql四个定制的标签库,jstl通常结合EL语言一起使用,使用时候需要导入jstl的jar包。
2、jstl是用来干什么的?
jstl是程序员为了实现页面和代码分离,让前端设计与后端开发人员各自完成各自的任务,前端不需要懂后端Java传过来的参数。前端页面需要从后端获取数据使用jstl,后端返回数据给页面也需要jstl。使用jstl可以是页面美观,不需要在jsp中加入java代码,同时也提升了整个系统的速度。
二、使用jstl标签
1、jstl使用实例
(1)导入jar包
(2)引入核心库
在index.jsp头部引入核心标签库Core:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
接下来就可以使用<c:xxxxx>
标签了
(3)core常用标签
<c:out>
标签
<c:out>
输出变量字符串或者域属性
<!-- :输出字符串a -->
<c:out value="a"/> <br>
<!-- 输出域属性a,其中与${a}相同 -->
<c:out value="${a}"/> <br>
<!-- 如果${a}不存在,那么输出b字符串 -->
<c:out value="${a}" default="b"/><br>
<!-- 如果${a}中包含特殊字符,那么转义它。这可以防止javascript攻击 -->
<c:out value="${a}" escapeXml="true"/><br>
其中${a}
是不存在的,所以输出结果为:
a
b
<c:set>
标签
<c:set>
标签类似于servlet的setAttribute
,可以通过${var}
获得并输出。可以这样的理解,set其实就是声明一个变量var,给个初始值value。也可以理解成SQL中的set关键字。
<!-- 在pageContext添加name为a, value为helloworld的数据-->
<c:set var="Jian" value="helloworld"/>
<c:out value="${Jian} }"/><br/>
<!-- 在session中添加name为money,value为1500*2的数据。 -->
<c:set var="money" scope="session" value="${1500*2}"/>
<c:out value="${money}"/><br/>
输出结果为:
helloworld
3000
<c:forEach>
标签与<c:forTokens>
标签
c:forEach>
标签是用来循环的,主要有两个方面:
一是指定开始与结束值,进行循环,类似于for(int i=0:i<arr.length)
二是 用来循环遍历集合(List、Map等),类似于Java中的forEach用来遍历集合、数组等。
<c:forTokens>
标签通过指定分隔符将字符串分隔为一个数组然后迭代它们。
<!-- forEach循环变量 -->
</c:forEach>
<!-- 声明变量sum,初始值为0 -->
<c:set var="sum" value="0" />
<!-- i=i+1:间隔为1 -->
<c:forEach var="i" begin="1" end="10">
<c:set var="sum" value="${sum + i}" />
<c:out value="sum = ${sum}"/>
</c:forEach><br/>
<!-- 声明变量sum,初始值为0 -->
<c:set var="sum" value="0" />
<!-- i=i+2:间隔为2 -->
<c:forEach var="i" begin="1" end="10" step ="2">
<c:set var="sum" value="${sum + i}" />
<c:out value="sum = ${sum}"/>
</c:forEach>
输出结果为:
sum = 1 sum = 3 sum = 6 sum = 10 sum = 15 sum = 21 sum = 28 sum = 36 sum = 45 sum = 55
sum = 1 sum = 4 sum = 9 sum = 16 sum = 25 sum = 25
forEach遍历数组:
<%
String[] names = {"zhangSan", "liSi", "wangWu", "zhaoLiu"};
pageContext.setAttribute("name", names);
%>
<!-- forEach遍历数组 -->
<c:forEach var="item" items="${name}">
<c:out value="name: ${item }"/><br/>
</c:forEach>
输出结果为:
name:zhangSan
name:liSi
name:wangWu
name:zhaoLiu
forEach遍历List:
<!-- forEach遍历List -->
<%
List<String> names = new ArrayList<String>();
names.add("zhangSan");
names.add("liSi");
names.add("wangWu");
names.add("zhaoLiu");
pageContext.setAttribute("name", names);
%>
<c:forEach var="item" items="${name}">
<c:out value="name: ${item }"/><br/>
</c:forEach>
输出结果为:
name:zhangSan
name:liSi
name:wangWu
name:zhaoLiu
forEach遍历Map
<%
Map<String,String> student = new LinkedHashMap<String,String>();
stu.put("id", "001");
stu.put("name", "zhangSan");
stu.put("age", "22");
stu.put("sex", "boy");
pageContext.setAttribute("stu", student);
%>
<c:forEach var="item" items="${stu}">
<c:out value="${item.key }: ${item.value }"/><br/>
</c:forEach>
输出结果为:
id: 001
name: zhangSan
age: 22
sex: boy
此外,forEach还有个属性:varStatus,这个属性是存放循环过程中的状态。比如:我们可以利用varStatus变量判断循环中的变量是否为第一个,最后一个,遍历元素的个数等等。
- count:int类型,当前以遍历元素的个数;
- index:int类型,当前元素的下标;
- first:boolean类型,是否为第一个元素;
- last:boolean类型,是否为最后一个元素;
- current:Object类型,表示当前项目。
<c:forEach var="i" begin="1" end="10" varStatus="vs">
<c:set var="sum" value="${sum + i}" />
<c:if test="${vs.first }">第一行:</c:if>
<c:if test="${vs.last }">最后一行:</c:if>
<c:out value="第${vs.count }行: "/>
<c:out value="[${vs.index }]: "/>
<c:out value="name: ${vs.current }"/><br/>
<c:out value="sum = ${sum}"/><br/>
</c:forEach>
结果如下:
第一行: 第1行: [1]: name: 1 sum = 1
第2行: [2]: name: 2 sum = 3
第3行: [3]: name: 3 sum = 6
第4行: [4]: name: 4 sum = 10
第5行: [5]: name: 5 sum = 15
第6行: [6]: name: 6 sum = 21
第7行: [7]: name: 7 sum = 28
第8行: [8]: name: 8 sum = 36
第9行: [9]: name: 9 sum = 45
最后一行: 第10行: [10]: name: 10 sum = 55
<!-- forTokens将以","号为间隔delims条件循环迭代 -->
<c:forTokens items="google,baidu,taobao" delims="," var="name">
<c:out value="${name}"/><p>
</c:forTokens>
输出结果为:
google
baidu
taobao
<c:if>标签
类似于Java中的if条件判断,格式为<c:if test="condition">...</c:if>
<c:set var="number" value="5"></c:set>
<c:if test="${number > 2}">
<c:out value="number大于2"></c:out><br/>
</c:if>
<c:if test="${number < 2}">
<c:out value="number小于2"></c:out>
</c:if>
输出结果为:
number大于2
<c:choose>标签
类似于Java中的switch...case
,<c:when test>
就是case
,<c:otherwise>
就是defaut
,其实例如下:
<c:set var="score" value="81"/>
<c:choose>
<c:when test="${score > 100 || score < 0}">错误的分数:${score }</c:when>
<c:when test="${score >= 90 }">A级</c:when>
<c:when test="${score >= 80 }">B级</c:when>
<c:when test="${score >= 70 }">C级</c:when>
<c:when test="${score >= 60 }">D级</c:when>
<c:otherwise>E级</c:otherwise>
</c:choose>
输出结果为
B级
<c:remove>
标签
删除所在域(session、request、appliacation)与pageContext中name的数据
<%
//在域session/request/application/pageContext中添加name为a的数据
pageContext.setAttribute("a","pageContext");
request.setAttribute("a","request");
session.setAttribute("a","session");
application.setAttribute("a","application");
%>
<!-- 未指定,则默认为变量第一次出现的作用域-->
<%-- <c: remove var="a"/> --%>
<!-- 删除pageContext中的数据 -->
<c: remove var="a" scope="page" />
<c:out value="${a}" default="none"/>
<c:url>标签
<!-- 输出项目路径 :/项目名/-->
<c:url value="/"/><br/>
<!-- 将输出项目路径放入变量a中-->
<c:url value="/" var="a" scope="request"/>
<c:out value="${a}"/><br/>
<!-- 输出:/项目名/xxx -->
<c:url value="/xxx"/><br/>
<c:url value="/xxx">
<c:param name="username" value="abc"/>
<c:param name="password" value="123"/>
</c:url>
结果为:
/jstl_demo/
/jstl_demo/
/jstl_demo/xxx
/jstl_demo/xxx?username=abc&password=123