在上一篇博客EL表达式中,我们介绍了EL表达式的简单使用,但是在使用EL表达式的同时,一般都是结合JSTL来一起使用的,这篇文章我们就来介绍一下JSTL的背景,分类,其在程序中的使用!
背景
JSTL(JSP StandardTag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。JSTL只能运行在支持JSP1.2和Servlet2.3规范的及其以上容器上,如tomcat 7.x。在JSP 2.0中也是作为标准支持的。
JSTL 1.0 发布于 2002 年 6 月,由四个定制标记库(core、format、xml 和 sql)和一对通用标记库验证器(ScriptFreeTLV和 PermittedTaglibsTLV)组成。core 标记库提供了定制操作,通过限制了作用域的变量管理数据,以及执行页面内容的迭代和条件操作。它还提供了用来生成和操作 URL 的标记。顾名思义,format 标记库定义了用来格式化数据(尤其是数字和日期)的操作。它还支持使用本地化资源束进行 JSP 页面的国际化。
分类
JSTL 核心标签库(C标签)标签共有13个,功能上分为4类:
1.表达式控制标签:out、set、remove、catch
2.流程控制标签:if、choose、when、otherwise
3.循环标签:forEach、forTokens
4.URL操作标签:import、url、redirect
使用
如果我们要在程序中使用这些标签,首先我们要引入jar,这里我们要引入两个jar ,jstl-1.2.jar和standard-1.1.2.jar,然后将这两个jar放入到WEB-INF下的lib文件夹中。然后在我们的jsp页面上要引入<%@ tagliburi="http://java.sun.com/jsp/jstl/core" prefix="c"%> 这样我们就可以在jsp的页面上使用jstl了!
下边我们在代码中看一看这些标签的使用!
<span style="font-size:18px;"><%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ page import="java.util.*" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>Insert title here</title> </head> <body> <h1>测试JSTL核心库</h1> <hr> <li>采用c:out标签</li><br> hello(使用标签):<c:out value="123"/><br> hello(使用标签):<c:out value="hello"/><br> hello(使用标签):<c:out value="${hello}"/><br> hello(使用EL表达式):${hello }<br> hello(default):${hello123 }<br> hello(使用缺省值):<c:out value="${hello123}" default="没有值"/><br> hello(使用缺省值):<c:out value="${hello123}">没有值</c:out><br> welcome(使用EL表达式):${welcome }<br> welcome(使用标签,escapeXml=true):<c:out value="${welcome}" escapeXml="true"/><br> welcome(使用标签,escapeXml=false):<c:out value="${welcome}" escapeXml="false"/><br> <p> <li>测试c:set,c:remove</li><br> <c:set value="root" var="userid"/> userid:${userid }<br> <c:remove var="userid"/> userid:${userid }<br> <p> <li>条件控制标签:c:if</li><br> <c:if test="${v1 lt v2}"> v1小于v2<br> </c:if> <p> <li>条件控制标签:c:choose,c:when,c:otherwise</li><br> <c:choose> <c:when test="${v1 gt v2}"> v1大于v2<br> </c:when> <c:otherwise> v1小于v2<br> </c:otherwise> </c:choose> <c:choose> <c:when test="${empty userList}"> 没有符合条件的数据<br> </c:when> <c:otherwise> 存在用户数据<br> </c:otherwise> </c:choose> <p> <li>演示循环控制标签:forEach</li><br> <h3>采用jsp脚本显示</h3> <table border="1"> <tr> <td>用户名称</td> <td>年龄</td> <td>所属组</td> </tr> <% List userList = (List)request.getAttribute("users"); if (userList == null || userList.size() == 0) { %> <tr> <td colspan="3">没有符合条件的数据</td> </tr> <% }else { for (Iterator iter=userList.iterator(); iter.hasNext();) { com.tgb.jstl.User user = (com.tgb.jstl.User)iter.next(); %> <tr> <td><%=user.getUsername() %></td> <td><%=user.getAge() %></td> <td><%=user.getGroup().getName() %></td> </tr> <% } } %> </table> <h3>采用forEach标签</h3> <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"> <tr> <td>${user.username }</td> <td>${user.age }</td> <td>${user.group.name }</td> </tr> </c:forEach> </c:otherwise> </c:choose> </table> <h3>采用forEach标签,varstatus</h3><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> <h3>采用forEach标签,begin,end</h3> <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" 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> <p> <li>演示循环控制标签:forTokens</li><br> <c:forTokens items="${strTokens}" delims="#" var="v"> ${v }<br> </c:forTokens> <p> <li>c:catch标签</li><br> <% try { Integer.parseInt("asdfsdf"); }catch(NumberFormatException e) { e.printStackTrace(); out.println(e.getMessage()); } %> <p> <c:catch var="msg"> <% Integer.parseInt("asdfsdf"); %> </c:catch> ${msg }<br> <p> <li>c:import标签</li><br> <c:import url="http://localhost:8080/drp4.5/test_upload.html"/> <p> <li>c:url,c:param</li><br> <c:url value="http://localhost:8080/drp4.5/sysmgr/validate.jsp" var="u"> <c:param name="userId" value="zhangsan"/> <c:param name="age" value="20"/> </c:url> ${u }<br> <li>c:redirect</li><br> <c:redirect url="/login.jsp" context="/drp4.5"/> </body> </html></span>
通过上边写简单代码的使用,我们就可以很容易的知道他们该如何在我们的应用程序中使用了!