JSTL标签
虽然JSTL叫做标准标签库,但实际它是由5个功能不同的标签组成。这5个标签分别是核心标签库、格式标签库、SQL标签库、XML标签库、函数标签库。在使用这些标签之前,必须在JSP页面的顶部使用<%@ taglib%>指令定义引用的标签库和访问前缀。
使用核心标签库的taglib指令格式如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core%>
使用格式标签库的taglib指令格式如下:
使用格式标签库的taglib指令格式如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/fmt"%>
使用SQL标签库的taglib指令格式如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/sql"%>
使用XML标签库的taglib指令格式如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/xml"%>
使用函数标签库的taglib指令格式如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/functions"%>
下面来介绍这五种标签:
(1)核心标签库
核心标签库主要用于完成JSP页面的常用功能,包括JSTL的表达式标签、URL标签、流程控制标签和循环标签共四种标签。其中,表达式标签包括<c:set>、<c:out>、<c:remove>、<c:catch>;URL标签包括<c:import>、<c:url>、<c:redirect>、<c:param>;流程控制标签包括<c:if>、<c:choose>、<c:when>、<c:otherwise>;循环标签包括<c:forEach>、<c:forTokens>。
核心标签库主要用于完成JSP页面的常用功能,包括JSTL的表达式标签、URL标签、流程控制标签和循环标签共四种标签。其中,表达式标签包括<c:set>、<c:out>、<c:remove>、<c:catch>;URL标签包括<c:import>、<c:url>、<c:redirect>、<c:param>;流程控制标签包括<c:if>、<c:choose>、<c:when>、<c:otherwise>;循环标签包括<c:forEach>、<c:forTokens>。
(2)格式标签库
格式标签库提供了一个简单的国际化标记,也被称为I18N标签库,用于处理和解决国际化相关的问题。另外,格式化标签库中还包含用于格式化数字和日期显示格式的标签。由于该标签在实际项目开发中并不经常使用,这里不详细介绍。
(3)SQL标签
SQL标签库提供了基本的访问数据库的能力。使用SQL标签,可以简化数据库的访问。如果结合核心标签库,可以方便的获取结果集,冰蝶带输出结果集中的数据。由于该标签在实际项目开发中并不经常使用,这里不详细介绍。
(4)XML标签库
XML标签库可以处理和生成XML的标记,使用这些标记可以很方便地开发基于XML的Web应用。由于该标签在实际项目开发中并不经常使用,这里不详细介绍。
(5)函数标签库
函数标签库提供了一系列字符串操作函数,用于完成分解字符串、连接字符串、返回字符串、确定字符串是否包含特定的子串等功能。由于该标签在实际项目开发中并不经常使用,这里不详细介绍。
二、表达式标签
在EL核心标签库中,包括了<c:out>标签、<c:set>标签、<c:remove>标签、<c:catch>标签等四种表达式标签。
1、<c:out>输出标签
<c:out>标签用于将表达式的只输出到JSP页面中,该标签类似于JSP表达式<%=表达式%>,或者EL表达式${expression}.<c:out>标签有两种语法,一种没有标签体,另一个有标签体。这两种语言的输出结果完全一样。<c:out>标签的具体语法格式如下:
<c:out value="expression" [escapeXml="true|false] [default="defaultValue"]/>没标签体
<c:out value="expression" [escapeXml="true|false"]>有标签体
defaultValue
</c:out>
参数说明:
value:用于指定要输出的变量或表达式。该属性的值类似于Object,可以使用EL。
escapeXml:可选属性,用于指定是否转换特殊字符,可以转换为特殊字符其属性值为true,否则为false,默认为true,表示转换。例如,将“>”转换为“>;”。
default:可选属性,用于指定当value属性值为null时,将要显示的默认值。
2、<c:set>变量设置标签
<c:set>用于在指定范围(page、request、session或application)中定义保存某个值的变量,或为指定的对象设置属性值。使用该标签可以在页面中定义变量,而不用在JSP页面中嵌入打乱HTML排版的Java代码。<c:set>标签有四种语法格式,分别介绍如下:
语法1:在Scope指定的范围内将变量值存储在变量中
<c:set var="name" value="value" [scope="范围"]>
语法2:在scope指定的范围内将标签体存储在变量中。
<c:set var="name" [scope|request|session|application"]>
标签体
</c:set>
语法3:将变量值存储在target属性指定的目标对象的propName属性中。
<c:set value="value" target="object" property="propName"/>
语法4:将标签体存储到target属性指定的目标对象的propName属性中。
<c:set target="object" property="propName">
标签体
</c:set>
3、<c:remove>变量移除标签
<c:remove>标签用于移除指定JSP范围内的标签,语法格式如下:
<c:remove var="name" [scope="范围"]/>
4、<c:catch>捕获异常标签
<c:catch>标签用于捕获程序中出现的异常,如果需要它还可以将异常信息保存在指定的变量中。该标签与Java语言中的try...catch语句类似。<c:catch>标签的语法格式如下:
<c:catch [var]"exception"]>
··· //可能存在的异常代码
</c:catch>
var:可选属性,用于指定存储异常信息的变量。如果不需要保存异常信息,可以省略该属性。
三、URL相关标签
文件导入、重定向和URL地址生成是Web应用常用的功能。JSTL中也提供了与URL相关的标签,分别是<c:import>、<c:url>、<c:redirect>和<c:param>.其中param与其他标签配合使用。
1、<c:import>导入标签
<c:import>标签可以导入站内或其它网站的静态和动态文件到Web页面中,例如,使用<c:import>标签导入其它网站的天气信息到自己的网页中。<c:import>标签和<jsp:include>动作指令类似,所不同的是<jsp:include>只能导入站内的资源,而<c:import>不仅可以导入站内的资源,还可以导入其它网站的资源。
语法1:
<c:import url="url" [context="context"][var="name"][scope="范围"][charEncoding="encoding"]>
[标签体]
</c:import>
语法2:
<c:import url="url" varReader="name" [context="context"][charEncoding="encoding"]>
[标签体]
</c:import>
参数说明:
url:被导入的文件资源路径URL地址
如果指定的url属性值为null、空或者无效,将抛出javax.servlet.ServletException异常。
var:用于指定变量名称。该变量用于以String类型存储获取的资源。
charEncoding:用于指定被导入文件的编码格式。
例子:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>应用<c:import>标签导入网站</title> </head> <body style="margin: 0px"> <c:set var="typeName" value="流行歌曲|经典老歌|热舞DJ|欧美金曲|少儿歌曲|轻音乐|最新上榜"/> <c:import url="navigation.jsp" charEncoding="UTF-8"> <c:param name="typeList" value="${typeName}"></c:param> </c:import> </body> </html>
<%request.setCharacterEncoding("UTF-8");%> <table width="901" height="128" border="0" align="center" cellpadding="0" cellspacing="0" background="/images/timg.jpg"> <tr> <td width="16" height="91" > </td> <td width="885"> </td> </tr> <tr> <td> </td> <td style="font-size: 11pt;color: #FFFFFF"><b>${param.typeList}</b></td> </tr> </table> </body> </html>2、<c:url>动态生成标签
<c:url>标签用于生成一个URL路径的字符串,这个生成的字符串可以赋予HTML的<a>标记实现URL连接,或者用这个生成的URL字符串实现网页转发与重定向等。在使用该标签生成的URL时,还可以与<c:param>标签结合动态添加URL的参数信息。<c:url>标签的语法格式有以下两种。
语法1:
<c:url value="url" [var="name"][scope="范围"][context="context"]/>
语法2:
<c:url value="url" var="name”[scope="范围"][context="context"]>
<c:param/>
</c:url>
该语法不仅实现语法1的功能,而且还可以搭配<c:param>标签完成带参数的复杂URL信息。
参数说明:
value:用于指定将要处理的URL地址,可以使用EL。
context:上下文路径,用于访问同一个服务器的其他Web工程,其值必须以“/”开头。如果指定了该属性,那么url属性值也必须要以“/”开头。
var:用于指定变量的名称,该变量用于保存新生成的URL字符串。
scope:用于指定变量的存在范围。
3、<c:redirect>重定向标签
<c:redirect>标签可以将客户端发出的request请求重定向到其他的URL服务器,由其他程序处理客户的请求。而在这期间可以对request请求中的属性进行修改或添加,然后把所有的属性传递到目标路径。该标签的语法格式有以下两种。
语法1:
<c:redirect url="url" [context="/context"]/>
语法2:
<c:redirect url="url"[context="/context"]>
<c:param/>
</c:redirect>
4、<c:param>传递参数标签
<c:param>标签只用于为其它标签提供参数信息,它与<c:import>、<c:redirect>、<c:url>标签组合即可实现动态定制参数,从而使标签可以完成更复杂的程序应用。<c:param>标签的语法如下:
<c:param name="paramName" value="paramValue"/>
应用<c:redirect>和<c:param>标签实现重定向页面并传递参数,如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>重定向页面并传递参数</title> </head> <body> <c:redirect url="register.jsp"> <c:param name="user" value="lyt"></c:param> </c:redirect> </body> </html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> </body> </html>
五、流程控制标签
流程控制在程序中会根据不同条件去执行不同的代码来产生不同的运行结果,使用流程控制可以处理程序中的任何可能发生的事情,在JSTL中包括<c:if>、<c:choose>、<c:when>和<c:otherwise>。
1、<c:if>条件判断标签
<c:if>条件判断标签可以根据不同的条件处理不同的业务。它与Java语言中的if语句类似,只不过该语句没有没有else标签,<c:if>标签由两种语法格式。
<c:if test="condition" var="name"[scope="page|request|session|application"/>
<c:if test="condition" var="name"[scope="范围"]>
标签体
</c:if>
参数说明:
test:用于指定条件表达式,可以使用EL
var:用于指定变量名,该变量用于保存test的判断结果。如果该变量不存在就创建它。
scope:用于指定变量的有效范围,默认值为page,可选值有request、session、application。
例子:
<html> <head> <title>根据是否登录显示不同的内容</title> </head> <body> <%request.setCharacterEncoding("UTF-8");%> <c:if test="${empty param.username}" var="result"> <form name="form1" action="" method="post"> 用户名: <input type="text" name="username" id="username"> <br> <br> <input type="submit" name="submit" value="登录"> </form> </c:if> <c:if test="${!result}"> [${param.username}]欢迎访问我公司网站! </c:if> </body> </html>2、<c:choose>条件选择标签
<c:choose>标签可以根据不同的条件完成指定的业务逻辑,如果没有符合的条件的就执行默认条件的业务逻辑。<c:choose>标签只能作为<c:when>和<c:otherwise>标签的父标签,而要实现条件选择逻辑,可以在<c:choose>标签中嵌套<c:when>和<c:otherwise>标签来完成。
<c:choose>标签的语法格式如下:
<c:choose>
<c:choose>
标签体 <!--由<c:when>标签和<c:otherwise>标签组成
</choose>
<c:choose>标签没有相关的属性,它只是作为<c:when>和<c:otherwise>标签的父标签来使用,并且在<c:choose>标签中,除了空白字符外,只能包括<c:when>和<c:otherwise>标签。
在一个<c:choose>标签中可以包含多个<c:when>标签来处理不同条件的业务逻辑,但是只能有一个<c:otherwise>标签来处理默认条件的业务逻辑。
3、<c:when>条件测试标签
<c:when>条件测试标签是<c:choose>的子标签,它会根据不同的条件执行相应的业务逻辑,可以存在多个<c:when>标签来处理不同条件的业务逻辑。<c:when>标签的语法格式如下:
<c:when test="condition">
标签体
</c:when>
test为条件表达式,这是<c:when>标签必须定义的属性,它可以引用EL表达式。
例子:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>实现分时问候</title> </head> <body> <c:set var="hours"> <%=new java.util.Date().getHours()%> </c:set> <c:set var="second"> <%=new java.util.Date().getMinutes()%> </c:set> <c:choose> <c:when test="${hours>1&&hours<6}">早上好!</c:when> <c:when test="${hours>6&&hours<11}">上午好!</c:when> <c:when test="${hours>11&&hours<17}">中午好!</c:when> <c:when test="${hours>17&&hours<24}">晚上好!</c:when> </c:choose> 现在的时间是:${hours}:${second} </body> </html>4、<c:otherwise>其他标签
<c:otherwise>标签也是<c:choose>的子标签,用于定义<c:choose>标签中的默认条件处理逻辑,如果没有任何一个结果满足<c:when>标签指定的条件,将会执行这个标签体中的逻辑代码。语法格式如下:
<c:otherwise>
标签体
</c:otherwise>
六、循环标签
循环标签式算法中的重要环节,有很多著名的算法都需要在循环中完成,例如递归算法、查询算法和排序算法都需要在循环中完成.JSTL标签中包含<c:forEach>和<c:forTokens>循环标签。
1、<c:forEach>循环标签
<c:forEach>循环标签可以根据循环条件,遍历数组和集合类中的所有或部分数据。如下:
<c:forEach items="data" [var="name"][begin="start"][end="finish"][step="step"][varStatus="statusName"]>
标签体
</c:forEach>
在该语法中,items是必选属性,通常使用EL指定,其他属性均为可选属性。
语法2:
<c:forEach begin="start" end="finish"[var="name"][varStatus="statusName"][step="step">
标签体
</c:forEach>
该语法中,begin和end属性是必选属性,其他属性均为可选属性。
参数说明:
items:用于指定被循环遍历的对象,多用于数组与集合类,可以通过EL进行指定。
var:用于指定循环体的变量名,该变量用于存储items指定的对象的成员。
begin:用于指定循环的起始位置,如果没有规定,则从集合的第一个值开始迭代。可以使用EL
end:用于指定循环的终止位置,如果没有规定,则一直迭代到集合的最后一位。可以使用EL.
step:用于指定循环的步长,可以使用EL。
varStatus:用于指定循环的状态变量,该属性还有4个状态属性。如下:
index:当前循环的索引值,从0开始。
count:当前循环计数,从一开始。
first:是否为第一次循环。
last:是否为最后一次循环。
例子如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page import="java.util.ArrayList" %> <%@ page import="java.util.List" %><%-- Created by IntelliJ IDEA. User: USER Date: 2018/1/11 Time: 15:49 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <% List<String> list=new ArrayList<>(); list.add("简单是可靠的先决条件"); list.add("兴趣是最好的老师!"); list.add("知识上的投资总能得到最好的回报"); request.setAttribute("list",list); %> <b>遍历List集合的全部元素</b><br> <c:forEach items="${requestScope.list}" var="keyword" varStatus="id"> ${id.index} ${keyword}<br> </c:forEach> <b>遍历List集合中第一个元素以后的元素(不包括第一个元素</b><br> <c:forEach items="${requestScope.list}" var="keyword" varStatus="id" begin="1"> ${id.index} ${keyword}<br> </c:forEach> </body> </html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>Title</title> </head> <body> <c:forEach var="i" begin="1" end="10" step="2"> ${i} </c:forEach> </body> </html>2、<c:forTokens>迭代标签
<c:forTokens>迭代标签可以用指定的分割符将一个字符窜分隔开,根据分割的数量确定循环的次数,语法如下:
<c:forTokens items="String" delims="char" [var="name"] [begin="start"][end="end"][step="len"][varStatus="statusName"]>
标签体
</c:forTokens>
参数说明:
items:用于指定要迭代的String对象,该字符串通常由指定的分隔符分割。
delims:用于分割字符串的分隔符,可以同时拥有多个分割符。
var:用于指定变量名,该变量保存了分割后的字符串。
begin:用于指定迭代开始的位置,索引值从0开始。
end:用于指定迭代的结束位置。
step:用于指定迭代的步长。
varStatus:用于指定循环的状态变量,同上面一样,该属性也有4个状态属性。