以前写jsp的时候对jstl标签库是有些抵触的,因为我觉得嵌入java代码的方式几乎无往不利,没有必要使用标签库,不过这次复习还是好好地学习了一下,发现这个还是很有用处的,用得好能省不少事,JSTL是对el表达式的扩展,是一种标签语言,使用起来比较方便,他不属于jsp内置的标签,使用之前需要导包,以及指定标签库,在Myeclipse中,内置了jstl的jar包,所以不需要导包这个操作.
JSTL有四个标签库,常用的只有一个core,其他的几乎不怎么用,使用前首先要导入标签库,代码如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
下面介绍常用标签,因为使用的多为core库的标签,所以一般称为c标签:
示例:
<c:out value="aaa"/> 输出字符串aaa <c:out value="${aaa"/> 输出域属性aaa,其中与${aaa}相同 <c:out value="${aaa}" default="xxx"/> 如果${aaa}不存在,那么输出xxx字符串 <c:out value="${aaa}" escapeXml="true"/>如果${aaa}中包含特殊字符,那么转义它。这可以防止javascript攻击
例如:
<c:set var="name" value="zhangSan" scope="request"/> <% request.setAttribute("name"); %>
上下这两行代码作用是相同的,都是在request域中创建一个name属性,值为"zhangSan".
<c:remove var="a"/> 删除名为a的域属性 <c:remove var="a" scope="page"/> 删除page域中名为a的域属性
<c:url value="/AServlet"/> 输出URL:/项目名/AServlet <c:url value="/AServlet" var="url" scope="page"/> 把生成的url保存到page域中,而不会输出 <c:url value="/AServlet"> :输出URL:/项目名/AServlet?username=%xx%xx%xx%xx%xx%xx,其中张三会被URL编码 <c:param name="username" value="张三"/> </c:url/>
示例:
<c:set var="score" value="${param.score }"/> <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>
<c:forEach begin="1" end="10" var="i"> ${i} </c:forEach> 等同于 for(int i = 1; i <= 10; i++) { out.println(i); }
<% String[] str={"哎呦","不错","这个吊"}; request.setAttribute("array", str); %> <c:forEach items="${array }" var="i"> -->${i }<br> </c:forEach>
输出结果为:
-->哎呦
-->不错
-->这个吊
需要特别说明的是,forEach标签还有一个属性:varStatus,这个属性用来指定接收“循环状态”的变量名,例如:<forEach varStatus=”vs” …/>,这时就可以使用vs这个变量来获取循环的状态了,他有几个属性如下:
在上面的例子中,我们遍历了数组的所有元素,假如我们只想取出数组的第一个元素"哎呦",应该怎么办呢?
<c:forEach items="${array }" var="i" varStatus="index"> <c:if test="${index.first }"> --->${i } </c:if> </c:forEach>
这样输出结果就变成了:
--->哎哟