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