JSP 标准标记库( Standard Tag Library , JSTL)是实现Web应用程序中常见的通用功能的定制标签库集,程序员通过JSTL标签避免在JSP页面中使用脚本。
JSTL是一个标准的已制定好的标签库,它可以应用到很多领域. 如:基本输入输出、流程控制、循环、XML文件剖析、数据库查询及国际化和文字格式标准化的应用等。
JSTL所提供的标签库主要分为五类:
JSTL | 前置名称 | URI | 范例 |
核心标签库 | c | http://java.sun.com/jsp/jstl/core | <c:out> |
I18N格式标签库 | fmt | http://java.sun.com/jsp/jstl/fmt | <fmt:formatDate> |
SQL标签库 | sql | http://java.sun.com/jsp/jstl/sql | <sql:query> |
XML标签库 | xml | http://java.sun.com/jsp/jstl/xml | <x:forEach> |
函数标签库 | fn | http://java.sun.com/jsp/jstl/functions | <fn:split> |
配置 JSTL
包括两个 JAR 文件, jstl.jar 和 standard.jar 。
引入:
<%@ 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 相关的标签。
1.<c:out>
用于结果输出。类似于 JSP 中 <% %> 表达式,或者是 EL 中 ${ } 。
<c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"] />
注意:value属性为必填,escapeXml属性是true时,不解析特殊字符,false时,解析特殊字符。
eg:
default的两种使用方式
<c:out value="${info}" default="hello!"/> <c:out value="${info}">hello!</c:out>
如果在uri中传递了参数info的值,那么显示value接收的值,否则显示default默认值。
2.<c:set>
用于将变量存储至JSP范围内或JavaBean的属性中或Map对象中。
<c:set value="value" var="varName" [scope="{ page|request|session|application }"]/>
属性列表:
名称 |
说明 |
必须 |
默认值 |
value |
要被存储的值 |
否 |
无 |
var |
欲存入的变量名称 |
否 |
无 |
scope |
var变量的JSP范围 |
否 |
page |
target |
JavaBean或Map对象 |
否 |
无 |
property |
指定target对象的属性 |
否 |
无 |
eg:
将变量存储到Jsp范围内输出
<c:set var=”username” value=”iccccy” scope=”session”/> <c:set var="password" scope="session">123</c:set>
对比:
若通过el表达式输出
${sessionScope.username}
${sessionScope.password}
<c:out value="${sessionScope.username}"/>
<c:out value="${sessionScope.password}"/>
将变量存储到javaBean对象内输出
<jsp:useBean id="stu" class="school.student"/> <c:set value="22" target="${stu}" property="age"/>
输出javaBean对象的属性值
年龄:<c:out value="${stu.age}"/>
3.<c:remove>
相对 <c:set> 来移除范围变量。
<c:remove var="varName" [scope="{ page|request|session|application }"] />
eg:
<c:remove var=”username” scope=”session”/>
4.<c:catch>
用于捕获抛出的异常对象,并将异常信息保存到变量中。
<c:catch [var="varName"] >nested actions</c:catch>
可以抛出异常的代码放置到开始标签 :<c:catch> 和结束标签 :</c:catch> 之间。如果其中代码出现异常,异常对象将被捕获,保存在 var 声明的变量中,该变量总是有 page 范围。如果没有发生异常,而 var 所标识的范围变量将被移除。
如果没有指定 var 属性,异常只是简单的被捕获,异常信息不会被保存。
eg:
<c:catch var=”exception”> <% int i=5/0; %> </c:catch>
异常:<c:out value="${exception}"></c:out><br> 异常原因:<c:out value="${exception.cause}"></c:out><br> 异常消息:<c:out value="${exception.message}"></c:out><br>
后一句相当于: exception.getMessage()
条件标签包括 <c:if><c:choose><c:when><c:otherwise>
1.<c:if>
用作条件判断,功能类似于JSP中的<%if(boolean){}%>
<c:if test="testCondition" var="varName" [scope="{page|request|session|application}"]/>
eg:
<c:if test="${userName==null}" var="xx" scope="session"> 该用户没有登录</c:if> ${xx}
2.<c:choose>
<c:choose> 和 <c:when> 、<c:otherwise> 一起实现条件执行,类似于 java 中的 if else。
<c:when>、<c:otherwise>无法单独使用,只能作为<c:choose>的子标签来使用。
<c:when>有一个test属性,该属性的值为布尔型,如果test的值为true,则执行<c:when>标签体的内容。<c:otherwise>标签没有属性,它必须作为<c:choose>标签的最后分支出现。
eg :
<% request.setAttribute("age",18);%> <c:choose> <c:when test="${age>70}">老年人</c:when> <c:when test="${age<=70&&age>35}">中年人</c:when> <c:when test="${age<=35&&age>18}">青年</c:when> <c:when test="${age<=18&&age>0}">少年或儿童</c:when> <c:otherwise>输入错误</c:otherwise> </c:choose>
迭代标签
迭代标签有 <c:forEach> <c:forTokens>.
1、<c:forEach>
用于遍历一个对象集合。
<c:forEach var="变量名" items="集合" varStatus="遍历状态名" begin="begin" end="end" step="step" > 标签体 </c:forEach>
eg:
<c:forEach items="${mapInfos}" var="mapInfo"> <td>${mapInfo.key}</td> <td>${mapInfo.value.timestamp}</td> <td>${mapInfo.value.total}</td> <td>${mapInfo.value.used}</td> <td>${mapInfo.value.rate}</td> <td>${mapInfo.value.host}</td> </c:forEach>
也可以设定固定次数。
<c:forEach var =”i” begin=”100 “ end= “110”> ${i} </c:forEach>
如果再加个 step= “ 2 ”那么每次增长为 2 。
2、<c:forTokens>
用于遍历字符串,而且每次遍历结果返回字符串中的一个单词。
<c:forTokens items="字符串" delims="分界符" var="变量名" varStatus="遍历状态名" begin="begin" end="end" step="sep"> 标签体 </c:forTokens>
eg:
<c:forTokens items="zhangsan:lisi:wangwu" delims=":" var="name"> ${name} </c:forTokens>
URL相关的标签
1、<c:url>
有标签体:用于对URL地址进行编码
<c:url value="URL" context="路径" var="变量名" scope="作用域"> 标签体</c:url>
eg:
<c:url value="/index.jsp" var="strUrl" scope="request"> <c:param name="userName" value="张三"></c:param> <c:param name="age" value="22"/> </c:url> ${strUrl}
运行结果:http://localhost:8080/index.jsp?userName=张三&age=22
无标签体:用于编辑上下文URL。
<c:url value="URL" context="路径" var="变量名" scope="作用域"/> <c:url value="/logon.jsp">登录</c:url>
若当前路径为context=abc,则输出为:/abc/logon.jsp
2、<c:import>:
用于向当前JSP页面中引入URL资源。
它和JSP 动作指令的<jsp:include>最大的差别在于,include指令和include动作不能向JSP页引入Web程序以外的资源,引入的资源必须位于当前Web程序中。
以String对象引入:
<c:import url="地址" context="上下文路径" var="变量名" scope="作用域" charEncoding="字符集">标签体使用</c:import>
eg:
<c:import url="http://www.baidu.com" var="myurl" charEncoding="gb2312"> </c:import> <a href="${myurl }">地址</a>
<c:import url="地址" context="上下文路径" varReader="变量名" scope="作用域" charEncoding="字符集">标签体使用</c:import>
3、<c:redirect>
用于向用户的浏览器发送HTTP重定向响应,与javax.servlet.http.HttpServletResponse的sendRedirect()方法功能相当。
<c:redirect url="地址" context="上下文路径"/> <c:redirect url="/login.jsp"></c:redirect>
eg:
<c:redirect url="/login.jsp" context="/ch16"> <c:param name="name" value="张三"/> <c:param name="age" value=" 22 "/> </c:redirect>
4、<c:param>
用于为一个URL添加请求参数。
<c:param name="name" value="value">