JSP标准标记库(Standard Tag Library,JSTL)是一组以标准化格式实现许多通用的Web站点功能的定制标记。除了核心JSP标记,如jsp:include之外,定制标记库工具使您能够创建唯一的标记来描述以站点或应用程序为导向的操作。一旦您创建了定制标记库(简称taglib),当您扩展项目或转向另一个项目时您可以重复使用这些标记。您还可以将 taglib传递给其它开发人员,从而他们可以在自己的网站上使用,或者在您Web应用程序的其它部分使用。JSTL的目标是为了简化JSP页面的设计。对于页面设计人员来说,使用脚本语言(默认值是Java语言)操作动态数据是比较困难的,而采用标签和表达式语言相对容易一些,JSTL的使用为页面设计人员和程序开发人员的分工协作提供了便利。
一、配置JSTL
包括两个jar文件, jstl.jar和standard.jar。 原文引入:
1
2
3
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
二、core标签库
core标签库主要包括了一般用途的标签、条件标签、迭代标签和URL相关的标签。在JSP页面使用core标签要使用taglig指令,指定引用的标签库,如下:
1
<%@ taglib rui="http://java.sun.com/jsp/jstl/core" prefix="c" %>
一般用途的标签有:<c:out>
、<c:set>
、<c:remove>
、<c:cath>
条件标签包括:<c:if>
、<c:choose>
、<c:when>
、<c:otherwise>
迭代标签有:<c:forEach>
2.1 < c:out>
用于计算一个表达式并将结果输出。类似于JSP中<%=%>
表达式,或者是EL中${el-expression}
。
2.2 < c:set>
用于设置范围变量的值或者javabean对象的属性。看个实际例子:
1
<c:set var="username" value="lisi" scope="session"/>
这样就相当于设置了session 。
2.3 < c:remove>
相对<c:set>
其作用是移除范围变量。比如:
1
<c:remove var="nusername" scope="session"/>
2.4 < c:catch>
用于捕获在其中嵌套的操作所抛出的异常对象,并将异常信息保存到变量中。我们将有可能抛出异常的代码放置到开始标签<c:catch>
和结束标签</c:catch>
之间。如果其中代码出现异常,异常对象将被捕获,保存在var声明的变量中,该变量有page范围。如果没有发生异常,而var所标识的范围变量将被移除。如果没有指定var属性,异常只是简单的被捕获,异常信息并不会被保存。如下:
1
2
3
4
5
6
7
8
9
<c:catch var="exception">
<%
int i = 5;
int j = 0;
int k=i/j;
%>
</c:catch>
<c:out value="${exception}"/><br>
<c:out value="${exception.massage}"/>
后一句相当于exception.getMessage()
。
2.5 < c:if>
用于实现Java中的if语句功能。语法:
1
2
3
<c:if test="逻辑表达式"
var="代表逻辑表达式的值的命名变量的名字"
scope="{page|request|session|application}" / >
标签会把逻辑表达式的值存放在var属性指定的命名变量中,scope属性则指定命名变量的范围,scope属性的默认值是page(页面范围)。例如以下标签先判断username请求参数的值是否为Tom,然后把判断结果作为result命名变量存放在请求范围内:
1
2
<c:if test="${param.username=='Tom'}" var="result" scope="request" />
${result}
以上标签等价于以下Java程序片段:
1
2
3
4
5
6
7
8
<%
String username = request.getParameter("username");
if(username!=null && username.equals("Tom")) {
request.setAttribute("result", true);
} else {
request.setAttribute("result", false);
}
%>
2.6 < c:choose>
<c:choose>
和<c:when>
、<c:otherwise>
一起实现互斥条件执行,类似于Java中的if else
。<c:choose>
一般作为<c:when>
、<c:otherwise>
的父标签。比如:
1
2
3
4
5
6
7
8
9
10
11
<c:choose>
<c:when test="${row.v_money<10000}">
初学下海
</c:when>
<c:when test="${row.v_money>=10000&&row.v_money<20000}">
身手小试
</c:when>
<c:otherwise>
商业能手
</c:otherwise>
</c:choose>
2.7 < c:forEach>
遍历记录集
1
2
3
4
5
6
7
8
<c:forEach items="${finalResult.rows}" var="row">
<tr class="<%=tdClass[(rank+1)%2]%>">
<td align="center"><span><%=rank%></span></td>
<td align="center"><span><c:out value="${row.player_name}"/></span></td>
<td align="center"><span>¥<c:out value="${row.money}"/></span></td>
</tr>
<%rank++;%>
</c:forEach>
也可以设定固定次数
1
2
3
<c:forEach var ="i" begin="100" end="110">
${i}
</c:forEach>
如果再加个step="2"
那么每次增长为2。
三、fmt标签库
1
<fmt:formatNumber value="12.3" pattern=".000" />
将输出12.300,应用样式”.000”将使格式化后的小数部分有3位。不足3位将以0补齐。
1
<fmt:formatDate value="<%=new java.util.Date() %>" type="date" />
格式化的结果是:2007-5-27。
1
<fmt:formatDate value="<%=new java.util.Date() %>" type="time" />
格式化的结果是:9:25:11。
1
<fmt:formatDate value="<%=new java.util.Date() %>" type="both" />
格式化的结果是:2007-5-27 9:25:11。