JSTL (JSP 标准标签库)
在本JSTL教程中,我们将了解如何使用不同的JSTL标签可以使JSP编码更轻松。
Java中的JSTL是什么?
JSTL代表Java服务器页面标准标签库,它是一系列自定义JSP标签库,提供了常见的Web开发功能。JSTL是JSP的标准标签库。
JSTL的优点
以下是JSTL的优点
- 标准标签:它提供了JSP页面的丰富便携功能。开发人员很容易理解代码。
- 代码整洁:由于脚本会使开发人员感到困惑,因此使用JSTL可以使代码整洁。
- 自动JavaBeans内省支持:JSTL相对于JSP脚本具有优势。JSTL表达式语言可以轻松处理JavaBean代码。我们不需要对作为作用域属性检索的对象进行向下转换。使用JSP脚本代码会很复杂,而JSTL简化了此过程。
- 易于人类阅读:JSTL基于XML,与HTML非常相似。因此,开发人员很容易理解。
- 易于计算机理解:Dreamweaver和FrontPage等工具正在生成越来越多的HTML代码。HTML工具在格式化HTML代码方面做得很好。HTML代码与脚本代码混合在一起。由于JSTL被表达为XML兼容标签,因此HTML生成器很容易解析文档中的JSTL代码。
JSTL标签
核心标签是JSP中最常用的标签。它们提供对以下内容的支持:
- 迭代
- 条件逻辑
- 捕获异常
- url转发
- 重定向等。
要使用核心标签,我们需要先定义标签库,以下是包含标签库的语法。
语法
<%@ taglib prefix="c" uri=http://java.sun.com/jsp/jstl/core%>
此处,
- 前缀可用于定义所有核心标签,并且
- URI是导入它的taglib库
让我们详细看看一些核心标签,
1. Out
- 表达式的结果显示在out标签中
- 它可以直接转义XML标签。因此,它们不会被评估为实际标签
语法
<c:out value="" default="" escapeXML="">
- 其中value表示输出信息,是必需的
- default是输出信息失败,不是必需的
- escapeXML – 如果它转义XML字符,则为true。
示例
Coretag_jsp1.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!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=ISO-8859-1"> <title>Core Tag JSP1</title> </head> <body> </body> </html>
代码解释
代码第3行:所有标签都需要此taglib前缀,并且添加的前缀是“c”。因此,它可以作为所有核心标签的前缀。
代码第12行:这里我们使用前缀为“c”的核心标签out,这个out将打印表达式标签中的值。因此,输出将是name
当您执行上述代码时,您会得到以下输出
输出
- 我们从核心标签“out”中获取name值,它将打印在输出流中。
2. Catch
- 它会捕获主体中发生的任何可抛出异常并显示为输出。
- 它用于处理错误并捕获它们。
语法
<c:catchvar="">
其中var代表变量名,它将持有可抛出异常。
示例
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!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=ISO-8859-1"> <title>Core Tag JSP2</title> </head> <body> <c:catch var="guruException"> <% int num = 10/0; %> </c:catch> The Exception is : ${guruException} </body> </html>
代码解释
代码第3行:所有标签都需要此taglib前缀,并且添加的前缀是“c”,因此它可以作为所有核心标签的前缀。
代码第11-13行:核心标签catch用于捕获异常并打印异常。这里抛出的异常是10/0,该异常的名称是“guruException”。
代码第14行:我们打印“guruException”。
当您执行代码时,您将获得以下输出
输出
- 我们获得了算术异常“/ by zero”,并通过变量“guruException”打印在输出中。
3. Import
- 我们可以像在JSP include action中所做的那样,将另一个文件内容导入到JSP页面中。
- 在这里,我们也可以包含URL,内容将显示在该页面上。
语法
<c:importvar="" uri="">
这里var是一个标识符变量名,它将持有文件名/URI。uri是相对文件名或URI名称。
coretag_jsp31.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!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=ISO-8859-1"> <title>Core Tag JSP 31</title> </head> <body> <c:import var="displayfile" url="coretag_jsp32.jsp"> </c:import> <c:out value="${displayfile}"/> </body> </html>
Coretag_jsp32.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!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=ISO-8859-1"> <title>Insert title here</title> </head> <body> <a>The file is diplayed after importing</a> </body> </html>
代码解释
Coretag_jsp31.jsp
代码第3行:所有标签都需要此taglib前缀,并且添加的前缀是“c”,因此它可以作为所有核心标签的前缀。
代码第11-12行:这里我们使用import标签将coretag_jsp32.jsp文件导入到此文件中。
代码第13行:这里我们使用out标签打印coretag_jsp32.jsp文件。
当您执行上述代码时,您将获得以下输出。
输出
- coretag_jsp32已打印在输出中,因为该文件已导入到coretag_jsp31.jsp中。
4. forEach
- 它用于迭代一系列语句中的元素数量。
- 它与Java的for循环相同。
语法
<c:forEach var="" begin="" end="">
- 这里var代表变量名,它将持有计数器名称。
- begin代表计数器起始值。
- end将代表其结束值。
示例
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!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=ISO-8859-1"> <title>Core Tag JSP4</title> </head> <body> <c:forEach var="gurucount" begin="5" end="10"> <c:out value="${gurucount}"/> </c:forEach> </body> </html>
代码解释
代码第3行:所有标签都需要此taglib前缀,并且添加的前缀是“c”,因此它可以作为所有核心标签的前缀。
代码第11-13行:这里我们使用“forEach”循环,变量名为“gurucount”,计数从5开始到10结束。我们打印变量gurucount,它包含从5到10的数字。
当您执行代码时,您将获得以下输出。
输出
- 我们得到的输出是从5到10。
5. If
- 它用于测试条件。
- 如果标签用于测试条件是否为真,则基于此将执行代码块。
语法
<c:if test="${condition}></c:if>
如果条件为真,则执行一系列语句。
示例
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!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=ISO-8859-1"> <title>Core Tag JSP5</title> </head> <body> <c:set var="count" value="100"/> <c:if test="${count == 100}"> <c:out value="The count is 100"/> </c:if> </body> </html>
代码解释
代码第3行:所有标签都需要此taglib前缀,并且添加的前缀是“c”,因此它可以作为所有核心标签的前缀。
代码第11行:这里我们将变量设置为名为count,值为100。
代码第12-14行:这里我们使用“if条件”,检查count是否等于100。如果等于100,则输出为“The count is 100。”
当您执行上述代码时,您会得到以下输出
输出
- 由于“if”条件为真,我们得到的输出是“The count is 100”。
6. redirect
- 它用于通过提供此标签的相对URL来将当前页面重定向到另一个URL。
- 它支持上下文相对URL。
语法
<c:redirect url="" context=""/>
这里url是需要重定向到的相对URL,以及本地Web应用程序的上下文名称。
示例
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!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=ISO-8859-1"> <title>Core Tag JSP6</title> </head> <body> <c:redirect url="/"/> </body> </html>
代码解释
代码第3行:所有标签都需要此taglib前缀,并且添加的前缀是“c”,因此它可以作为所有核心标签的前缀。
代码第11行:这里我们使用“redirect标签”,指定了urlname,当我们点击该页面时,它会重定向到为redirect指定的站点。
当您执行上述代码时,您将获得以下输出;
输出
- 我们得到的输出是guru99.com URL,它由coretag_jsp6.jsp重定向。
JSTL自定义标签
- 它是一个用户定义的JSP语言元素。
- 当JSP被翻译成servlet时,自定义标签被转换成一个操作对象的类,称为标签处理器。
- 当servlet执行时,这些操作会被Web容器调用。
- 要创建用户定义的自定义标签,我们需要创建一个继承SimpleTagSupport的标签处理器,并必须重写doTag()方法。
- 我们需要创建TLD,其中需要将类文件映射到TLD。
JSP中自定义标签的优点
以下是JSP中自定义标签的优点。
- 可移植性:标签库中描述的操作必须可以在任何JSP容器中使用。
- 简单:不精通的用户必须能够理解和使用此机制。JSP功能供应商必须能够轻松地将其作为操作提供给用户。
- 表达性:该机制必须支持广泛的操作,包括嵌套操作、操作体内的脚本元素、脚本变量的创建、使用和更新。
- 可从不同的脚本语言使用:尽管JSP规范目前仅定义了Java编程语言脚本的语义,但我们希望为其他脚本语言留下可能性。
- 基于现有的概念和机制:我们不希望重新发明已有的东西。此外,只要我们能够预测,就希望避免未来的冲突。
语法
假设我们正在创建testGuru标签,并且可以使用taghandlertestTag类,它将重写doTag()方法。
<ex:testGuru/> Class testTag extends SimpleTagSupport{ public void doTag()}
此外,我们还需要将testTag类映射到TLD(标签库描述符),因为JSP容器会自动创建类文件与TLD中提到的URI之间的映射。
JSP标签接口
- 此类必须继承SimpleTagSupport类。
- 此类必须重写doTag()方法,该方法是SimpleTagSupport类的一部分(重写是从父类继承的方法)。
- 该接口是JSPTag接口的子接口。
- 它提供了在标签开始和结束时执行的方法。
- 此外,我们还需要将此类映射到TLD,即标签库描述符。
我们在下面的示例中考虑
标签接口的方法
- doTag()是我们必须重写的方法,其中包含标签的内容。
- 它使用getJSPContext()获取当前的JSP上下文。
示例
Customtag_jsp1.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%> <!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=ISO-8859-1"> <title>Custom Tag</title> </head> <body> <ex:guruTag/> </body> </html>
Custom.tld
<taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>Test TLD</short-name> <tag> <name>guruTag</name> <tag-class>demotest.guruTag</tag-class> <body-content>empty</body-content> </tag> </taglib>
guruTag.java(TagHandler)
package demotest; import javax.servlet.jsp.tagext.*; import javax.servlet.jsp.*; import java.io.*; public class guruTag extends SimpleTagSupport{ public void doTag() throws JspException,IOException { JspWriter out = getJspContext().getOut(); out.println("Guru Tag"); } }
代码解释
guruTag.java(TagHandler)
代码第6行:guruTag类继承了javax.servlet.JSP jar中的SimpleTagSupport类。
代码第7行:这里我们重写了doTag()方法,它抛出JspException和IOException。
代码第9-10行:在此方法中,将嵌入将要调用的自定义标签的代码。我们获取JspWriter对象,它将打印“Guru Tag”。
Custom.tld
代码第6行:这里自定义标签的名称是“guruTag”。
代码第7行:Tag类是taghandlerclass,即guruTag.java。它需要处理文件的完整路径,包括文件的位置目录路径。
Customtag_jsp1.jsp
代码第3行:所有标签都需要此taglib前缀,并且添加的前缀是“ex”,因此它可以作为所有核心标签的前缀,URI是custom.tld,它映射了标签处理器。
代码第11行:这里我们定义了自定义标签“guruTag”,它将调用处理器的doTag()方法,并且其中的代码将被执行。
当您执行上述代码时,您会得到以下输出
输出
- 我们从guruTag.java(即TagHandler)获得了“GuruTag”的输出,它重写了doTag()方法,并以“Guru Tag”作为输出。
摘要
- 在本节中,我们学习了JSP标准标签库,其中包含了核心标签和自定义标签。
- 核心标签包括for、if、redirect、import、catch标签,这些标签在JSP中用于基本目的。
- 此外,我们还学习了自定义标签,您可以在其中定义标签并在JSP中使用它们。