一、定义
JSTL(JSPStandard Tag Library,JSP标准标签库),由四个定制标记库(core、format、xml 和sql)和一对通用标记库验证器(ScriptFreeTLV 和 PermittedTaglibsTLV)组成。它实现了迭代和条件判断、数据管理格式化、XML操作以及数据库访问的功能。有了jstl标签库和el表达式,我们的jsp中不需要<%%>的java代码,提高了程序的可读性和可维护性。
EL(Expression Language)表达式:目的是为了使JSP写起来更加简单。
语法结构:${expression};
对象:pageScope、requestScope、sessionScope、applicationScope(访问顺序:page—request—session——application)
二、使用条件
以下列出jstl各个版本与jsp及servlet版本之间的依赖关系。
版本号 | JSTL版本 | 要求(必须满足此条件) | 获取Taglib途径 |
Standard 1.2 | JSTL 1.2(尚未经过JCP认证) | Servlet 2.5, JavaServer Pages 2.1 | subversion |
Standard 1.1 | JSTL 1.1 | Servlet 2.4, JavaServer Pages 2.0 | 下载 |
Standard 1.0 | JSTL 1.0 | Servlet 2.3, JavaServer Pages 1.2 | 下载 |
三、标签库
分享几个常用的标签库,记住要在jsp中引进这些标签库才能使用,如下:
//引进核心标签库core
<%@taglib uri="http://java.sun.com/jsp/jstl/core"prefix="c"%>
//引进日期标签库format
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt"prefix="fmt"%>
//引进函数标签库
<%@taglib uri="http://java.sun.com/jsp/jstl/functions"prefix="fn"%>
//注意,它必须放在el表达式中使用,格式 ${前缀+冒号+函数名称}
四、实践
新建servlet名jstlCoreServlet.java,存入几个对象:
//users
Group group = new Group();
group.setName("星星team");
List<User> users = new ArrayList<User>();
for (int i = 0; i < 10; i++) {
User user1 = new User();
user1.setUsername("星星" + i + "号");
user1.setAge(22 + i);
user1.setGroup(group);
users.add(user1);
}
request.setAttribute("users", users);
//map
Map map = new HashMap();
map.put("k1", "v1");
map.put("k2", "v2");
map.put("k3", "v3");
map.put("k4", "v4");
request.setAttribute("map", map);
//日期
request.setAttribute("today", new Date());
//数字
request.setAttribute("n", 12345678.123);
//forTokens
request.setAttribute("strtokens", "1#2#3#4#5");
//hello
request.setAttribute("hello", "HelloWord");
新建jsp名jstl_core.jsp,取出Servlet中的对象:
<li>循环控制标签forEach循环——采用标签库显示</li>
<br>
<table border="1">
<tr>
<td>姓名</td>
<td>年龄</td>
<td>所属组</td>
</tr>
<c:choose>
<c:when test="${empty users }">
<tr cosplan="3">没有请求到数据
</tr>
</c:when>
<c:otherwise>
<c:forEach items="${users }" var="user">
<tr>
<td>${user.username}</td>
<td>${user.age}</td>
<td>${user.group.name}</td>
</tr>
</c:forEach>
</c:otherwise>
</c:choose>
</table>
<li>forEach循环,varStatus</li><br>
<table border="1">
<tr>
<td>姓名</td>
<td>年龄</td>
<td>所属组</td>
</tr>
<c:choose>
<c:when test="${empty users }">
<tr>
<td colspan="3">没有找到数据</td>
</tr>
</c:when>
<c:otherwise>
<c:forEach items="${users}" var="user" varStatus="vs">
<c:choose>
<c:when test="${vs.count mod 2 == 0}">
<tr bgcolor="red">
</c:when>
<c:otherwise>
<tr>
</c:otherwise>
</c:choose>
<td>${user.username }</td>
<td>${user.age }</td>
<td>${user.group.name }</td>
</tr>
</c:forEach>
</c:otherwise>
</c:choose>
</table>
<li>forEach循环——begin,end,step</li>
<br>
<table border="1">
<tr>
<td>姓名</td>
<td>年龄</td>
<td>所属组</td>
</tr>
<c:choose>
<c:when test="${empty users }">
<tr cosplan="3">没有请求到数据
</tr>
</c:when>
<c:otherwise>
<c:forEach items="${users }" var="user" begin="2" end="8" step="2">
<tr>
<td>${user.username}</td>
<td>${user.age}</td>
<td>${user.group.name}</td>
</tr>
</c:forEach>
</c:otherwise>
</c:choose>
</table>
<li>forEach循环输出map</li><br>
<c:forEach items="${map }" var="entry">
${entry.key },${entry.value }<br>
</c:forEach>
<li>测试格式化日期</li> today(default):
<fmt:formatDate value="${today }" />
<br> today(date):
<fmt:formatDate value="${today }" type="date" />
<br> today(time):
<fmt:formatDate value="${today }" type="time" />
<br> today(both):
<fmt:formatDate value="${today }" type="both" />
<br>
<p>
<hr>
today(dateStyle="short"):
<fmt:formatDate value="${today }" dateStyle="short" />
<br> today(dateStyle="medium"):
<fmt:formatDate value="${today }" dateStyle="medium" />
<br> today(dateStyle="long"):
<fmt:formatDate value="${today }" dateStyle="long" />
<br> today(dateStyle="full"):
<fmt:formatDate value="${today }" dateStyle="full" />
<br>
<hr>
today(pattern="yyyy/MM/dd HH:mm:ss"):
<fmt:formatDate value="${today }" pattern="yyyy/MM/dd HH:mm:ss"
var="currentDate" />
<br> ${currentDate }
<br>
<p>
<li>测试格式化数字标签</li>
<br> number(default):
<fmt:formatNumber value="${n }"></fmt:formatNumber>
<br> n(pattern="###,###,###.####"):
<fmt:formatNumber value="${n}" pattern="###,###,###.####" />
<br> n(pattern="###,###,###.0000"):
<fmt:formatNumber value="${n}" pattern="###,###,###.0000" />
<br> n(groupingUsed="false"):
<fmt:formatNumber value="${n}" groupingUsed="false" />
<br>n(maxIntegerDigits="12" minIntegerDigits="10"):
<fmt:formatNumber value="${n}" maxIntegerDigits="12"
minIntegerDigits="10" />
<br> n(minFractionDigits="4" maxFractionDigits="6"):
<fmt:formatNumber value="${n}" minFractionDigits="4"
maxFractionDigits="6" />
<br>n(type="currency"):
<fmt:formatNumber value="${n}" type="currency" />
<br> n(type="currency" currencySymbol="$"):
<fmt:formatNumber value="${n}" type="currency" currencySymbol="$" />
<br>n(type="percent"):
<fmt:formatNumber value="${p}" type="percent" minFractionDigits="2"
maxFractionDigits="2" />
<br>
<li>循环控制标签forTokens</li><br>
<c:forTokens items="${strtokens }" delims="#" var="v">
${v }<br>
</c:forTokens>