一、定义
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>